It sounds like a worthwhile project, i hope you make a video or demo version, so i can watch it.
My project is just a hobby project, and i find the midifile format disturbingly complex....
So i walked away from in favour for a textformat in my sequenser, but i still need to be able to manipulate things like synths and mixers via midimessages during playup and recording.
I also built a simple editor, and think what you talk about "listing the messages" on a track/channel and able to change one or all sounds like a nice feature.
If your editor comes with a player a "prechange playup" would be nice.
Right now i have to select CC/PRG/BANK via a dropdown list in editor for a track and they will be filtered out, but i probably will filter them out separately on the track because it sounds like a neat feature.
Well good luck with your midi project i look forward to see it in action.
JT
PS just want to show you how easy things are to change using Javascript, and maybe drag you in to some javascript programming
function setVol(){
console.log("setVol()");
CCchan=176+trackMidiCh-1;
CCtype=7;
CCvol=document.getElementById("volID").value;
if (SF2PLAY==false){
settingChange=[CCchan,CCtype,CCvol];
outportarr[outportindex].send(settingChange);
} else if (SF2PLAY==true){
synth.NoteOn(CCchan,CCtype,CCvol);
}
}
function setPan(){
console.log("setPan()");
CCchan=176+trackMidiCh-1;
CCtype=10;
CCpan=document.getElementById("panID").value;
if (SF2PLAY==false){
settingChange=[CCchan,CCtype,CCpan];
outportarr[outportindex].send(settingChange);
} else if (SF2PLAY==true){
synth.NoteOn(CCchan,CCtype,CCpan);
}
}
function setRev(){
console.log("setRev()");
CCchan=176+trackMidiCh-1;
CCtype=91;
CCrev=document.getElementById("revID").value;
if (SF2PLAY==false){
settingChange=[CCchan,CCtype,CCrev];
outportarr[outportindex].send(settingChange);
} else if (SF2PLAY==true){
synth.NoteOn(CCchan,CCtype,CCrev);
}
}
function setChor(){
console.log("setChor()");
CCchan=176+trackMidiCh-1;
CCtype=93;
CCchor=document.getElementById("chorID").value;
if (SF2PLAY==false){
settingChange=[CCchan,CCtype,CCchor];
outportarr[outportindex].send(settingChange);
} else if (SF2PLAY==true){
synth.NoteOn(CCchan,CCtype,CCchor);
}
}
function setMod(){
console.log("sendMod()");
CCchan=176+trackMidiCh-1;
CCtype=1;
CCmod=document.getElementById("modID").value;
if (SF2PLAY==false){
settingChange=[CCchan,CCtype,CCmod];
outportarr[outportindex].send(settingChange);
} else if (SF2PLAY==true){
synth.NoteOn(CCchan,CCtype,CCmod);
}
}
function setHold(){
console.log("setHold()");
CCchan=176+trackMidiCh-1;
CCtype=64;
CChold=document.getElementById("holdID").value;
if (SF2PLAY==false){
settingChange=[CCchan,CCtype,CChold];
outportarr[outportindex].send(settingChange);
} else if (SF2PLAY==true){
synth.NoteOn(CCchan,CCtype,CChold);
}
}
function setProgram() {
console.log("setProgram()");
programNbr = document.getElementById("prog_sel").value;
midiCh = 192 + trackMidiCh-1;
//Set program on the track
if (SF2PLAY==false){
settingChange = [midiCh, programNbr];
outportarr[outportindex].send(settingChange);
} else if (SF2PLAY==true){
synth.PGMchange(midiCh,programNbr);
}
}
function sendOutport() {
console.log("sendOutport()");
outportindex = document.getElementById("out_portsel").selectedIndex;
console.log("ChangePort");
//PORToutmess = outportarr[outportindex];
PORTout = outportarr[outportindex];
}