diff options
Diffstat (limited to 'alsa-lib/test/midifile.3')
-rw-r--r-- | alsa-lib/test/midifile.3 | 336 |
1 files changed, 0 insertions, 336 deletions
diff --git a/alsa-lib/test/midifile.3 b/alsa-lib/test/midifile.3 deleted file mode 100644 index 3aadb6d..0000000 --- a/alsa-lib/test/midifile.3 +++ /dev/null @@ -1,336 +0,0 @@ -.TH MIDIFILE 3 -.SH NAME -mfread,mfwrite \- read and write a standard MIDI file -.SH SYNOPSIS -\fC#include "mfread.h" - -mfread () - -.nf -int (*Mf_getc) (); -int (*Mf_putc) (); -int (*Mf_error) (char *msg); -int (*Mf_header) (int format, int ntrks, int division); -int (*Mf_trackstart) (); -int (*Mf_trackend) (); -int (*Mf_noteon) (int chan, int pitch, int vol); -int (*Mf_noteoff) (int chan, int pitch, int vol); -int (*Mf_pressure) (int chan, int pitch, int pressure); -int (*Mf_parameter) (int chan, int control, int value); -int (*Mf_pitchbend) (int chan, int msb, int lsb); -int (*Mf_program) (int chan, int program); -int (*Mf_chanpressure) (int chan, int pressure); -int (*Mf_sysex) (int leng, char *msg); -int (*Mf_metamisc) (int type, int leng, int msg); -int (*Mf_seqspecific) (int type, int leng, int msg); -int (*Mf_seqnum) (int num); -int (*Mf_text) (int type, int leng, int msg); -int (*Mf_eot) (); -int (*Mf_timesig) (int numer, int denom, int clocks, int qnotes); -int (*Mf_smpte) (int hour, int min, int sec, int frame, int fract); -int (*Mf_tempo) (int microsecs); -int (*Mf_keysig) (int sharpflat, int minor); -int (*Mf_arbitrary) (int leng, int msg); -int Mf_nomerge; -long Mf_currtime; -.fi -.sp 1 -mfwrite(int format, int ntracks, int division, FILE *fp) -.sp 1 -.nf -int (*Mf_writetrack)(int track); -int (*Mf_writetempotrack)(); - -void mf_write_midi_event(delta, type, chan, data, size) -unsigned long delta; -unsigned int type,chan,size; -char *data; - -void mf_write_meta_event(delta, type, data, size) -unsigned long delta; -unsigned int type,chan,size; -char *data; - -void mf_write_tempo(tempo) -unsigned long tempo; - -unsigned long mf_sec2ticks(float seconds, int division, int tempo) -float seconds; -int division; -unsigned int tempo; - -float mf_ticks2sec(ticks, division, tempo) -unsigned long ticks; -int division; -unsigned int tempo; -.fi - -.SH DESCRIPTION -The \fCmfread\fR function reads and interprets a standard MIDI file. -To use it you need to understand the general form of a -MIDI file and the type of information it contains, but you don't -need to know much, if anything, about the detailed format of the file -and the mechanics of reading it reliably and portably. - -The \fCmfwrite\fR function writes a standard MIDI file making -use of user-defined functions that access the program's -data structure. To use it you need to define your own Mf_writetrack -routine and then make use of the write_* family of routines to -write out the MIDI data. The \fCmfwrite\fR routine takes -care of the file format and writing the file and track chunk headers. - -.SH READING STANDARD MIDI FILES -A single call to \fCmfread\fR will read an entire MIDI file. -The interface to \fCmfread\fR is a set of external variables -named \fCMf_*\fR, most of which are function pointers to be called -from within \fCmfread\fR during the process of parsing the MIDI file. -Before calling \fCmfread\fR, the only -requirement is that you assign a value -to \fCMf_getc\fR - a pointer to a function that will return -characters from the MIDI file, using \-1 to indicate EOF. -All the rest of the function -pointers are initialized to NULL, and the default action for each -is to do nothing. The following is a complete program using \fCmfread\fR -that could serve as a 'syntax checker' for MIDI files: - -.in +1i -.ft C -.nf -#include <stdio.h> -#include "midifile.h" - -mygetc() -{ - /* use standard input */ - return(getchar()); -} - -main() -{ - Mf_getc = mygetc; - mfread(); - exit(0); -} -.fi -.ft R -.in -1i - -This takes advantage of the default action when an error is detected, which -is to exit silently with a return code of 1. An error function of your -own can be used by giving a value to \fCMf_error\fR; the function will be -called with the error message as an argument. -The other \fCMf_* variables can similarly be used to call arbitrary -functions while parsing the MIDI file. The descriptions below -of the information passed to these functions is sparse; refer to -the MIDI file standard for the complete descriptions. - -\fCMf_header\fR is the first function to be called, and its arguments -contain information from the MIDI file's header; the format (0,1, or 2), -the number of tracks, and the division of a quarter-note that defines -the times units. -\fCMf_trackstart\fR and -\fCMf_trackend\fR are called at the beginning and end of each track. - -Once inside a track, each separate message causes a function to be called. -For example, each note-on message causes \fCMf_noteon\fR to be called -with the channel, pitch, and volume as arguments. The time at which -the message occurred is stored in \fCMf_currtime\fR - one of the few -external variables that isn't a function pointer. The other channel messages -are handled in a similar and obvious fashion - -\fCMf_noteoff\fR, -\fCMf_pressure\fR, -\fCMf_parameter\fR, -\fCMf_pitchbend\fR, -\fCMf_program\fR, -and \fCMf_chanpressure\fR. See the declarations above for the arguments -that are passed to each. - -System exclusive messages are handled by calling \fCMf_sysex\fR, passing -as arguments the message length and a pointer to a static buffer containing -the entire message. -The buffer is expanded when necessary; memory availability is the only limit -to its size. Normally, 'continued' system exclusives are automatically -merged, and \fCMf_sysex\fR is only called once. It you want to disable this -you can set \fCMf_nomerge\fR to 1, causing \fCMf_sysex\fR to be called -once for each part of the message. - -\fCMf_seqnum\fR is called by the \fImeta\fR message that provides -a sequence number, -which if present must appear at the beginning of a track. -The tempo \fImeta\fR message causes \fCMf_tempo\fR to be called; its -argument is the number of microseconds per MIDI quarter-note (24 MIDI clocks). -The end-of-track \fImeta\fR message causes \fCMf_eot\fR to be called. -The key signature \fImeta\fR message causes \fCMf_keysig\fR to be called; -the first argument conveys the number of sharps or flats, the second -argument is 1 if the key is minor. - -The \fCMf_timesig\fR and \fCMf_smpte\fR functions are called when the -corresponding \fImeta\fR messages are seen. See the MIDI file standard -for a description of their arguments. - -The \fItext\fR messages in the MIDI file standard are of the following -types: - -.in +1i -.nf -0x01 Text Event -0x02 Copyright -0x03 Sequence/Track Name -0x04 Instrument -0x05 Lyric -0x06 Marker -0x07 Cue Point -0x08-0x0F Reserved but Undefined -.fi -.in -1i - -\fCMf_text\fR is called for each of these; the arguments are -the type number, the message length, and a pointer to the message buffer. - -Miscellaneous \fImeta\fR messages are handled by \fCMf_metamisc\fR, -sequencer-specific messages are handled by \fCMf_seqspecific\fR, and -arbitrary "escape" messages (started with 0xF7) are handled by -\fCMf_arbitrary\fR. -.SH READING EXAMPLE -The following is a \fCstrings\fR-like program for MIDI files: - -.in +1i -.ft C -.nf -#include <stdio.h> -#include <ctype.h> -#include "midifile.h" - -FILE *F; - -mygetc() { return(getc(F)); } - -mytext(type,leng,msg) -char *msg; -{ - char *p; - char *ep = msg + leng; - - for ( p=msg; p<ep ; p++ ) - putchar( isprint(*p) ? *p : '?' ); - putchar('\n'); -} - -main(argc,argv) -char **argv; -{ - if ( argc > 1 ) - F = fopen(argv[1],"r"); - else - F = stdin; - - Mf_getc = mygetc; - Mf_text = mytext; - - mfread(); - - exit(0); -} -.fi -.ft R -.in -1i -.sp -.SH WRITING STANDARD MIDI FILES -A single call to \fCmfwrite\fR will write an entire MIDI file. Before -calling \fCmfwrite\fR, you must assign values to function pointers -\fCMf_writetrack\fR and \fCMf_putc\fR. The first is a routine to -access your MIDI data structure, which can make use of other library -routines to write the actual MIDI data. The routine -\fCMf_writetrack\fR will be passed a single parameter which is the -number of the track to be written. The pointer \fCMf_putc\fR should be -set to point to a routine that accepts a character as input, writes that -character to a file, and returns the value that was written. In the -case of a format 1 file, a routine has to be written to write a tempo -map, and assigned to the function pointer \fCMf_writetempotrack\fR. -This is because format 1 files assume the first track written is a -tempo track. - -\fCmf_write_midi_event\fR and \fCmf_write_meta_event\fR are routines -that should be called from your \fCMf_writetrack\fR routine to write -out MIDI events. The delta time param is the number of ticks since the -last event. The int "type" is the type of MIDI message. The int "chan" -is the MIDI channel, which can be between 1 and 16. The char pointer -"data" points to an array containing the data bytes, if any exist. The -int "size" is the number of data bytes. - -\fCmf_sec2ticks\fR and \fCmf_ticks2sec\fR are utility routines -to help you convert between the MIDI file parameter of ticks -and the more standard seconds. The int "division" is the same -division parameter from the file header, and tempo is expressed -in microseconds per MIDI quarter-note, or "24ths of a microsecond -per MIDI clock". The division has two meanings, depending on -whether bit 15 is set or not. If bit 15 of division is zero, -bits 14 through 0 represent the number of delta-time "ticks" -which make up a quarter note. If bit 15 of division is a one, -delta-times in a file correspond to subdivisions of a second -similar to SMPTE and MIDI time code. In this format bits -14 through 8 contain one of four values \-24, \-25, \-29, or \-30, -corresponding to the four standard SMPTE and MIDI time code -frame per second formats, where \-29 represents 30 drop frame. -The second byte consisting of bits 7 through 0 corresponds -the the resolution within a frame. Refer the Standard MIDI Files -1.0 spec for more details. - -.SH WRITING EXAMPLE -The following is a simple program to demonstrate writing MIDI files. -The track would consist of a series of quarter notes from lowest to -highest in pitch at constant velocity, each separated by a quarter-note -rest. -.sp -.in +1i -.ft C -.nf -#include <stdio.h> -#include <ctype.h> -#include "midifile.h" - -FILE *fp; -myputc(c) { return(putc(c,fp));} - -int mywritetrack(track) -int track; -{ - int i; - char data[2]; - - /* 120 beats/per/second */ - mf_write_tempo((long)500000); - - for(i = 1 ; i < 128; i++){ - data[0] = i; /* note number */ - data[1] = 64; /* velocity */ - if(!mf_write_midi_event(480,note_on,1,data,2)) - return(\-1); - if(!mf_write_midi_event(480,note_off,1,data,2)) - return(\-1); - } - - return(1); -} /* end of write_track() */ - -main(argc,argv) -char **argv; -{ - if((fp = fopen(argv[1],"w")) == 0L) - exit(1); - - Mf_putc = myputc; - Mf_writetrack = mywritetrack; - - /* write a single track */ - mfwrite(0,1,480,fp); -} -.sp -.fi -.ft R -.in -1i -.sp -.SH AUTHOR -Tim Thompson (att!twitch!glimmer!tjt) -.SH CONTRIBUTORS -Michael Czeiszperger (mike@pan.com) |