static int OpenMidiInDevice_(CSOUND *csound, void **userData, const char *dev) { int cntdev, devnum, opendevs, i; PmEvent buffer; PmError retval; PmDeviceInfo *info; // PortMidiStream *midistream; pmall_data *data = NULL; pmall_data *next = NULL; if (start_portmidi(csound) != 0) return -1; /* check if there are any devices available */ cntdev = portMidi_getDeviceCount(0); portMidi_listDevices(csound, 0); /* look up device in list */ if (dev == NULL || dev[0] == '\0') devnum = portMidi_getPackedDeviceID((int)Pm_GetDefaultInputDeviceID(), 0); else if (UNLIKELY((dev[0] < '0' || dev[0] > '9') && dev[0] != 'a')) { portMidiErrMsg(csound, Str("error: must specify a device number (>=0) or" " 'a' for all, not a name")); return -1; } else if (dev[0] != 'a') { devnum = (int)atoi(dev); if (UNLIKELY(devnum < 0 || devnum >= cntdev)) { portMidiErrMsg(csound, Str("error: device number is out of range")); return -1; } } else { // allow to proceed if 'a' is given even if there are no MIDI devices devnum = -1; } if (UNLIKELY(cntdev < 1 && (dev==NULL || dev[0] != 'a'))) { return portMidiErrMsg(csound, Str("no input devices are available")); } opendevs = 0; for (i = 0; i < cntdev; i++) { if (devnum == i || devnum == -1) { if (opendevs == 0) { data = (pmall_data *) malloc(sizeof(pmall_data)); next = data; data->next = NULL; opendevs++; } else { next->next = (pmall_data *) malloc(sizeof(pmall_data)); next = next->next; next->next = NULL; opendevs++; } info = portMidi_getDeviceInfo(i, 0); if (info->interf != NULL) csound->Message(csound, Str("PortMIDI: Activated input device %d: '%s' (%s)\n"), i, info->name, info->interf); else csound->Message(csound, Str("PortMIDI: Activated input device %d: '%s'\n"), i, info->name); retval = Pm_OpenInput(&next->midistream, (PmDeviceID) portMidi_getRealDeviceID(i, 0), NULL, 512L, (PmTimeProcPtr) NULL, NULL); if (UNLIKELY(retval != pmNoError)) { // Prevent leaking memory from "data" if (data) { next = data->next; free(data); } return portMidiErrMsg(csound, Str("error opening input device %d: %s"), i, Pm_GetErrorText(retval)); } /* only interested in channel messages (note on, control change, etc.) */ /* GAB: fixed for portmidi v.23Aug06 */ Pm_SetFilter(next->midistream, (PM_FILT_ACTIVE | PM_FILT_SYSEX)); /* empty the buffer after setting filter */ while (Pm_Poll(next->midistream) == TRUE) { Pm_Read(next->midistream, &buffer, 1); } } } *userData = (void*) data; /* report success */ return 0; }
MidiSession::MidiSession() { error = Pm_Initialize(); std::cout<<Pm_GetErrorText(error)<<std::endl; }
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; }
void sys_do_open_midi(int nmidiin, int *midiinvec, int nmidiout, int *midioutvec) { int i = 0, j, devno; int n = 0; PmError err; Pt_Start(1, 0, 0); /* start a timer with millisecond accuracy */ mac_nmidiindev = 0; for (i = 0; i < nmidiin; i++) { for (j = 0, devno = 0; j < Pm_CountDevices(); j++) { const PmDeviceInfo *info = Pm_GetDeviceInfo(j); if (info->input) { if (devno == midiinvec[i]) { err = Pm_OpenInput(&mac_midiindevlist[mac_nmidiindev], j, NULL, 100, NULL, NULL); if (err) post("could not open midi input %d (%s): %s", j, info->name, Pm_GetErrorText(err)); else { if (sys_verbose) post("Midi Input (%s) opened.", info->name); mac_nmidiindev++; } } devno++; } } } mac_nmidioutdev = 0; for (i = 0; i < nmidiout; i++) { for (j = 0, devno = 0; j < Pm_CountDevices(); j++) { const PmDeviceInfo *info = Pm_GetDeviceInfo(j); if (info->output) { if (devno == midioutvec[i]) { err = Pm_OpenOutput( &mac_midioutdevlist[mac_nmidioutdev], j, NULL, 0, NULL, NULL, 0); if (err) post("could not open midi output %d (%s): %s", j, info->name, Pm_GetErrorText(err)); else { if (sys_verbose) post("Midi Output (%s) opened.", info->name); mac_nmidioutdev++; } } devno++; } } } }
/* * Method: Pm_GetErrorText */ JNIEXPORT jstring JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetErrorText (JNIEnv *env, jclass cl, jint i) { return (*env)->NewStringUTF(env, Pm_GetErrorText(i)); }