3

Scalaで音を出力してみました。私の問題は、毎秒短い「ノイズ」/「クリック」が発生することです。同様の Java プログラムでは、この問題は発生しませんでした。誰かが何が悪いのか考えていますか?

Scala 2.9.2 Java 1.6.0_31 OS X 10.7.3

import javax.sound.sampled._

object SinSoundMain extends App {
  val SAMPLE_RATE = 44100
  val SAMPLE_SIZE = 16
  val CHANNELS = 1
  val SIGNED = true
  val BIG_ENDIAN = true
  var format = new AudioFormat(SAMPLE_RATE, SAMPLE_SIZE, CHANNELS, SIGNED, BIG_ENDIAN)

  var info = new DataLine.Info(classOf[SourceDataLine], format);

  val auline = (AudioSystem.getLine(info)).asInstanceOf[SourceDataLine]
  auline.open(format)
  auline.start

  val start = System.currentTimeMillis()

  // play 10s
  while(System.currentTimeMillis() < (start + 10000)) {
    var index = 0

    // output blocks of 10000 samples
    var samples = 0.until(10000).map {x =>  math.sin((x+index) * 800.0 / 44100 * math.Pi)}

    // convert samples to Byte Array
    var byteSamples:Array[Byte] = samples.flatMap{ s => 
      val ss = (s * Short.MaxValue).toShort
      List((ss >> 8).toByte, (ss & 0xFF).toByte)
    }.toArray

    auline.write(byteSamples, 0, byteSamples.length)
  }

  // cleanup      
  auline.drain
  auline.close
}
4

1 に答える 1

2

コードのエラーはvar index = 0、while ループの開始前にある必要がindex += 10000あり、ループの最後 (内側) にある必要があります。これを行うと、うまく聞こえます。

于 2012-05-16T21:22:35.007 に答える