我试图创建一个Processing应用程序,现在,它将根据按下的键来播放音符 - 将来我将用Arduino整数输入替换键。 当我只弹奏一个音符(正弦波)时,它听起来不错,但是当我演奏不止一个时,声音变得非常不稳定而且根本不像正在播放的音符组合。我该如何解决这个问题? 此外,我发现当我释放按键时,正弦波的中心位置与原始位置不同。为什么会这样?
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();
}
答案 0 :(得分:0)
可悲的是,当我发现这些问题并开始深入研究库时,我发现不太好的繁忙循环和/或部分在中断禁用的情况下持续时间过长。
该实现通常适用于某种&#34;演示&#34;模式,但当一个人试图以更严肃的方式使用它时,它会崩溃。
很可能你是同一场景的受害者。
我认为玩2波只会产生一些中间结果......
您拥有的选项是:
深入挖掘图书馆并查看/检查代码,找出花费大部分时间的地方 - 可能令人生畏,但教育程度很高
做自己的实现 - 与上述相同,更容易或更难,具体取决于您的编码技能以及对问题和底层实施的理解。