static void test_btic_new_aseq_device_discovered (BT_TEST_ARGS) { BT_TEST_START; if (!seq) return; GST_INFO ("-- arrange --"); GST_INFO ("-- act --"); gint port = snd_seq_create_simple_port (seq, "test-dynamic1", SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ, SND_SEQ_PORT_TYPE_MIDI_GENERIC | SND_SEQ_PORT_TYPE_APPLICATION); check_run_main_loop_for_usec (1000); BtIcDevice *device = btic_registry_get_device_by_name ("alsa sequencer: test-dynamic1"); GST_INFO ("-- assert --"); fail_unless (device != NULL, NULL); GST_INFO ("-- cleanup --"); g_object_unref (device); snd_seq_delete_port (seq, port); BT_TEST_END; }
void midi_uninit() { if (s_midi == NULL) return; snd_midi_event_free(s_midiCoder); snd_seq_port_subscribe_free(s_midiSubscription); snd_seq_delete_port(s_midi, s_midiPort); snd_seq_close(s_midi); s_midi = NULL; }
void free_aseq_output(aseq_output_t *output) { int err = 0; err = snd_seq_delete_port(output->handle, output->port); if (0 != err) output_error("problem while deleting alsa port\n%s\n", snd_strerror(err)); snd_seq_port_info_free(output->info); free(output); }
Alsa::~Alsa() { // Close a connection if it exists. closePort(); // Cleanup. if ( _apiData->vport >= 0 ) snd_seq_delete_port( _apiData->seq, _apiData->vport ); if ( _apiData->coder ) snd_midi_event_free( _apiData->coder ); if ( _apiData->buffer ) free( _apiData->buffer ); snd_seq_close( _apiData->seq ); delete _apiData; }
/** * \brief delete the port * \param seq sequencer handle * \param port port id * \return 0 on success or negative error code * * \sa snd_seq_delete_port(), snd_seq_create_simple_port() */ int snd_seq_delete_simple_port(snd_seq_t *seq, int port) { return snd_seq_delete_port(seq, port); }
void destroy_rtobject(rtobject_t* rtobj){ node_t* temp_node; node_t* ret_node; /*sanity check: make sure we're not removing signal path unwisely*/ if (RTOBJECT_MAJOR_TYPE_SIGNAL_PATH == rtobject_get_major_type(rtobj)){ if ((((signal_path_t*)rtobj->imp_struct)->object_list)){ printf("error: can not destroy signal path with members\n"); return; } if (curr_path == (signal_path_t*)rtobj->imp_struct){ printf("error: can not destroy signal path while inside of it\n"); return; } } /*remove object from parent path*/ if (!rtobj->parent){ printf("destroy rtobject error: rtobject is not in a signal path: data is already corrupted\n"); return; } if (!(temp_node = signal_path_get_node(rtobj->parent, rtobj))){ printf("destroy rtobject error: failed to get object from it's parent, data is already corrupted\n"); return; } if ((signal_path_remove(rtobj->parent, temp_node, 1, &ret_node)) < 0){ printf("destroy rtobj err: failed attempt to remove object from parent path: Data Corruption\n"); return; } free(ret_node); /*destroy alsa sequencer port*/ { int port_id; port_id = rtobject_get_address(rtobj); /*alsa only allows ports from 0 to 256, this is silly but we can only work around*/ if ((port_id >= 0)&&(port_id < 256)){ snd_seq_delete_port(alsa_seq_client_handle, port_id); } } /*destroy all instances*/ while (rtobj->instance_list){ if ((destroy_rtobject_instance(rtobj)) < 0){ printf("WARNING: failed to free all instances for rtobject being freed, memory leaked\n"); break; } } /*deinitialize implementation object*/ if ((destroy_rtobject_imp_object(rtobj)) < 0) printf("WARNING: failed to free implementation object for rtobject being freed, memory leaked\n"); /*remove object from addressing system*/ release_address(rtobject_get_address(rtobj)); /*deallocate object*/ rtobject_dealloca(rtobj); }
bool midi_init() { snd_seq_addr_t sender, receiver; snd_seq_port_info_t *pinfo; snd_seq_client_info_t *cinfo; bool found = false; if (snd_seq_open(&s_midi, "default", SND_SEQ_OPEN_OUTPUT, 0) < 0) { Error("Failed to initialize MIDI\n"); s_midi = NULL; return false; } snd_seq_set_client_name(s_midi, s_midiCaption); /* Create a port to work on */ s_midiPort = snd_seq_create_simple_port(s_midi, s_midiCaption, SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ, SND_SEQ_PORT_TYPE_MIDI_GENERIC); if (s_midiPort < 0) { Error("Failed to initialize MIDI\n"); snd_seq_close(s_midi); s_midi = NULL; return false; } /* Try to find a MIDI out */ snd_seq_port_info_alloca(&pinfo); snd_seq_client_info_alloca(&cinfo); snd_seq_client_info_set_client(cinfo, -1); /* Walk all clients and ports, and see if one matches our demands */ while (snd_seq_query_next_client(s_midi, cinfo) >= 0 && !found) { int client; client = snd_seq_client_info_get_client(cinfo); if (client == 0) continue; snd_seq_port_info_set_client(pinfo, client); snd_seq_port_info_set_port(pinfo, -1); while (snd_seq_query_next_port(s_midi, pinfo) >= 0) { if ((snd_seq_port_info_get_capability(pinfo) & (SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE)) != (SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE)) continue; /* Most linux installations come with a Midi Through Port. * This is 'hardware' support that mostly ends up on your serial, which * you most likely do not have connected. So we skip it by default. */ if (strncmp("Midi Through Port", snd_seq_port_info_get_name(pinfo), 17) == 0) continue; found = true; break; } } if (!found) { Error("No valid MIDI output ports.\n Please install and start Timidity++ like: timidity -iA\n"); snd_seq_delete_port(s_midi, s_midiPort); snd_seq_close(s_midi); s_midi = NULL; return false; } /* Subscribe ourself to the port */ receiver.client = snd_seq_port_info_get_client(pinfo); receiver.port = snd_seq_port_info_get_port(pinfo); sender.client = snd_seq_client_id(s_midi); sender.port = s_midiPort; snd_seq_port_subscribe_malloc(&s_midiSubscription); snd_seq_port_subscribe_set_sender(s_midiSubscription, &sender); snd_seq_port_subscribe_set_dest(s_midiSubscription, &receiver); snd_seq_port_subscribe_set_time_update(s_midiSubscription, 1); snd_seq_port_subscribe_set_time_real(s_midiSubscription, 1); if (snd_seq_subscribe_port(s_midi, s_midiSubscription) < 0) { Error("Failed to subscript to MIDI output\n"); snd_seq_delete_port(s_midi, s_midiPort); snd_seq_close(s_midi); s_midi = NULL; return false; } /* Start the MIDI decoder */ if (snd_midi_event_new(4, &s_midiCoder) < 0) { Error("Failed to initialize MIDI decoder\n"); snd_seq_delete_port(s_midi, s_midiPort); snd_seq_close(s_midi); s_midi = NULL; return false; } snd_midi_event_init(s_midiCoder); return true; }
int main( int argc, char *argv[] ) { jack_client_t *jackClient; snd_seq_t *seqport; struct pollfd *pfd; int npfd; snd_seq_event_t *midievent; int channel, midiport; int note, length, i, j, minpos; double freq, avg, vol, scale, min; double *tempstring; puts( "SO-KL5 v.1.2 by 50m30n3 2009-2011" ); if( argc > 1 ) channel = atoi( argv[1] ); else channel = 0; signal( SIGINT, sig_exit ); signal( SIGTERM, sig_exit ); puts( "Connecting to Jack Audio Server" ); jackClient = jack_client_open( "SO-KL5", JackNoStartServer, NULL ); if( jackClient == NULL ) { fputs( "Cannot connect to Jack Server\n", stderr ); return 1; } jack_on_shutdown( jackClient, jack_shutdown, 0 ); outport = jack_port_register( jackClient, "output", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput | JackPortIsTerminal, 0 ); jack_set_process_callback( jackClient, process, 0 ); samplerate = jack_get_sample_rate( jackClient ); puts( "Initializing synth parameters" ); sustain = 0; cutoff = 64; resonance = 100; attack = 64; volume = 100; fcutoff = (cutoff+5.0)/400.0; sattack = (attack+5.0)/800.0; freso = (resonance/160.0)*(1.0-fcutoff); ssustain = 0.6+pow( sustain/127.0, 0.4)*0.4; for( note=0; note<NUMNOTES; note++ ) { freq = 440.0*pow( 2.0, (note+BASENOTE-69) / 12.0 ); stringcutoff[note] = 0.5 + pow( (double)note / (double)NUMNOTES, 0.5 ) * 0.45; length = round( (double)samplerate / freq ); stringlength[note] = length; strings[note] = malloc( length * sizeof( double ) ); if( strings[note] == NULL ) { fputs( "Error allocating memory\n", stderr ); return 1; } for( i=0; i<length; i++ ) { strings[note][i] = 0.0; } stringpos[note] = 0; status[note] = 0; } freq = 440.0*pow( 2.0, (BASENOTE-69) / 12.0 ); length = (double)samplerate / freq; tempstring = malloc( length * sizeof( double ) ); if( tempstring == NULL ) { fputs( "Error allocating memory\n", stderr ); return 1; } lpval = lplast = 0.0; jack_activate( jackClient ); printf( "Listening on MIDI channel %i\n", channel ); if( snd_seq_open( &seqport, "default", SND_SEQ_OPEN_INPUT, 0 ) < 0 ) { fputs( "Cannot connect to ALSA sequencer\n", stderr ); return 1; } snd_seq_set_client_name( seqport, "SO-KL5" ); midiport = snd_seq_create_simple_port( seqport, "input", SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE, SND_SEQ_PORT_TYPE_APPLICATION ); if( midiport < 0 ) { fputs( "Cannot create ALSA sequencer port\n", stderr ); return 1; } npfd = snd_seq_poll_descriptors_count( seqport, POLLIN ); pfd = (struct pollfd *)malloc( npfd * sizeof( struct pollfd ) ); snd_seq_poll_descriptors( seqport, pfd, npfd, POLLIN ); done = 0; while( ! done ) { if( poll( pfd, npfd, 100000 ) > 0 ) { do { snd_seq_event_input( seqport, &midievent ); if( ( midievent->type == SND_SEQ_EVENT_NOTEON ) && ( midievent->data.note.channel == channel ) ) { note = midievent->data.note.note; if( ( note >= BASENOTE ) && ( note < BASENOTE+NUMNOTES ) ) { note -= BASENOTE; status[note] = 1; for( i=0; i<stringlength[note]; i++ ) { tempstring[i] = ((double)rand()/(double)RAND_MAX)*2.0-1.0; } freq = stringcutoff[note] * 0.25 + midievent->data.note.velocity/127.0 * 0.2 + sattack + 0.1; for( j=0; j<30; j++ ) { tempstring[0] = tempstring[0]*freq + tempstring[stringlength[note]-1]*(1.0-freq); for( i=1; i<stringlength[note]; i++ ) { tempstring[i] = tempstring[i]*freq + tempstring[(i-1)%stringlength[note]]*(1.0-freq); } } avg = 0.0; for( i=0; i<stringlength[note]; i++ ) { avg += tempstring[i]; } avg /= stringlength[note]; scale = 0.0; for( i=0; i<stringlength[note]; i++ ) { tempstring[i] -= avg; if( fabs( tempstring[i] ) > scale ) scale = fabs( tempstring[i] ); } min = 10.0; minpos = 0; for( i=0; i<stringlength[note]; i++ ) { tempstring[i] /= scale; if( fabs( tempstring[i] ) + fabs( tempstring[i] - tempstring[i-1] ) * 5.0 < min ) { min = fabs( tempstring[i] ) + fabs( tempstring[i] - tempstring[i-1] ) * 5.0; minpos = i; } } vol = midievent->data.note.velocity/256.0; for( i=0; i<stringlength[note]; i++ ) { strings[note][(stringpos[note]+i)%stringlength[note]] += tempstring[(i+minpos)%stringlength[note]]*vol; } } } else if( ( midievent->type == SND_SEQ_EVENT_NOTEOFF ) && ( midievent->data.note.channel == channel ) ) { note = midievent->data.note.note; if( ( note >= BASENOTE ) && ( note < BASENOTE+NUMNOTES ) ) { note -= BASENOTE; status[note] = 0; } } else if( ( midievent->type == SND_SEQ_EVENT_CONTROLLER ) && ( midievent->data.control.channel == channel ) ) { if( midievent->data.control.param == 74 ) { cutoff = midievent->data.control.value; fcutoff = (cutoff+5.0)/400.0; printf( "Cutoff: %i \r", cutoff ); fflush( stdout ); } else if( midievent->data.control.param == 71 ) { resonance = midievent->data.control.value; freso = (resonance/140.0)*(1.0-fcutoff); printf( "Resonance: %i \r", resonance ); fflush( stdout ); } else if( midievent->data.control.param == 73 ) { attack = midievent->data.control.value; sattack = (attack+5.0)/800.0; printf( "Attack: %i \r", attack ); fflush( stdout ); } else if( midievent->data.control.param == 7 ) { volume = midievent->data.control.value; printf( "Volume: %i \r", volume ); fflush( stdout ); } else if( ( midievent->data.control.param == 64 ) || ( midievent->data.control.param == 1 ) ) { sustain = midievent->data.control.value; ssustain = 0.6+pow( sustain/127.0, 0.4)*0.4; printf( "Sustain: %i \r", sustain ); fflush( stdout ); } } snd_seq_free_event( midievent ); } while( snd_seq_event_input_pending( seqport, 0 ) > 0 ); } } free( pfd ); snd_seq_delete_port( seqport, midiport ); snd_seq_close( seqport ); jack_deactivate( jackClient ); puts( "Freeing data" ); for( note=0; note<NUMNOTES; note++ ) { free( strings[note] ); } free( tempstring ); jack_port_unregister( jackClient, outport ); jack_client_close( jackClient ); return 0; }
int main( int argc, char *argv[] ) { jack_client_t *jackClient; snd_seq_t *seqport; struct pollfd *pfd; int npfd; snd_seq_event_t *midievent; int channel, midiport; int note, length, i; double freq; puts( "SO-666 v.1.01 by 50m30n3 2009-2010" ); if( argc > 1 ) channel = atoi( argv[1] ); else channel = 0; signal( SIGINT, sig_exit ); signal( SIGTERM, sig_exit ); puts( "Connecting to Jack Audio Server" ); jackClient = jack_client_open( "SO-666", JackNoStartServer, NULL ); if( jackClient == NULL ) { fputs( "Cannot connect to Jack Server\n", stderr ); return 1; } jack_on_shutdown( jackClient, jack_shutdown, 0 ); outport = jack_port_register( jackClient, "output", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput | JackPortIsTerminal, 0 ); jack_set_process_callback( jackClient, process, 0 ); samplerate = jack_get_sample_rate( jackClient ); puts( "Initializing synth parameters" ); feedback = 32; cutoff = 64; resonance = 64; volume = 100; fcutoff = pow( (cutoff+50.0)/200.0, 5.0 ); freso = resonance/127.0; ffeedback = 0.01+pow( feedback/127.0, 4.0)*0.9; for( note=0; note<NUMNOTES; note++ ) { freq = 440.0*pow( 2.0, (note+BASENOTE-69) / 12.0 ); //stringcutoff[note] = ( freq * 16.0 ) / (double)samplerate; stringcutoff[note] = 0.9; length = (double)samplerate / freq; stringlength[note] = length; strings[note] = malloc( length * sizeof( double ) ); if( strings[note] == NULL ) { fputs( "Error allocating memory\n", stderr ); return 1; } for( i=0; i<length; i++ ) { strings[note][i] = 0.0; } stringpos[note] = 0; status[note] = 0; } lpval = lplast = 0.0; hpval = hplast = 0.0; jack_activate( jackClient ); printf( "Listening on MIDI channel %i\n", channel ); if( snd_seq_open( &seqport, "default", SND_SEQ_OPEN_INPUT, 0 ) < 0 ) { fputs( "Cannot connect to ALSA sequencer\n", stderr ); return 1; } snd_seq_set_client_name( seqport, "SO-666" ); midiport = snd_seq_create_simple_port( seqport, "input", SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE, SND_SEQ_PORT_TYPE_APPLICATION ); if( midiport < 0 ) { fputs( "Cannot create ALSA sequencer port\n", stderr ); return 1; } npfd = snd_seq_poll_descriptors_count( seqport, POLLIN ); pfd = (struct pollfd *)malloc( npfd * sizeof( struct pollfd ) ); snd_seq_poll_descriptors( seqport, pfd, npfd, POLLIN ); done = 0; while( ! done ) { if( poll( pfd, npfd, 100000 ) > 0 ) { do { snd_seq_event_input( seqport, &midievent ); if( ( midievent->type == SND_SEQ_EVENT_NOTEON ) && ( midievent->data.note.channel == channel ) ) { note = midievent->data.note.note; if( ( note >= BASENOTE ) && ( note < BASENOTE+NUMNOTES ) ) { note -= BASENOTE; status[note] = 1; } } else if( ( midievent->type == SND_SEQ_EVENT_NOTEOFF ) && ( midievent->data.note.channel == channel ) ) { note = midievent->data.note.note; if( ( note >= BASENOTE ) && ( note < BASENOTE+NUMNOTES ) ) { note -= BASENOTE; status[note] = 0; } } else if( ( midievent->type == SND_SEQ_EVENT_CONTROLLER ) && ( midievent->data.control.channel == channel ) ) { if( midievent->data.control.param == 74 ) { cutoff = midievent->data.control.value; fcutoff = pow( (cutoff+50.0)/200.0, 5.0 ); printf( "Cutoff: %i \r", cutoff ); fflush( stdout ); } else if( midievent->data.control.param == 71 ) { resonance = midievent->data.control.value; freso = resonance/127.0; printf( "Resonance: %i \r", resonance ); fflush( stdout ); } else if( midievent->data.control.param == 7 ) { volume = midievent->data.control.value; printf( "Volume: %i \r", volume ); fflush( stdout ); } else if( midievent->data.control.param == 1 ) { feedback = midievent->data.control.value; ffeedback = 0.01+pow( feedback/127.0, 4.0)*0.9; printf( "Feedback: %i \r", feedback ); fflush( stdout ); } } snd_seq_free_event( midievent ); } while( snd_seq_event_input_pending( seqport, 0 ) > 0 ); } } free( pfd ); snd_seq_delete_port( seqport, midiport ); snd_seq_close( seqport ); jack_deactivate( jackClient ); puts( "Freeing data" ); for( note=0; note<NUMNOTES; note++ ) { free( strings[note] ); } jack_port_unregister( jackClient, outport ); jack_client_close( jackClient ); return 0; }