If statement 处理中同时发生的if/else事件

If statement 处理中同时发生的if/else事件,if-statement,processing,midi,state-machine,If Statement,Processing,Midi,State Machine,此程序将采用指定的MIDI输入设备,并根据同时发送的信号数量,在指定的MIDI输出设备的通道1-4之间分割其信号(不考虑通道) 这意味着,如果您使用MIDI键盘作为输入设备,并按下键盘上的任意一个键,则数据将发送到输出设备上的通道1。但是,如果同时按下(或曾经按下)键盘上的任意2个键,则按下的第一个键将发送到频道1,而按下的第二个键将发送到频道2。程序将对多达4个同时音符使用相同的过程(因此为4个输出通道) 这样做不需要MIDI键盘,只需下载一个虚拟键盘,如VMPK(),并使用loopMIDI(

此程序将采用指定的MIDI输入设备,并根据同时发送的信号数量,在指定的MIDI输出设备的通道1-4之间分割其信号(不考虑通道)

这意味着,如果您使用MIDI键盘作为输入设备,并按下键盘上的任意一个键,则数据将发送到输出设备上的通道1。但是,如果同时按下(或曾经按下)键盘上的任意2个键,则按下的第一个键将发送到频道1,而按下的第二个键将发送到频道2。程序将对多达4个同时音符使用相同的过程(因此为4个输出通道)

这样做不需要MIDI键盘,只需下载一个虚拟键盘,如VMPK(),并使用loopMIDI()创建一个虚拟端口,将虚拟键盘连接到脚本。如果您使用这两个程序,请使用loopMIDI创建一个虚拟端口,然后打开VMPK并将其输出设置为您刚才创建的虚拟端口

唯一的问题是,如果一次播放多个键,只释放其中一个键(并继续按住其余键),然后再次尝试按释放的键。它不会将消息发送到空闲频道,而是尝试将消息发送到已忙的频道

例如:如果您按下一个键并按住它,如果
notesPlayed=0
程序将notes ON signal发送到通道1并设置
notesPlayed=notesPlayed+1
,然后等待您放开该键,然后将notes OFF信号发送到同一通道,然后设置
notesPlayed=notesPlayed-1

因此,如果您没有触摸键盘(
notesPlayed=0
),然后您开始按住一个键(
notesPlayed=1
)并开始按住另一个键(现在
notesPlayed=2
),松开第一个键(现在
notesPlayed=1
),然后尝试按一个键,它试图将其发送到频道2,因为
notesPlayed=1
,但由于频道2仍在播放一个音符而失败。我正在绞尽脑汁想如何解决这个问题

我想应该是这样的

if(notesPlayed==1){//if当前正在播放一个音符
如果(stat2=1){//如果通道2已忙
“将备忘发送到最后一个可用频道”
}
}
这是节目。

导入控制p5.*;
导入themidibus.*;
导入到.mukprojects.console.*;
控制台;
控制p5-cp5;
MidiBus myBus;
pfontsans;
最终int模式_1=1;
最终int模式_2=2;
显示的int notesPlayed、ch1、ch2、ch3、ch4、stat1、stat2、stat3、stat4、mode、r、g、b;
字符串输入=“未连接”;
字符串输出=“未连接”;
字符串复位,设备已连接;
布尔显示控制台;
无效设置(){
大小(300550);
光滑的();
notesPlayed=0;
cp5=新控制P5(本);
cp5.addTextfield(“输入”).setPosition(10365).setSize(80,20).setAutoClear(false);
cp5.addTextfield(“输出”).setPosition(100365).setSize(80,20).setAutoClear(false);
cp5.addBang(“提交”).setPosition(190365).setSize(20,20);
cp5.addBang(“重置”).setPosition(270,365)。setSize(20,20);
控制台=新控制台(此);
console.start();
showConsole=true;
模式=模式1;
sans=loadFont(“SansSerif.plain-18.vlw”);
重置=“是”;
DeviceConnect=“否”;
r=255;
g=0;
b=0;
}
作废提款(){
背景(0);
开关(模式){
案例模式1:
//(x、y、宽度、高度、preferredTextSize、minTextSize、线宽、填充、strokeColor、backgroundColor、textColor)
控制台.绘图(2,0,295,360,13,13,1,1);
打破
案例模式2:
//(x、y、宽度、高度、preferredTextSize、minTextSize、线宽、填充、strokeColor、backgroundColor、textColor)
绘制(2,0,295,360,13,13,1,1,颜色(220),颜色(0),颜色(0,255,0));
打破
}
文本大小(12);
填充(200200200200);
文本(“输入:”,10,420);
文本(“输出:”,10435);
填充物(r、g、b);
文本(输入,70420);
文本(输出70435);
填充(255,255,0);
文本大小(28);
文本(“渠道活动”,15450);
文本大小(60);
如果(stat1==0){
填充(90,90,90);
文本(“1”,20,485);
}
如果(stat2==0){
填充(90,90,90);
文本(“2”,95,485);
}
如果(stat3==0){
填充(90,90,90);
文本(“3”、170、485);
}
如果(stat4==0){
填充(90,90,90);
文本(“4”、245、485);
}
如果(stat1==1){
填充(0,255,0);
文本(“1”,20,485);
}
如果(stat2==1){
填充(0,255,0);
文本(“2”,95,485);
}
如果(stat3==1){
填充(0,255,0);
文本(“3”、170、485);
}
如果(stat4==1){
填充(0,255,0);
文本(“4”、245、485);
}
文本字体(sans);
填充物(r、g、b);
文本大小(14);
文本(“-有源器件-”,10405);
如果(重置=“是”){
println(“”);
println(“”);
println(“”);
println(“”);
println(“”);
println(“”);
println(“”);
println(“”);
println(“”);
println(“”);
MidiBus.findmidDevices();
MidiBus.list();
println(“---------------------------------------”;
println(“下面的输入设备名称”);
println(“(区分大小写)”);
输入=“未连接”;
输出=“未连接”;
r=255;
g=0;
b=0;
重置=“否”;
}else{}
}
无效注释(整数通道、整数节距、整数速度){
如果(notesPlayed==0){
myBus.sendNoteOn(0,俯仰,速度);
ch1=节距;
stat1=1;
println(“CH1-ON-”,节距,”,速度);
}
如果(notesPlayed==1){
myBus.sendNoteOn(1,俯仰,速度);
ch2=节距;
stat2=1;
println(“CH2-ON-”,节距,”,速度);
}
如果(notesPlayed==2){
myBus.sendNoteOn(2,俯仰,速度);
ch3=节距;
stat3=1;
println(“CH3-ON-”,节距,”,速度);
}
如果(notesPlayed==3){
myBus.sendNoteOn(3,音高