int CChannelHandler::RunNote(int Octave, int Note) { // Run the note and handle portamento int NewNote = MIDI_NOTE(Octave, Note); int NesFreq = TriggerNote(NewNote); if (m_iPortaSpeed > 0 && m_iEffect == EF_PORTAMENTO) { if (m_iPeriod == 0) m_iPeriod = NesFreq; m_iPortaTo = NesFreq; } else m_iPeriod = NesFreq; m_bGate = true; return NewNote; }
void CInstrumentEditDlg::SwitchOnNote(int x, int y) { CFamiTrackerView *pView = CFamiTrackerView::GetView(); CFamiTrackerDoc *pDoc = static_cast<CFamiTrackerDoc*>(static_cast<CFrameWnd*>(GetParent())->GetActiveDocument()); CMainFrame *pFrameWnd = static_cast<CMainFrame*>(GetParent()); int Channel = pView->GetSelectedChannel(); // // // int Chip = pDoc->GetExpansionChip(); stChanNote NoteData { }; // // // Send to respective channels whenever cursor is outside instrument chip if (m_iSelectedInstType == INST_2A03) { if (m_pPanels[0]->IsWindowVisible() && Channel > CHANID_NOISE) pView->SelectChannel(pDoc->GetChannelIndex(CHANID_SQUARE1)); if (m_pPanels[1]->IsWindowVisible()) pView->SelectChannel(pDoc->GetChannelIndex(CHANID_DPCM)); } else { chan_id_t First = CHANNELS; switch (m_iSelectedInstType) { case INST_VRC6: First = CHANID_VRC6_PULSE1; break; case INST_N163: First = CHANID_N163_CH1; break; case INST_FDS: First = CHANID_FDS; break; case INST_VRC7: First = CHANID_VRC7_CH1; break; case INST_S5B: First = CHANID_S5B_CH1; break; } int Index = pDoc->GetChannelIndex(First); if (Index != -1 && pDoc->GetChipType(Index) != pDoc->GetChipType(Channel)) pView->SelectChannel(Index); } Channel = pView->GetSelectedChannel(); // // // if (m_KeyboardRect.PtInRect({x, y})) { int KeyPos = (x - m_KeyboardRect.left) % 70; // // // int Octave = (x - m_KeyboardRect.left) / 70; int Note; if (y > m_KeyboardRect.top + 38) { // Only white keys if (KeyPos >= 60) Note = NOTE_B; else if (KeyPos >= 50) Note = NOTE_A; else if (KeyPos >= 40) Note = NOTE_G; else if (KeyPos >= 30) Note = NOTE_F; else if (KeyPos >= 20) Note = NOTE_E; else if (KeyPos >= 10) Note = NOTE_D; else if (KeyPos >= 0) Note = NOTE_C; } else { // Black and white keys if (KeyPos >= 62) Note = NOTE_B; else if (KeyPos >= 56) Note = NOTE_As; else if (KeyPos >= 53) Note = NOTE_A; else if (KeyPos >= 46) Note = NOTE_Gs; else if (KeyPos >= 43) Note = NOTE_G; else if (KeyPos >= 37) Note = NOTE_Fs; else if (KeyPos >= 30) Note = NOTE_F; else if (KeyPos >= 23) Note = NOTE_E; else if (KeyPos >= 16) Note = NOTE_Ds; else if (KeyPos >= 13) Note = NOTE_D; else if (KeyPos >= 7) Note = NOTE_Cs; else if (KeyPos >= 0) Note = NOTE_C; } int NewNote = MIDI_NOTE(Octave, Note); // // // if (NewNote != m_iLastKey) { NoteData.Note = Note; NoteData.Octave = Octave; NoteData.Vol = MAX_VOLUME - 1; NoteData.Instrument = pFrameWnd->GetSelectedInstrument(); memset(NoteData.EffNumber, 0, 4); memset(NoteData.EffParam, 0, 4); theApp.GetSoundGenerator()->QueueNote(Channel, NoteData, NOTE_PRIO_2); theApp.GetSoundGenerator()->ForceReloadInstrument(Channel); // // // m_iLastKey = NewNote; } } else { NoteData.Note = pView->DoRelease() ? RELEASE : HALT;//HALT; NoteData.Vol = MAX_VOLUME; NoteData.Instrument = pFrameWnd->GetSelectedInstrument();; memset(NoteData.EffNumber, 0, 4); memset(NoteData.EffParam, 0, 4); theApp.GetSoundGenerator()->QueueNote(Channel, NoteData, NOTE_PRIO_2); m_iLastKey = -1; } }
void scan_midi() { uint8_t data = midi_ring_buffer[midi_next_message++]; /* Status messages */ if (data & 0x80) { midi_data_index = 0; switch(data & 0xF0) { case 0x90: midi_status = MIDI_NOTE_ON; break; case 0x80: midi_status = MIDI_NOTE_OFF; break; case 0xC0: midi_status = MIDI_PROGRAM_CHANGE; break; case 0xB0: midi_status = MIDI_CONTROL_CHANGE; break; default: midi_status = MIDI_IDLE; } } /* Data messages */ else { midi_data_index += 1; switch (midi_status) { case MIDI_NOTE_ON: if (midi_data_index == 2) { if (midi_sustain && data) { if (midi_sustain && midi_last_data == MIDI_NOTE_OFFSET) key_octave_down(); else if (midi_sustain && midi_last_data == MIDI_NOTE_OFFSET + 87) key_octave_up(); else add_record_pitch_change(midi_last_data - MIDI_NOTE_OFFSET); } else { if (data) { start_note(BANK_MIDI, MIDI_NOTE(midi_last_data)); if (banks[BANK_MIDI].mode & MODE_PEDAL && midi_last_data >= (MIDI_NOTE_OFFSET+12)) start_note(BANK_MIDI, MIDI_NOTE(midi_last_data - 12)); } else { stop_note(BANK_MIDI, MIDI_NOTE(midi_last_data)); if (banks[BANK_MIDI].mode & MODE_PEDAL && midi_last_data >= (MIDI_NOTE_OFFSET+12)) stop_note(BANK_MIDI, MIDI_NOTE(midi_last_data - 12)); } } midi_data_index = 0; } break; case MIDI_NOTE_OFF: if (midi_data_index == 2) { stop_note(BANK_MIDI, MIDI_NOTE(midi_last_data)); if (banks[BANK_MIDI].mode & MODE_PEDAL && midi_last_data >= (MIDI_NOTE_OFFSET+12)) stop_note(BANK_MIDI, MIDI_NOTE(midi_last_data - 12)); midi_data_index = 0; } break; case MIDI_PROGRAM_CHANGE: midi_program_change(data); midi_data_index = 0; break; case MIDI_CONTROL_CHANGE: if (midi_data_index == 2) { if (midi_last_data == 0x40) midi_sustain = data & 0x40; // <64 off, >=64 on midi_data_index = 0; } break; } midi_last_data = data; } }