All of lore.kernel.org
 help / color / mirror / Atom feed
* example of sending note on/off to MIDI port (Timidity's virtual sequencer)
@ 2005-10-20 21:05 Brolin Empey
  2005-10-20 23:17 ` Lee Revell
  0 siblings, 1 reply; 3+ messages in thread
From: Brolin Empey @ 2005-10-20 21:05 UTC (permalink / raw)
  To: alsa-devel

Hello,

I want to add ALSA support to a MIDI program I wrote (in C) which 
currently supports only the Win32 API (using midiOutShortMsg).  More 
specifically, I want to do this using Timidity's virtual sequencer for 
playback of the output MIDI messages.  I can use playmidi (which uses 
the OSS API) or pmidi (which uses ALSA's API) to play MIDI files using 
Timidity's port (128:0).  After studying both of these application's 
sources, I tried without success to put together a minimal test program 
to simply send a note on and subsequent note off message using 
Timidity's port.

Does anyone have a simple example of how to do this?  It can use either 
the OSS API (e.g. /dev/sequencer interface) or ALSA's library.  I tried 
the rawmidi example, but could not get it to play anything using 
Timidity's port.

Thanks,
Brolin


-------------------------------------------------------
This SF.Net email is sponsored by:
Power Architecture Resource Center: Free content, downloads, discussions,
and more. http://solutions.newsforge.com/ibmarch.tmpl

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: example of sending note on/off to MIDI port (Timidity's virtual sequencer)
  2005-10-20 21:05 example of sending note on/off to MIDI port (Timidity's virtual sequencer) Brolin Empey
@ 2005-10-20 23:17 ` Lee Revell
  2005-10-21  3:19   ` Brolin Empey
  0 siblings, 1 reply; 3+ messages in thread
From: Lee Revell @ 2005-10-20 23:17 UTC (permalink / raw)
  To: Brolin Empey; +Cc: alsa-devel

On Thu, 2005-10-20 at 14:05 -0700, Brolin Empey wrote:
> Hello,
> 
> I want to add ALSA support to a MIDI program I wrote (in C) which 
> currently supports only the Win32 API (using midiOutShortMsg).  More 
> specifically, I want to do this using Timidity's virtual sequencer for 
> playback of the output MIDI messages.  I can use playmidi (which uses 
> the OSS API) or pmidi (which uses ALSA's API) to play MIDI files using 
> Timidity's port (128:0).  After studying both of these application's 
> sources, I tried without success to put together a minimal test program 
> to simply send a note on and subsequent note off message using 
> Timidity's port.
> 
> Does anyone have a simple example of how to do this?  It can use either 
> the OSS API (e.g. /dev/sequencer interface) or ALSA's library.  I tried 
> the rawmidi example, but could not get it to play anything using 
> Timidity's port.

You forgot to include a link to your code.

Lee



-------------------------------------------------------
This SF.Net email is sponsored by:
Power Architecture Resource Center: Free content, downloads, discussions,
and more. http://solutions.newsforge.com/ibmarch.tmpl

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: example of sending note on/off to MIDI port (Timidity's virtual sequencer)
  2005-10-20 23:17 ` Lee Revell
@ 2005-10-21  3:19   ` Brolin Empey
  0 siblings, 0 replies; 3+ messages in thread
From: Brolin Empey @ 2005-10-21  3:19 UTC (permalink / raw)
  To: alsa-devel

Lee Revell wrote:
> On Thu, 2005-10-20 at 14:05 -0700, Brolin Empey wrote:
>> Hello,
>>
>> I want to add ALSA support to a MIDI program I wrote (in C) which 
>> currently supports only the Win32 API (using midiOutShortMsg).  More 
>> specifically, I want to do this using Timidity's virtual sequencer for 
>> playback of the output MIDI messages.  I can use playmidi (which uses 
>> the OSS API) or pmidi (which uses ALSA's API) to play MIDI files using 
>> Timidity's port (128:0).  After studying both of these application's 
>> sources, I tried without success to put together a minimal test program 
>> to simply send a note on and subsequent note off message using 
>> Timidity's port.
>>
>> Does anyone have a simple example of how to do this?  It can use either 
>> the OSS API (e.g. /dev/sequencer interface) or ALSA's library.  I tried 
>> the rawmidi example, but could not get it to play anything using 
>> Timidity's port.
> 
> You forgot to include a link to your code.
> 
> Lee

I don't think this will be too helpful since I used a bunch of functions 
from the pmidi source.  I was asking if anyone had a working example 
because I wanted something simple that worked and that I could build 
upon.  I was under the impression that what I wanted to do seemed to be 
quite complex, especially compared to using the Win32 API to do the same 
thing.  This impression may be quite wrong though, since I haven't 
studied the documentation too much and was hoping to just piece 
something together from pmidi.

=======================================================================

#define HAVE_ALSA_ASOUNDLIB_H 1

#include "glib.h"
#include "elements.h"
#include "except.h"
#include "intl.h"

#include "seqlib.h"
#include "md.h"
#include "midi.h"

#include <alsa/asoundlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <getopt.h>
#include <string.h>
#include <errno.h>
#include <signal.h>

int
main(int argc, char **argv)
{
	static char optstring[] = "p:";
   	static struct option longopts[] = {
	  { "port",      required_argument,            0,              'p' },
	  { 0,      0,            0,              0 },
	};
	int ex=0, ch=0, client=0, port=0, i=0, j=0, k=0, l=0;
	char *cp;
	//char n[3];
	seq_context_t *ctxp;
	snd_seq_event_t ev;

	/*
	for (i=0; i<sizeof(n)/sizeof(n[0]); i++)
	{
	  n[i] = 0;
	}
	*/
	//memset(n, 0, sizeof(n)/sizeof(n[0]));

	while ( (ex == 0) && ( (ch = getopt_long(argc, argv, optstring, 
longopts, NULL)) != EOF) )
	{
		switch (ch)
		{
			case 'p':
			  if (!optarg)
			  {
			    exit(1);
			  }
			  /*
			  cp = strchr(optarg, ':');
			  printf("optarg start = %d, : = %d\n", &optarg, &cp[0]);
			  printf("client = %s\n", cp);
			  */
			  for (i=0; i<strlen(optarg); i++)
			  {
			    if (optarg[i] == ':')
			    {
			      j = i;
			      break;
			    }
			  }
			  // printf("':' at %d chars from start.\n", j);
			  if (j > 0)
			  {
			    cp = calloc(j+1, sizeof(optarg[0]));
			    for (i=0; i<j; i++)
			    {
			      cp[i] = optarg[i];
			    }
			    //printf("client (as string) = %s\n", cp);
			    client = atoi(cp);
			    //printf("client (as int) = %d\n", client);
			    free(cp);

			    k = strlen(optarg)-(j+1);
			    //printf("k = %d\n", k);
			    if (k>0)
			    {
			      cp = calloc(k, sizeof(optarg[0]));
			      //printf("strlen(optarg)-(j+1) = %d\n", strlen(optarg)-(j+1));
			      //printf("j = %d\n", j);
			      l = j+1;
			      for (i=0; i<k; i++)
			      {
				//printf("i = %d\n", i);
				cp[i] = optarg[l];
				l++;
			      }
			      //printf("port (as string) = %s\n", cp);
			      port = atoi(cp);
			      //printf("port (as int) = %d\n", port);
			      free(cp);
			    }
			  }
			  break;
		default:
		  ex = 1;
		  break;
		}
	}
	if (ex)
	{
	  return ex;
	}

	ctxp = seq_create_context();

	if (seq_connect_add(ctxp, client, port) < 0)
	{
	  fprintf(stderr, "Could not connect to port %d:%d\n", client, port);
	  return 1;
	}

	seq_midi_event_init(ctxp, &ev, 1000, 0);

	seq_init_tempo(ctxp, 8, 120, 1);
	seq_start_timer(ctxp);
	seq_midi_program(ctxp, &ev, 0, 0);

	seq_midi_note(ctxp, &ev, 0, 60, 127, 1000);
	sleep(5);

	seq_free_context(ctxp);
	
	return ex;
}


-------------------------------------------------------
This SF.Net email is sponsored by:
Power Architecture Resource Center: Free content, downloads, discussions,
and more. http://solutions.newsforge.com/ibmarch.tmpl

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2005-10-21  3:19 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-10-20 21:05 example of sending note on/off to MIDI port (Timidity's virtual sequencer) Brolin Empey
2005-10-20 23:17 ` Lee Revell
2005-10-21  3:19   ` Brolin Empey

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.