/// Gets the lists of names and lists of labels which are /// used in the choice controls. /// The names are what the user sees in the wxChoice. /// The corresponding labels are what gets stored. void MidiIOPrefs::GetNamesAndLabels() { // Gather list of hosts. Only added hosts that have devices attached. Pm_Terminate(); // close and open to refresh device lists Pm_Initialize(); int nDevices = Pm_CountDevices(); for (int i = 0; i < nDevices; i++) { const PmDeviceInfo *info = Pm_GetDeviceInfo(i); if (info->output || info->input) { //should always happen wxString name(info->interf, wxConvLocal); if (mHostNames.Index(name) == wxNOT_FOUND) { mHostNames.Add(name); mHostLabels.Add(name); } } } }
void init() { PmError err; if (isInit) return; printf("Initialising PortMidi\n"); err = Pm_Initialize(); reportPmError(err); if (Pt_Start(1,NULL,NULL) == 0) { mexAtExit(exitFunction); isInit = 1; } else { Pm_Terminate(); mexErrMsgTxt("Could start PortMidi, but not PortTime."); } }
static int stop_portmidi(CSOUND *csound, void *userData) { (void) csound; (void) userData; #if !defined(WIN32) csound_global_mutex_lock(); #endif if (portmidi_init_cnt) { if (--portmidi_init_cnt == 0UL) { Pm_Terminate(); Pt_Stop(); } } #if !defined(WIN32) csound_global_mutex_unlock(); #endif return 0; }
void exitFunction() { if (isInit) { mexPrintf("Terminating PortMidi\n"); reportPtError(Pt_Stop()); if (inStream != NULL) { reportPmError(Pm_Close(inStream)); inStream = NULL; } Pm_Terminate(); FREE(channel); FREE(note); FREE(velocity); FREE(timestamp); isInit = 0; deviceOpen = -1; numReceived = 0; } }
mastermidibus::~mastermidibus () { for (int i = 0; i < m_num_out_buses; i++) { if (not_nullptr(m_buses_out[i])) { delete m_buses_out[i]; m_buses_out[i] = nullptr; } } for (int i = 0; i < m_num_in_buses; i++) { if (not_nullptr(m_buses_in[i])) { delete m_buses_in[i]; m_buses_in[i] = nullptr; } } Pm_Terminate(); }
void play(PtTimestamp timestamp, void *ignore) { MfEvent *event; int track; PmEvent ev; if (!ready) return; while (Mf_StreamReadNormal(stream, &event, &track, 1) == 1) { ev = event->e; Pm_WriteShort(ostream, 0, ev.message); Mf_FreeEvent(event); } if (Mf_StreamEmpty(stream) == TRUE) { Mf_FreeFile(Mf_CloseStream(stream)); Pm_Terminate(); exit(0); } }
FLiveEditorManager::~FLiveEditorManager() { if ( !bInitialized ) return; if ( LiveEditorDeviceSetupWizard != NULL ) { delete LiveEditorDeviceSetupWizard; LiveEditorDeviceSetupWizard = NULL; } bInitialized = false; CloseDeviceConnections(); Pm_Terminate(); delete[] MIDIBuffer; MIDIBuffer = NULL; delete LiveEditorUserData; LiveEditorUserData = NULL; }
/*! @function terminateMIDISystem @abstract @discussion @param @result */ void terminateMIDISystem(void) { Pm_Terminate(); }
/*! @function midi_close @abstract @discussion @param @result */ void midi_close(void) { Pm_Close(mstream); Pm_Terminate(); }
void osd_midi_exit() { Pm_Terminate(); }
/* The winmm stream mode is used for latency>0, and sends timestamped messages. The timestamps are relative (delta) times, whereas PortMidi times are absolute. Since peculiar things happen when messages are not always sent in advance, this function allows us to exercise the system and test it. */ void main_test_stream() { PmStream * midi; char line[80]; PmEvent buffer[16]; /* determine which output device to use */ int i = get_number("Type output number: "); latency = 500; /* ignore LATENCY for this test and fix the latency at 500ms */ /* It is recommended to start timer before PortMidi */ TIME_START; /* open output device */ Pm_OpenOutput(&midi, i, DRIVER_INFO, OUTPUT_BUFFER_SIZE, TIME_PROC, TIME_INFO, latency); printf("Midi Output opened with %ld ms latency.\n", (long) latency); /* output note on/off w/latency offset; hold until user prompts */ printf("ready to send output... (type RETURN):"); fgets(line, STRING_MAX, stdin); /* if we were writing midi for immediate output, we could always use timestamps of zero, but since we may be writing with latency, we will explicitly set the timestamp to "now" by getting the time. The source of timestamps should always correspond to the TIME_PROC and TIME_INFO parameters used in Pm_OpenOutput(). */ buffer[0].timestamp = TIME_PROC(TIME_INFO); buffer[0].message = Pm_Message(0xC0, 0, 0); buffer[1].timestamp = buffer[0].timestamp; buffer[1].message = Pm_Message(0x90, 60, 100); buffer[2].timestamp = buffer[0].timestamp + 1000; buffer[2].message = Pm_Message(0x90, 62, 100); buffer[3].timestamp = buffer[0].timestamp + 2000; buffer[3].message = Pm_Message(0x90, 64, 100); buffer[4].timestamp = buffer[0].timestamp + 3000; buffer[4].message = Pm_Message(0x90, 66, 100); buffer[5].timestamp = buffer[0].timestamp + 4000; buffer[5].message = Pm_Message(0x90, 60, 0); buffer[6].timestamp = buffer[0].timestamp + 4000; buffer[6].message = Pm_Message(0x90, 62, 0); buffer[7].timestamp = buffer[0].timestamp + 4000; buffer[7].message = Pm_Message(0x90, 64, 0); buffer[8].timestamp = buffer[0].timestamp + 4000; buffer[8].message = Pm_Message(0x90, 66, 0); Pm_Write(midi, buffer, 9); #ifdef SEND8 /* Now, we're ready for the real test. Play 4 notes at now, now+500, now+1000, and now+1500 Then wait until now+2000. Play 4 more notes as before. We should hear 8 evenly spaced notes. */ now = TIME_PROC(TIME_INFO); for (i = 0; i < 4; i++) { buffer[i * 2].timestamp = now + (i * 500); buffer[i * 2].message = Pm_Message(0x90, 60, 100); buffer[i * 2 + 1].timestamp = now + 250 + (i * 500); buffer[i * 2 + 1].message = Pm_Message(0x90, 60, 0); } Pm_Write(midi, buffer, 8); while (Pt_Time() < now + 2500) /* busy wait */; /* now we are 500 ms behind schedule, but since the latency is 500, the delay should not be audible */ now += 2000; for (i = 0; i < 4; i++) { buffer[i * 2].timestamp = now + (i * 500); buffer[i * 2].message = Pm_Message(0x90, 60, 100); buffer[i * 2 + 1].timestamp = now + 250 + (i * 500); buffer[i * 2 + 1].message = Pm_Message(0x90, 60, 0); } Pm_Write(midi, buffer, 8); #endif /* close device (this not explicitly needed in most implementations) */ printf("ready to close and terminate... (type RETURN):"); fgets(line, STRING_MAX, stdin); Pm_Close(midi); Pm_Terminate(); printf("done closing and terminating...\n"); }
void pm_module::exit() { Pm_Terminate(); }
void osd_shutdown_midi(void) { #ifndef DISABLE_MIDI Pm_Terminate(); #endif }
int Server_pm_init(Server *self) { int i = 0, ret = 0; PmError pmerr; if (self->midiActive == 0) { self->withPortMidi = 0; self->withPortMidiOut = 0; return 0; } pmerr = Pm_Initialize(); if (pmerr) { Server_warning(self, "Portmidi warning: could not initialize Portmidi: %s\n", Pm_GetErrorText(pmerr)); self->withPortMidi = 0; self->withPortMidiOut = 0; return -1; } else { Server_debug(self, "Portmidi initialized.\n"); self->withPortMidi = 1; self->withPortMidiOut = 1; } PyoPmBackendData *be_data = (PyoPmBackendData *) malloc(sizeof(PyoPmBackendData *)); self->midi_be_data = (void *) be_data; if (self->withPortMidi == 1) { self->midiin_count = self->midiout_count = 0; int num_devices = Pm_CountDevices(); Server_debug(self, "Portmidi number of devices: %d.\n", num_devices); if (num_devices > 0) { if (self->midi_input < num_devices) { if (self->midi_input == -1) self->midi_input = Pm_GetDefaultInputDeviceID(); Server_debug(self, "Midi input device : %d.\n", self->midi_input); const PmDeviceInfo *info = Pm_GetDeviceInfo(self->midi_input); if (info != NULL) { if (info->input) { pmerr = Pm_OpenInput(&be_data->midiin[0], self->midi_input, NULL, 100, NULL, NULL); if (pmerr) { Server_warning(self, "Portmidi warning: could not open midi input %d (%s): %s\n", self->midi_input, info->name, Pm_GetErrorText(pmerr)); self->withPortMidi = 0; } else { Server_debug(self, "Midi input (%s) opened.\n", info->name); self->midiin_count = 1; } } else { Server_warning(self, "Portmidi warning: Midi Device (%s), not an input device!\n", info->name); self->withPortMidi = 0; } } } else if (self->midi_input >= num_devices) { Server_debug(self, "Midi input device : all!\n"); self->midiin_count = 0; for (i=0; i<num_devices; i++) { const PmDeviceInfo *info = Pm_GetDeviceInfo(i); if (info != NULL) { if (info->input) { pmerr = Pm_OpenInput(&be_data->midiin[self->midiin_count], i, NULL, 100, NULL, NULL); if (pmerr) { Server_warning(self, "Portmidi warning: could not open midi input %d (%s): %s\n", 0, info->name, Pm_GetErrorText(pmerr)); } else { Server_debug(self, "Midi input (%s) opened.\n", info->name); self->midiin_count++; } } } } if (self->midiin_count == 0) self->withPortMidi = 0; } else { Server_warning(self, "Portmidi warning: no input device!\n"); self->withPortMidi = 0; } if (self->midi_output < num_devices) { if (self->midi_output == -1) self->midi_output = Pm_GetDefaultOutputDeviceID(); Server_debug(self, "Midi output device : %d.\n", self->midi_output); const PmDeviceInfo *outinfo = Pm_GetDeviceInfo(self->midi_output); if (outinfo != NULL) { if (outinfo->output) { Pt_Start(1, 0, 0); /* start a timer with millisecond accuracy */ pmerr = Pm_OpenOutput(&be_data->midiout[0], self->midi_output, NULL, 0, NULL, NULL, 1); if (pmerr) { Server_warning(self, "Portmidi warning: could not open midi output %d (%s): %s\n", self->midi_output, outinfo->name, Pm_GetErrorText(pmerr)); self->withPortMidiOut = 0; if (Pt_Started()) Pt_Stop(); } else { Server_debug(self, "Midi output (%s) opened.\n", outinfo->name); self->midiout_count = 1; } } else { Server_warning(self, "Portmidi warning: Midi Device (%s), not an output device!\n", outinfo->name); self->withPortMidiOut = 0; } } } else if (self->midi_output >= num_devices) { Server_debug(self, "Midi output device : all!\n"); self->midiout_count = 0; Pt_Start(1, 0, 0); /* start a timer with millisecond accuracy */ for (i=0; i<num_devices; i++) { const PmDeviceInfo *outinfo = Pm_GetDeviceInfo(i); if (outinfo != NULL) { if (outinfo->output) { pmerr = Pm_OpenOutput(&be_data->midiout[self->midiout_count], i, NULL, 100, NULL, NULL, 1); if (pmerr) { Server_warning(self, "Portmidi warning: could not open midi output %d (%s): %s\n", 0, outinfo->name, Pm_GetErrorText(pmerr)); } else { Server_debug(self, "Midi output (%s) opened.\n", outinfo->name); self->midiout_count++; } } } } if (self->midiout_count == 0) { if (Pt_Started()) Pt_Stop(); self->withPortMidiOut = 0; } } else { Server_warning(self, "Portmidi warning: no output device!\n"); self->withPortMidiOut = 0; } if (self->withPortMidi == 0 && self->withPortMidiOut == 0) { Pm_Terminate(); Server_warning(self, "Portmidi closed.\n"); ret = -1; } } else { Server_warning(self, "Portmidi warning: no midi device found!\nPortmidi closed.\n"); self->withPortMidi = 0; self->withPortMidiOut = 0; Pm_Terminate(); ret = -1; } } if (self->withPortMidi == 1) { self->midi_count = 0; for (i=0; i<self->midiin_count; i++) { Pm_SetFilter(be_data->midiin[i], PM_FILT_ACTIVE | PM_FILT_CLOCK); } } return ret; }
Server::~Server() { SDL_CloseAudio(); if (m_log) sf_close(m_log); if (m_midi) Pm_Close(m_midi); Pm_Terminate(); }
void osd_interface::midi_exit() { #ifndef DISABLE_MIDI Pm_Terminate(); #endif }
int main(int argc, const char * argv[]) { int i, numDevices, selectedDeviceIndex = 3; long channel; const PmDeviceInfo *info; PortMidiStream *stream; PmEvent event; Pm_Initialize(); numDevices = Pm_CountDevices(); if (numDevices == 0) { return 0; } for (i = 0; i < numDevices; i++) { info = Pm_GetDeviceInfo(i); if (info->input) { } } info = Pm_GetDeviceInfo(selectedDeviceIndex); channel = 1; channel--; Pm_OpenInput(&stream, selectedDeviceIndex, NULL, 8192, NULL, NULL); printf("Setup complete! Waiting for MIDI data...\n"); system("setterm -blank force");//kills all display. to bring back call: setterm -blank poke while (1) { long status, data1, data2; int length, person, audioFile; length = Pm_Read(stream, &event, sizeof(long)); if (length > 0) { status = Pm_MessageStatus(event.message); data1 = Pm_MessageData1(event.message); data2 = Pm_MessageData2(event.message); if (status == (0x80 + channel)) { printf("Note off: %ld, %ld\n", data1, data2); } else if (status == (0x90 + channel)) { printf("Note on: %ld, %ld\n", data1, data2); } else if (status == (0xB0 + channel)) { printf("CC: %ld, %ld\n", data1, data2); } } if (data1 == 25) { if (data2 == 127) { system("clear"); system("playMovie"); } } if(data1 == 26) { if(data2 == 127) { system("setterm -blank force"); } if(data2 == 0) { system("setterm -blank poke"); } } } Pm_Close(stream); Pm_Terminate(); return 0; }
NxMidiManager::~NxMidiManager() { Pm_Terminate( ); }
void main_test_output() { PmStream * midi; char line[80]; int32_t off_time; int chord[] = { 60, 67, 76, 83, 90 }; #define chord_size 5 PmEvent buffer[chord_size]; PmTimestamp timestamp; /* determine which output device to use */ int i = get_number("Type output number: "); /* It is recommended to start timer before PortMidi */ TIME_START; /* open output device -- since PortMidi avoids opening a timer when latency is zero, we will pass in a NULL timer pointer for that case. If PortMidi tries to access the time_proc, we will crash, so this test will tell us something. */ Pm_OpenOutput(&midi, i, DRIVER_INFO, OUTPUT_BUFFER_SIZE, (latency == 0 ? NULL : TIME_PROC), (latency == 0 ? NULL : TIME_INFO), latency); printf("Midi Output opened with %ld ms latency.\n", (long) latency); /* output note on/off w/latency offset; hold until user prompts */ printf("ready to send program 1 change... (type RETURN):"); fgets(line, STRING_MAX, stdin); /* if we were writing midi for immediate output, we could always use timestamps of zero, but since we may be writing with latency, we will explicitly set the timestamp to "now" by getting the time. The source of timestamps should always correspond to the TIME_PROC and TIME_INFO parameters used in Pm_OpenOutput(). */ buffer[0].timestamp = TIME_PROC(TIME_INFO); /* Send a program change to increase the chances we will hear notes */ /* Program 0 is usually a piano, but you can change it here: */ #define PROGRAM 0 buffer[0].message = Pm_Message(0xC0, PROGRAM, 0); Pm_Write(midi, buffer, 1); printf("ready to note-on... (type RETURN):"); fgets(line, STRING_MAX, stdin); buffer[0].timestamp = TIME_PROC(TIME_INFO); buffer[0].message = Pm_Message(0x90, 60, 100); Pm_Write(midi, buffer, 1); printf("ready to note-off... (type RETURN):"); fgets(line, STRING_MAX, stdin); buffer[0].timestamp = TIME_PROC(TIME_INFO); buffer[0].message = Pm_Message(0x90, 60, 0); Pm_Write(midi, buffer, 1); /* output short note on/off w/latency offset; hold until user prompts */ printf("ready to note-on (short form)... (type RETURN):"); fgets(line, STRING_MAX, stdin); Pm_WriteShort(midi, TIME_PROC(TIME_INFO), Pm_Message(0x90, 60, 100)); printf("ready to note-off (short form)... (type RETURN):"); fgets(line, STRING_MAX, stdin); Pm_WriteShort(midi, TIME_PROC(TIME_INFO), Pm_Message(0x90, 60, 0)); /* output several note on/offs to test timing. Should be 1s between notes */ printf("chord will arpeggiate if latency > 0\n"); printf("ready to chord-on/chord-off... (type RETURN):"); fgets(line, STRING_MAX, stdin); timestamp = TIME_PROC(TIME_INFO); for (i = 0; i < chord_size; i++) { buffer[i].timestamp = timestamp + 1000 * i; buffer[i].message = Pm_Message(0x90, chord[i], 100); } Pm_Write(midi, buffer, chord_size); off_time = timestamp + 1000 + chord_size * 1000; while (TIME_PROC(TIME_INFO) < off_time) /* busy wait */; for (i = 0; i < chord_size; i++) { buffer[i].timestamp = timestamp + 1000 * i; buffer[i].message = Pm_Message(0x90, chord[i], 0); } Pm_Write(midi, buffer, chord_size); /* close device (this not explicitly needed in most implementations) */ printf("ready to close and terminate... (type RETURN):"); fgets(line, STRING_MAX, stdin); Pm_Close(midi); Pm_Terminate(); printf("done closing and terminating...\n"); }
void main_test_both() { int i = 0; int in, out; PmStream * midi, * midiOut; PmEvent buffer[1]; PmError status, length; int num = 10; in = get_number("Type input number: "); out = get_number("Type output number: "); /* In is recommended to start timer before PortMidi */ TIME_START; Pm_OpenOutput(&midiOut, out, DRIVER_INFO, OUTPUT_BUFFER_SIZE, TIME_PROC, TIME_INFO, latency); printf("Midi Output opened with %ld ms latency.\n", (long) latency); /* open input device */ Pm_OpenInput(&midi, in, DRIVER_INFO, INPUT_BUFFER_SIZE, TIME_PROC, TIME_INFO); printf("Midi Input opened. Reading %d Midi messages...\n",num); Pm_SetFilter(midi, PM_FILT_ACTIVE | PM_FILT_CLOCK); /* empty the buffer after setting filter, just in case anything got through */ while (Pm_Poll(midi)) { Pm_Read(midi, buffer, 1); } i = 0; while (i < num) { status = Pm_Poll(midi); if (status == TRUE) { length = Pm_Read(midi,buffer,1); if (length > 0) { Pm_Write(midiOut, buffer, 1); printf("Got message %d: time %ld, %2lx %2lx %2lx\n", i, (long) buffer[0].timestamp, (long) Pm_MessageStatus(buffer[0].message), (long) Pm_MessageData1(buffer[0].message), (long) Pm_MessageData2(buffer[0].message)); i++; } else { assert(0); } } } /* close midi devices */ Pm_Close(midi); Pm_Close(midiOut); Pm_Terminate(); }
/* * Method: Pm_Terminate */ JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Terminate (JNIEnv *env, jclass cl) { return Pm_Terminate(); }