bool MidiInputController::enablePort(int portNumber) { if(portNumber < 0) return false; try { MidiInputCallback *callback = new MidiInputCallback; RtMidiIn *rtMidiIn = new RtMidiIn; cout << "Enabling MIDI port " << portNumber << " (" << rtMidiIn->getPortName(portNumber) << ")\n"; rtMidiIn->openPort(portNumber); // Open the port rtMidiIn->ignoreTypes(true, true, true); // Ignore sysex, timing, active sensing callback->controller = this; callback->midiIn = rtMidiIn; callback->inputNumber = portNumber; rtMidiIn->setCallback(MidiInputController::rtMidiStaticCallback, callback); activePorts_[portNumber] = callback; } catch(...) { return false; } return true; }
int main(int argc, char** argv) { if (argc != 2) { printf("Usage: synth file.sf2\n"); exit(0); } LightFluidSynth *usynth; usynth = new LightFluidSynth(); usynth->loadSF2(argv[1]); // usynth->loadSF2("tim.sf2"); RtMidiIn *midiIn = new RtMidiIn(); if (midiIn->getPortCount() == 0) { std::cout << "No MIDI ports available!\n"; } midiIn->openPort(0); midiIn->setCallback( &midiCallback, (void *)usynth ); midiIn->ignoreTypes( false, false, false ); // RtAudio dac(RtAudio::LINUX_PULSE); RtAudio dac; RtAudio::StreamParameters rtParams; // Determine the number of devices available unsigned int devices = dac.getDeviceCount(); // Scan through devices for various capabilities RtAudio::DeviceInfo info; for ( unsigned int i = 0; i < devices; i++ ) { info = dac.getDeviceInfo( i ); if ( info.probed == true ) { std::cout << "device " << " = " << info.name; std::cout << ": maximum output channels = " << info.outputChannels << "\n"; } } // rtParams.deviceId = 3; rtParams.deviceId = dac.getDefaultOutputDevice(); rtParams.nChannels = 2; unsigned int bufferFrames = FRAME_SIZE; RtAudio::StreamOptions options; options.flags = RTAUDIO_SCHEDULE_REALTIME; dac.openStream( &rtParams, NULL, AUDIO_FORMAT, SAMPLE_RATE, &bufferFrames, &audioCallback, (void *)usynth, &options ); dac.startStream(); printf("\n\nPress Enter to stop\n\n"); cin.get(); dac.stopStream(); delete(usynth); return 0; }
void midiInfo() { cout << "MIDI INFO port = " << portopt << endl; std::vector<unsigned char> message; double stamp; int nBytes; int i; #ifdef MARSYAS_MIDIIO RtMidiIn *midiin = NULL; try { midiin = new RtMidiIn(); } catch (RtError3 &error) { error.printMessage(); exit(1); } try { midiin->openPort(portopt); } catch (RtError3 &error) { error.printMessage(); exit(1); } // Don't ignore sysex, timing, or active sensing messages. midiin->ignoreTypes( false, false, false ); while(1) { stamp = midiin->getMessage( &message ); nBytes = message.size(); if (nBytes >0) { for ( i=0; i<nBytes; i++ ) std::cout << "Byte " << i << " = " << (int)message[i] << ", "; if ( nBytes > 0 ) std::cout << "stamp = " << stamp << '\n'; } usleep(10); } #endif }
static VALUE rtMidiIn_connect(VALUE self, VALUE port) { RtMidiIn *device; Data_Get_Struct(self, RtMidiIn, device); try { device->openPort(NUM2INT(port)); device->ignoreTypes( false, false, false ); } catch(RtError &error) { rb_warn("could not open port"); return Qfalse; } return Qtrue; }
/* returns 0 on failure */ int start_midi(int port) { if(midi.getPortCount() < 1) { std::cout << "No MIDI ports available!\n"; return 0; } try { midi.openPort(port); } catch(RtError &error) { return 0; } // don't ignore sysex, timing, or active sensing messages midi.ignoreTypes(false, false, false); return 1; }
//----------------------------------------------------------------------------- // name: main() // desc: entry point //----------------------------------------------------------------------------- int main( int argc, char ** argv ) { RtMidiIn *midiin = new RtMidiIn(); // Check available ports. unsigned int nPorts = midiin->getPortCount(); if ( nPorts == 0 ) { std::cout << "No ports available!\n"; //goto cleanup; } midiin->openPort( 0 ); // Set our callback function. This should be done immediately after // opening the port to avoid having incoming messages written to the // queue. midiin->setCallback( &mycallback ); // Don't ignore sysex, timing, or active sensing messages. midiin->ignoreTypes( false, false, false ); std::cout << "\nReading MIDI input ... press <enter> to quit.\n"; char input; std::cin.get(input); // instantiate RtAudio object RtAudio audio; // variables unsigned int bufferBytes = 0; // frame size unsigned int numFrames = 512; // check for audio devices if( audio.getDeviceCount() < 1 ) { // nopes cout << "no audio devices found!" << endl; exit( 1 ); } // let RtAudio print messages to stderr. audio.showWarnings( true ); // set input and output parameters RtAudio::StreamParameters iParams, oParams; iParams.deviceId = audio.getDefaultInputDevice(); iParams.nChannels = MY_CHANNELS; iParams.firstChannel = 0; oParams.deviceId = audio.getDefaultOutputDevice(); oParams.nChannels = MY_CHANNELS; oParams.firstChannel = 0; // create stream options RtAudio::StreamOptions options; // go for it try { // open a stream audio.openStream( &oParams, &iParams, MY_FORMAT, MY_SRATE, &numFrames, &callme, NULL, &options ); } catch( RtError& e ) { // error! cout << e.getMessage() << endl; exit( 1 ); } // compute bufferBytes = numFrames * MY_CHANNELS * sizeof(SAMPLE); // test RtAudio functionality for reporting latency. cout << "stream latency: " << audio.getStreamLatency() << " frames" << endl; for( int i = 0; i < MY_NUMSTRINGS; i++ ) { // intialize g_ks[i].init( MY_SRATE*2, 440, MY_SRATE ); } // go for it try { // start stream audio.startStream(); char input; std::cout << "Press any key to quit "; std::cin.get(input); // stop the stream. audio.stopStream(); } catch( RtError& e ) { // print error message cout << e.getMessage() << endl; goto cleanup; } cleanup: // close if open if( audio.isStreamOpen() ) audio.closeStream(); delete midiin; // done return 0; }
value rtmidi_in_ignoretypes(value obj, value sysex, value time, value sense) { RtMidiIn *midiin = (RtMidiIn *)(intptr_t)val_float(obj); midiin->ignoreTypes(val_bool(sysex), val_bool(time), val_bool(sense)); return alloc_null(); }
int main( int argc, char *argv[] ) { RtMidiIn *midiin = 0; std::vector<unsigned char> message; int nBytes, i; double stamp; // Minimal command-line check. if ( argc > 2 ) usage(); // RtMidiIn constructor try { midiin = new RtMidiIn(); } catch ( RtError &error ) { error.printMessage(); exit( EXIT_FAILURE ); } // Check available ports vs. specified. unsigned int port = 0; unsigned int nPorts = midiin->getPortCount(); if ( argc == 2 ) port = (unsigned int) atoi( argv[1] ); if ( port >= nPorts ) { delete midiin; std::cout << "Invalid port specifier!\n"; usage(); } try { midiin->openPort( port ); } catch ( RtError &error ) { error.printMessage(); goto cleanup; } // Don't ignore sysex, timing, or active sensing messages. midiin->ignoreTypes( false, false, false ); // Install an interrupt handler function. done = false; (void) signal(SIGINT, finish); // Periodically check input queue. std::cout << "Reading MIDI from port ... quit with Ctrl-C.\n"; while ( !done ) { stamp = midiin->getMessage( &message ); nBytes = message.size(); for ( i=0; i<nBytes; i++ ) std::cout << "Byte " << i << " = " << (int)message[i] << ", "; if ( nBytes > 0 ) std::cout << "stamp = " << stamp << std::endl; // Sleep for 10 milliseconds. SLEEP( 10 ); } // Clean up cleanup: delete midiin; return 0; }
int main (int argc, char ** argv) { //parse tempo if (argc>2) { cerr<<"Error in arguments\n"; printHelp(); exit(1); } else if (argc==2) { g_tempo = atoi(argv[1]); if (g_tempo<40 && g_tempo>200) { cerr<<"Tempo out of bounds!\n"; printHelp(); exit(1); } tempoChange(); } // set up fluid synth stuff // TODO: error checking!!!! g_settings = new_fluid_settings(); g_synth = new_fluid_synth( g_settings ); g_metronome = new_fluid_synth( g_settings ); //fluid_player_t* player; //player = new_fluid_player(g_synth); //fluid_player_add(player, "backing.mid"); //fluid_player_play(player); if (fluid_synth_sfload(g_synth, "piano.sf2", 1) == -1) { cerr << "Error loading sound font" << endl; exit(1); } if (fluid_synth_sfload(g_metronome, "drum.sf2", 1) == -1) { cerr << "Error loading sound font" << endl; exit(1); } // RtAudio config + init // pointer to RtAudio object RtMidiIn * midiin = NULL; RtAudio * audio = NULL; unsigned int bufferSize = 512;//g_sixteenth/100; // MIDI config + init try { midiin = new RtMidiIn(); } catch( RtError & err ) { err.printMessage(); // goto cleanup; } // Check available ports. if ( midiin->getPortCount() == 0 ) { std::cout << "No ports available!\n"; // goto cleanup; } // use the first available port if ( midiin->getPortCount() > 2) midiin->openPort( 1 ); else midiin->openPort( 0 ); // set midi callback midiin->setCallback( &midi_callback ); // Don't ignore sysex, timing, or active sensing messages. midiin->ignoreTypes( false, false, false ); // create the object try { audio = new RtAudio(); cerr << "buffer size: " << bufferSize << endl; } catch( RtError & err ) { err.printMessage(); exit(1); } if( audio->getDeviceCount() < 1 ) { // nopes cout << "no audio devices found!" << endl; exit( 1 ); } // let RtAudio print messages to stderr. audio->showWarnings( true ); // set input and output parameters RtAudio::StreamParameters iParams, oParams; iParams.deviceId = audio->getDefaultInputDevice(); iParams.nChannels = 1; iParams.firstChannel = 0; oParams.deviceId = audio->getDefaultOutputDevice(); oParams.nChannels = 2; oParams.firstChannel = 0; // create stream options RtAudio::StreamOptions options; // set the callback and start stream try { audio->openStream( &oParams, &iParams, RTAUDIO_FLOAT32, MY_SRATE, &bufferSize, &audioCallback, NULL, &options); audio->startStream(); // test RtAudio functionality for reporting latency. cout << "stream latency: " << audio->getStreamLatency() << " frames" << endl; } catch( RtError & err ) { err.printMessage(); goto cleanup; } // wait for user input cout << "Type CTRL+C to quit:"; //initialize graphics gfxInit(&argc,argv); // if we get here, stop! try { audio->stopStream(); } catch( RtError & err ) { err.printMessage(); } // Clean up cleanup: if(audio) { audio->closeStream(); delete audio; } return 0; }