0

ピッチが変化する正弦波を再生するプログラムを作成していますが、これまでに見たことのないものを扱っています。プログラムは220Hzから0Hzまでの正弦波を再生する必要があり、周波数が変化するのを確認できます。 220から0までですが、聞こえるのは220から0になり、その後220に戻る正弦波です。このコードでどのようにそれができるのかわかりません。

http://pastebin.com/HS36k7XJ(レイアウトがめちゃくちゃになっているため、ここに投稿する必要がありました)

(ここで、tは秒単位の時間、fは現在の周波数(適切に動作する単純な線形補間によって計算されます))

4

1 に答える 1

1

fゼロまで直線的に縮小します。これは、式t * Math.PI * 2もゼロに縮小されることを意味します。渡す値sin()は、最初は0(t = 0のため)から正の値(t>0およびf>0のため)になり、0に戻ります(f = 0のため)。

t * Math.PI * 2 * f時間の経過と頻度の値を見てみましょう。

  • t = 0では、値は0であり、速度220とともに増加します。
  • t = 0.5では、値は345であり、増加を停止します
  • t = 1で、値は再び0になり、速度-220で減少します。

t * Math.PI * 2fが掛けられ、fが小さくなっているため、方向が逆になっています。これは、tが1に近づくにつれて、式全体が小さくなることを意味します。

代わりにこのコードを試してください:

double ct = 0;
for (;;) {
      if(t>=1) break;
            //System.out.println(t+" "+e.getValueAt(t));
            for (int i = 0; i < buff.length; i++) {
                double f=lerp(fa,fb,t);
                buff[i] = (short) (Short.MAX_VALUE * 0.5 * Math.sin(Math.PI * 2 * ct));
                toSoundCard[2 * i] = (byte) buff[i];
                toSoundCard[2 * i + 1] = (byte) (buff[i] >> 8);   //(i know i could avoid doing this)
                t += 1.0 / 44100.0;
                ct += f / 44100.0;
            }
            speaker.write(toSoundCard, 0, toSoundCard.length);
        }
于 2013-01-30T17:32:07.870 に答える