GUI: earliest MIDI note input
This commit is contained in:
parent
cb107ebbac
commit
501ecc063d
|
@ -749,6 +749,46 @@ void FurnaceGUI::stopPreviewNote(SDL_Scancode scancode) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FurnaceGUI::noteInput(int num, int key) {
|
||||||
|
DivPattern* pat=e->song.pat[cursor.xCoarse].getPattern(e->song.orders.ord[cursor.xCoarse][e->getOrder()],true);
|
||||||
|
|
||||||
|
prepareUndo(GUI_UNDO_PATTERN_EDIT);
|
||||||
|
|
||||||
|
if (key==100) { // note off
|
||||||
|
pat->data[cursor.y][0]=100;
|
||||||
|
pat->data[cursor.y][1]=0;
|
||||||
|
} else if (key==101) { // note off + env release
|
||||||
|
pat->data[cursor.y][0]=101;
|
||||||
|
pat->data[cursor.y][1]=0;
|
||||||
|
} else if (key==102) { // env release only
|
||||||
|
pat->data[cursor.y][0]=102;
|
||||||
|
pat->data[cursor.y][1]=0;
|
||||||
|
} else {
|
||||||
|
pat->data[cursor.y][0]=num%12;
|
||||||
|
pat->data[cursor.y][1]=num/12;
|
||||||
|
if (pat->data[cursor.y][0]==0) {
|
||||||
|
pat->data[cursor.y][0]=12;
|
||||||
|
pat->data[cursor.y][1]--;
|
||||||
|
}
|
||||||
|
pat->data[cursor.y][1]=(unsigned char)pat->data[cursor.y][1];
|
||||||
|
if (latchIns==-2) {
|
||||||
|
pat->data[cursor.y][2]=curIns;
|
||||||
|
} else if (latchIns!=-1 && !e->song.ins.empty()) {
|
||||||
|
pat->data[cursor.y][2]=MIN(((int)e->song.ins.size())-1,latchIns);
|
||||||
|
}
|
||||||
|
if (latchVol!=-1) {
|
||||||
|
int maxVol=e->getMaxVolumeChan(cursor.xCoarse);
|
||||||
|
pat->data[cursor.y][3]=MIN(maxVol,latchVol);
|
||||||
|
}
|
||||||
|
if (latchEffect!=-1) pat->data[cursor.y][4]=latchEffect;
|
||||||
|
if (latchEffectVal!=-1) pat->data[cursor.y][5]=latchEffectVal;
|
||||||
|
previewNote(cursor.xCoarse,num);
|
||||||
|
}
|
||||||
|
makeUndo(GUI_UNDO_PATTERN_EDIT);
|
||||||
|
editAdvance();
|
||||||
|
curNibble=false;
|
||||||
|
}
|
||||||
|
|
||||||
void FurnaceGUI::keyDown(SDL_Event& ev) {
|
void FurnaceGUI::keyDown(SDL_Event& ev) {
|
||||||
if (ImGuiFileDialog::Instance()->IsOpened()) return;
|
if (ImGuiFileDialog::Instance()->IsOpened()) return;
|
||||||
if (aboutOpen) return;
|
if (aboutOpen) return;
|
||||||
|
@ -813,44 +853,7 @@ void FurnaceGUI::keyDown(SDL_Event& ev) {
|
||||||
if (num>119) num=119; // B-9
|
if (num>119) num=119; // B-9
|
||||||
|
|
||||||
if (edit) {
|
if (edit) {
|
||||||
// TODO: separate when adding MIDI input.
|
noteInput(num,key);
|
||||||
DivPattern* pat=e->song.pat[cursor.xCoarse].getPattern(e->song.orders.ord[cursor.xCoarse][e->getOrder()],true);
|
|
||||||
|
|
||||||
prepareUndo(GUI_UNDO_PATTERN_EDIT);
|
|
||||||
|
|
||||||
if (key==100) { // note off
|
|
||||||
pat->data[cursor.y][0]=100;
|
|
||||||
pat->data[cursor.y][1]=0;
|
|
||||||
} else if (key==101) { // note off + env release
|
|
||||||
pat->data[cursor.y][0]=101;
|
|
||||||
pat->data[cursor.y][1]=0;
|
|
||||||
} else if (key==102) { // env release only
|
|
||||||
pat->data[cursor.y][0]=102;
|
|
||||||
pat->data[cursor.y][1]=0;
|
|
||||||
} else {
|
|
||||||
pat->data[cursor.y][0]=num%12;
|
|
||||||
pat->data[cursor.y][1]=num/12;
|
|
||||||
if (pat->data[cursor.y][0]==0) {
|
|
||||||
pat->data[cursor.y][0]=12;
|
|
||||||
pat->data[cursor.y][1]--;
|
|
||||||
}
|
|
||||||
pat->data[cursor.y][1]=(unsigned char)pat->data[cursor.y][1];
|
|
||||||
if (latchIns==-2) {
|
|
||||||
pat->data[cursor.y][2]=curIns;
|
|
||||||
} else if (latchIns!=-1 && !e->song.ins.empty()) {
|
|
||||||
pat->data[cursor.y][2]=MIN(((int)e->song.ins.size())-1,latchIns);
|
|
||||||
}
|
|
||||||
if (latchVol!=-1) {
|
|
||||||
int maxVol=e->getMaxVolumeChan(cursor.xCoarse);
|
|
||||||
pat->data[cursor.y][3]=MIN(maxVol,latchVol);
|
|
||||||
}
|
|
||||||
if (latchEffect!=-1) pat->data[cursor.y][4]=latchEffect;
|
|
||||||
if (latchEffectVal!=-1) pat->data[cursor.y][5]=latchEffectVal;
|
|
||||||
previewNote(cursor.xCoarse,num);
|
|
||||||
}
|
|
||||||
makeUndo(GUI_UNDO_PATTERN_EDIT);
|
|
||||||
editAdvance();
|
|
||||||
curNibble=false;
|
|
||||||
} else {
|
} else {
|
||||||
if (key!=100 && key!=101 && key!=102) {
|
if (key!=100 && key!=101 && key!=102) {
|
||||||
previewNote(cursor.xCoarse,num);
|
previewNote(cursor.xCoarse,num);
|
||||||
|
@ -1910,7 +1913,20 @@ bool FurnaceGUI::loop() {
|
||||||
// parse message here
|
// parse message here
|
||||||
logD("message is %.2x\n",msg.type);
|
logD("message is %.2x\n",msg.type);
|
||||||
int action=midiMap.at(msg);
|
int action=midiMap.at(msg);
|
||||||
if (action!=0) doAction(action);
|
if (action!=0) {
|
||||||
|
doAction(action);
|
||||||
|
} else switch (msg.type&0xf0) {
|
||||||
|
case TA_MIDI_NOTE_ON:
|
||||||
|
noteInput(msg.data[0],0);
|
||||||
|
// TODO volume input
|
||||||
|
break;
|
||||||
|
case TA_MIDI_PROGRAM:
|
||||||
|
if (midiMap.programChange) {
|
||||||
|
curIns=msg.data[0];
|
||||||
|
if (curIns>(int)e->song.ins.size()) curIns=e->song.ins.size()-1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
midiLock.lock();
|
midiLock.lock();
|
||||||
midiQueue.pop();
|
midiQueue.pop();
|
||||||
|
|
|
@ -980,6 +980,7 @@ class FurnaceGUI {
|
||||||
void doUndo();
|
void doUndo();
|
||||||
void doRedo();
|
void doRedo();
|
||||||
void editOptions(bool topMenu);
|
void editOptions(bool topMenu);
|
||||||
|
void noteInput(int num, int key);
|
||||||
|
|
||||||
void doUndoSample();
|
void doUndoSample();
|
||||||
void doRedoSample();
|
void doRedoSample();
|
||||||
|
|
Loading…
Reference in New Issue