-2

2 つのボタンがあり、1 つのボタンをクリックすると、whileステートメントが開始されます。このwhileステートメントは、長いメロディーである音符を演奏します。ここで、ボタンがクリックされなくなったときに while ステートメントがすぐに停止し、メロディーが再生されないようにしたいと考えています。

現在、単純な while ステートメントがあります。試してみbreak;ましたが、解決しません。

4

1 に答える 1

1

while ステートメントに関するコードを投稿していません。あなたが説明していることから、それはあなたが単純であるように聞こえます:

  • マウスが押された場合、サウンドが再生され、更新されます (メロディーに基づいてノートが変更されるなど)。
  • それ以外の場合、サウンドはありません (更新なし、出力なし)

私の観点からは単純なif/elseので、サウンドの更新を切り替えるには、mousePressedmouseReleased(クリックは基本的にプレスとリリースのペアであるため) のようなマウスイベントに登録するだけです。私はサウンド/ノート/メロディーの専門家ではありませんが、Minim SineWaveSignal Processing サンプルの修正版を次に示します。

import ddf.minim.*;
import ddf.minim.signals.*;

Minim minim;
AudioOutput out;
SineWave sine;

float freq = 60;

void setup()
{
  size(512, 200, P2D);

  minim = new Minim(this);
  out = minim.getLineOut(Minim.STEREO);
  sine = new SineWave(440, 0.5, out.sampleRate());
  sine.portamento(200);
  sine.setAmp(0);
  out.addSignal(sine);
}

void draw()
{
  background(0);
  stroke(255);
  //update sound only if mouse is pressed
  if(mousePressed){
    freq += 10;//in this case I'm updating the frequency
    if(freq > 1500) freq = 60;//change melody according to time delays/etc. here
    sine.setFreq(freq);
  }
  // draw the waveforms
  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, 50 + out.left.get(i)*50, x2, 50 + out.left.get(i+1)*50);
    line(x1, 150 + out.right.get(i)*50, x2, 150 + out.right.get(i+1)*50);
  }
}
//updated sound "while" mouse is clicked (press+release)
void mousePressed(){
  sine.setAmp(.75);
}
void mouseReleased(){//reset, kill volume/amp and reset freq, in your case return to 1st note of melody for example
  freq = 60;
  sine.setAmp(0);
}

void stop()
{
  out.close();
  minim.stop();
  super.stop();
}
于 2012-11-18T22:02:48.627 に答える