Hi, i'm developing an ear-trainer (an application to improve musical ears) and i must
use the MIDI synth to play out chords, but i can't let the alsa sequencer work.
My code doesn't return any error, i just can't hear anything. If i do it via the
RawMIDI API, it works fine (but it's, bleahh, horrible to use).
I thought it was because i didn't assign any path/instrument to the midi channels, so
i tried to set them via RawMIDI, but it still doesn't work.
Here is the code:
#include <alsa/asoundlib.h>
snd_rawmidi_t *handle_out;
void set_chan_instr( int chan, int instrument ) { // sets patch/instrument number on a
channel
int ch = 0xC0 + chan;
snd_rawmidi_write(handle_out, &ch, 1);
ch = instrument;
snd_rawmidi_write(handle_out, &ch, 1);
}
snd_seq_t *open_client() { // creates a client
snd_seq_t *handle;
int err;
err = snd_seq_open(&handle, "default", SND_SEQ_OPEN_DUPLEX, 0);
if (err < 0)
return NULL;
snd_seq_set_client_name(handle, "My Client");
return handle;
}
int main() {
snd_seq_t *seq;
snd_seq_queue_tempo_t *tempo;
snd_seq_event_t ev;
snd_seq_port_info_t *port_info, *wavetable;
int port;
int queue;
// now we try to set up channel 0 via RawMIDI
if ( snd_rawmidi_open( NULL, &handle_out, "hw:0,1", 0) ) {
printf( "snd_rawmidi_open() failed\n" );
return -1;
}
// ok, let's assign instrument #4
set_chan_instr( 0, 4 );
// we create a client...
if ( ( seq = open_client() ) == NULL ) {
printf( "Error in: snd_seq_open" );
return -1;
}
// and a port
port = snd_seq_create_simple_port(seq, "my port", SND_SEQ_PORT_CAP_DUPLEX,
SND_SEQ_PORT_TYPE_APPLICATION);
queue = snd_seq_alloc_queue(seq); // do allocate a queue
snd_seq_queue_tempo_alloca(&tempo);
snd_seq_queue_tempo_set_ppq(tempo, 96); // 96 pulses per quarter
snd_seq_queue_tempo_set_tempo(tempo, 1000000); // 60 BPM
snd_seq_set_queue_tempo(seq, queue, tempo);
snd_seq_ev_clear(&ev);
snd_seq_ev_set_dest(&ev, 65, 0); // 65:0 works fine with pmidi!
snd_seq_ev_set_source(&ev, port);
snd_seq_ev_schedule_tick(&ev, queue, 0, 4); // starts at 4 ticks
snd_seq_ev_set_note(&ev, 0, 60, 127, 8); // length 8 ticks
snd_seq_event_output(seq, &ev);
snd_seq_ev_schedule_tick(&ev, queue, 0, 12);
snd_seq_ev_set_note(&ev, 0, 67, 127, 8);
// let's play! (we hope..)
snd_seq_event_output(seq, &ev);
snd_seq_drain_output(seq);
snd_seq_start_queue(seq, queue, NULL);
snd_seq_drain_output(seq);
return 0;
}
Note that i can play midi files using pmidi on port 65:0.
Hope you can help me,
Marco
--
Hardware is never old.
People just choose the wrong OS.
-------------------------------------------------------
The SF.Net email is sponsored by EclipseCon 2004
Premiere Conference on Open Tools Development and Integration
See the breadth of Eclipse activity. February 3-5 in Anaheim, CA.
http://www.eclipsecon.org/osdn
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel