初始化内容
This commit is contained in:
Vendored
+170
@@ -0,0 +1,170 @@
|
||||
//*****************************************//
|
||||
// midiout.cpp
|
||||
// by Gary Scavone, 2003-2004.
|
||||
//
|
||||
// Simple program to test MIDI output.
|
||||
//
|
||||
//*****************************************//
|
||||
|
||||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
#include "RtMidi.h"
|
||||
|
||||
// Platform-dependent sleep routines.
|
||||
#if defined(_WIN32)
|
||||
#include <windows.h>
|
||||
#define SLEEP( milliseconds ) Sleep( (DWORD) milliseconds )
|
||||
#else // Unix variants
|
||||
#include <unistd.h>
|
||||
#define SLEEP( milliseconds ) usleep( (unsigned long) (milliseconds * 1000.0) )
|
||||
#endif
|
||||
|
||||
// This function should be embedded in a try/catch block in case of
|
||||
// an exception. It offers the user a choice of MIDI ports to open.
|
||||
// It returns false if there are no ports available.
|
||||
bool chooseMidiPort( RtMidiOut *rtmidi );
|
||||
|
||||
RtMidi::Api chooseMidiApi();
|
||||
|
||||
int main( void )
|
||||
{
|
||||
RtMidiOut *midiout = 0;
|
||||
std::vector<unsigned char> message;
|
||||
|
||||
// RtMidiOut constructor
|
||||
try {
|
||||
midiout = new RtMidiOut(chooseMidiApi());
|
||||
}
|
||||
catch ( RtMidiError &error ) {
|
||||
error.printMessage();
|
||||
exit( EXIT_FAILURE );
|
||||
}
|
||||
|
||||
// Call function to select port.
|
||||
try {
|
||||
if ( chooseMidiPort( midiout ) == false ) goto cleanup;
|
||||
}
|
||||
catch ( RtMidiError &error ) {
|
||||
error.printMessage();
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
// Send out a series of MIDI messages.
|
||||
|
||||
// Program change: 192, 5
|
||||
message.push_back( 192 );
|
||||
message.push_back( 5 );
|
||||
midiout->sendMessage( &message );
|
||||
|
||||
SLEEP( 500 );
|
||||
|
||||
message[0] = 0xF1;
|
||||
message[1] = 60;
|
||||
midiout->sendMessage( &message );
|
||||
|
||||
// Control Change: 176, 7, 100 (volume)
|
||||
message[0] = 176;
|
||||
message[1] = 7;
|
||||
message.push_back( 100 );
|
||||
midiout->sendMessage( &message );
|
||||
|
||||
// Note On: 144, 64, 90
|
||||
message[0] = 144;
|
||||
message[1] = 64;
|
||||
message[2] = 90;
|
||||
midiout->sendMessage( &message );
|
||||
|
||||
SLEEP( 500 );
|
||||
|
||||
// Note Off: 128, 64, 40
|
||||
message[0] = 128;
|
||||
message[1] = 64;
|
||||
message[2] = 40;
|
||||
midiout->sendMessage( &message );
|
||||
|
||||
SLEEP( 500 );
|
||||
|
||||
// Control Change: 176, 7, 40
|
||||
message[0] = 176;
|
||||
message[1] = 7;
|
||||
message[2] = 40;
|
||||
midiout->sendMessage( &message );
|
||||
|
||||
SLEEP( 500 );
|
||||
|
||||
// Sysex: 240, 67, 4, 3, 2, 247
|
||||
message[0] = 240;
|
||||
message[1] = 67;
|
||||
message[2] = 4;
|
||||
message.push_back( 3 );
|
||||
message.push_back( 2 );
|
||||
message.push_back( 247 );
|
||||
midiout->sendMessage( &message );
|
||||
|
||||
// Clean up
|
||||
cleanup:
|
||||
delete midiout;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool chooseMidiPort( RtMidiOut *rtmidi )
|
||||
{
|
||||
std::cout << "\nWould you like to open a virtual output port? [y/N] ";
|
||||
|
||||
std::string keyHit;
|
||||
std::getline( std::cin, keyHit );
|
||||
if ( keyHit == "y" ) {
|
||||
rtmidi->openVirtualPort();
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string portName;
|
||||
unsigned int i = 0, nPorts = rtmidi->getPortCount();
|
||||
if ( nPorts == 0 ) {
|
||||
std::cout << "No output ports available!" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( nPorts == 1 ) {
|
||||
std::cout << "\nOpening " << rtmidi->getPortName() << std::endl;
|
||||
}
|
||||
else {
|
||||
for ( i=0; i<nPorts; i++ ) {
|
||||
portName = rtmidi->getPortName(i);
|
||||
std::cout << " Output port #" << i << ": " << portName << '\n';
|
||||
}
|
||||
|
||||
do {
|
||||
std::cout << "\nChoose a port number: ";
|
||||
std::cin >> i;
|
||||
} while ( i >= nPorts );
|
||||
}
|
||||
|
||||
std::cout << "\n";
|
||||
rtmidi->openPort( i );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
RtMidi::Api chooseMidiApi()
|
||||
{
|
||||
std::vector< RtMidi::Api > apis;
|
||||
RtMidi::getCompiledApi(apis);
|
||||
|
||||
if (apis.size() <= 1)
|
||||
return RtMidi::Api::UNSPECIFIED;
|
||||
|
||||
std::cout << "\nAPIs\n API #0: unspecified / default\n";
|
||||
for (size_t n = 0; n < apis.size(); n++)
|
||||
std::cout << " API #" << apis[n] << ": " << RtMidi::getApiDisplayName(apis[n]) << "\n";
|
||||
|
||||
std::cout << "\nChoose an API number: ";
|
||||
unsigned int i;
|
||||
std::cin >> i;
|
||||
|
||||
std::string dummy;
|
||||
std::getline(std::cin, dummy); // used to clear out stdin
|
||||
|
||||
return static_cast<RtMidi::Api>(i);
|
||||
}
|
||||
Reference in New Issue
Block a user