示例#1
0
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;
	}
}
示例#3
0
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;
    }
}