0

現在、押されたキーに応じて音を鳴らす処理アプリケーションを作成しようとしています。将来的には、キーを Arduino 整数入力に置き換えます。1 つのノート (正弦波) だけを再生すると、問題なく聞こえますが、複数のノートを再生すると、サウンドが途切れ途切れになり、再生されているノートの組み合わせとはまったく異なります。この問題を解決するにはどうすればよいですか?また、キーを放すと、正弦波が元の位置とは異なる位置に集中することがわかりました。なぜでしょうか?

    import ddf.minim.*;
import ddf.minim.signals.*;
import ddf.minim.ugens.*;
import processing.serial.*;

Minim minim;
AudioOutput out;
SineWave sinea;
SineWave sineb;
SineWave sinec;

void setup()
{
  size(displayWidth, displayHeight, P3D);

  minim = new Minim(this);
  out = minim.getLineOut(Minim.MONO);
  sinea = new SineWave(440.00,1,out.sampleRate());
  sineb = new SineWave(493.88,1,out.sampleRate());
  sinec = new SineWave(523.25,1,out.sampleRate());
  sinea.portamento(200);
  sineb.portamento(200);
  sinec.portamento(200);
  out.addSignal(sinea);
  out.addSignal(sineb);
  out.addSignal(sinec);
  sinea.setFreq(0);
  sineb.setFreq(0);
  sinec.setFreq(0);
  smooth();
  stroke(255);
  strokeWeight(3);
}

void draw() {
  background(0);
  for(int i = 0; i < out.bufferSize() - 1; i++)
  {
    float x1 = map(i, 0, out.bufferSize(), 0, width);
    float x2 = map(i+1, 0, out.bufferSize(), 0, width);
    line(x1, height/2 + out.right.get(i)*100, x2, height/2 + out.mix.get(i+1)*100);
  }
}


void keyPressed() {
  switch (key) {
    case 'a':
      sinea.setFreq(440);
      break;
    case 'b':
      sineb.setFreq(493.88);
      break;
    case'c':
      sinec.setFreq(523.25);
      break;
  }
}

void keyReleased() {
  switch (key) {
    case 'a':
      sinea.setFreq(0);
      break;
    case 'b':
      sineb.setFreq(0);
      break;
    case'c':
      sinec.setFreq(0);
      break;
  }
}

void stop() {
  out.close();
  minim.stop();
  super.stop();
}
4

1 に答える 1

0

悲しいことに、この種の問題を見つけてライブラリを掘り下げ始めると、あまり良くないビジー ループや割り込みが無効になっているセクションが長すぎることに気付きます。

実装は通常、一種の「デモ」モードで動作しますが、より本格的な方法で実際に使用しようとすると崩壊します。

ほとんどの場合、あなたは同じシナリオの犠牲者です。

2 つのウェーブをプ​​レイしても、中間的な結果しか得られないと思います...

オプションは次のとおりです。

  • ライブラリを掘り下げてコードをプロファイリング/検査し、ほとんどの時間が費やされている場所を見つけます - 気が遠くなるかもしれませんが、非常に教育的です

  • 独自の実装を行います - 上記と同じですが、コーディングのスキルと、問題と根底にある実装の理解に応じて、より簡単またはより難しくなります。

于 2015-03-12T18:36:15.847 に答える