void openQuicktimeMIDIPort(void) { ComponentResult err; NoteRequest nr; NoteChannel nc; int i; short shortpoly; Fixed fixedtypical; closeQuicktimeMIDIPort(); na = OpenDefaultComponent('nota', 0); if (!na) return; for (i = 0; i < 16; i++) { shortpoly = CFSwapInt16HostToBig(11); memcpy(&nr.info.polyphony,&shortpoly,2); /* max simultaneous tones */ fixedtypical = CFSwapInt32HostToBig(0x00010000); memcpy(&nr.info.typicalPolyphony,&fixedtypical,4); NAStuffToneDescription(na, 1, &nr.tone); err = NANewNoteChannel(na, &nr, &nc); if (err || !nc) { closeQuicktimeMIDIPort(); return; } NAResetNoteChannel(na, nc); NASetInstrumentNumber(na, nc, channelInstrument[i]); channel[i] = nc; } state = idle; argByte1 = 0; argByte2 = 0; lastCmdByte = nil; return; }
static void set_instrument(MidiEvent *ev) { long instrumentNumber; int ch = ev->channel; channel[ch].program = ev->a; if(drum_part[ch]){ if(play_system_mode == GS_SYSTEM_MODE && channel[ch].bank_lsb == 2) // SC-88 Map instrumentNumber = kFirstDrumkit + sc88_drum_kit[ev->a] + 1; else if(play_system_mode == GS_SYSTEM_MODE && channel[ch].bank_lsb == 3) // SC-88Pro Map instrumentNumber = kFirstDrumkit + sc88pro_drum_kit[ev->a] + 1; else instrumentNumber = kFirstDrumkit + ev->a + 1; } else { if(play_system_mode == GS_SYSTEM_MODE) instrumentNumber = kFirstGSInstrument + (channel[ch].bank_msb<<7) + ev->a; else if(play_system_mode == XG_SYSTEM_MODE) instrumentNumber = xg_instrument_number(ch, ev->a); else instrumentNumber = kFirstGMInstrument + ev->a; } if(instrument_number[ch] != instrumentNumber){ NoteRequest nr; long index, part; OSType synthType; Str31 name; SynthesizerConnections connections; MusicComponent mc; instrument_number[ch] = instrumentNumber; if(note_channel[ch] != NULL) NADisposeNoteChannel(gNoteAllocator, note_channel[ch]); nr.info.flags = 0; nr.info.reserved = 0; *(short *)(&nr.info.polyphony) = EndianS16_NtoB(8); // 8 voices poliphonic *(Fixed *)(&nr.info.typicalPolyphony) = EndianU32_NtoB(0x00010000); NAStuffToneDescription(gNoteAllocator, instrumentNumber, &nr.tone); NANewNoteChannel(gNoteAllocator, &nr, ¬e_channel[ch]); NAGetNoteChannelInfo(gNoteAllocator, note_channel[ch], &index, &part); NAGetRegisteredMusicDevice(gNoteAllocator, index, &synthType, name, &connections, &mc); MusicGetPartName(mc, part, name); p2cstrcpy(instrument_name[ch], name); } ctl_prog_event(ch, ev->a); }