253 lines
7.1 KiB
C
253 lines
7.1 KiB
C
/*
|
|
This program is free software; you can redistribute it and/or modify it under
|
|
the terms of the GNU General Public License as published by the Free Software
|
|
Foundation; either version 2 of the License, or (at your option) any later
|
|
version. This program is distributed in the hope that it will be useful, but
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
details. You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the...
|
|
|
|
Free Software Foundation, Inc.,
|
|
59 Temple Place, Suite 330, Boston,
|
|
MA 02111-1307 USA
|
|
*/
|
|
|
|
#define MThd 0x4d546864L
|
|
#define MTrk 0x4d54726bL
|
|
#define MTHD 256
|
|
#define MTRK 257
|
|
#define TRKEND 258
|
|
|
|
#define ON note_on
|
|
#define OFF note_off
|
|
#define POPR poly_aftertouch
|
|
#define PAR control_change
|
|
#define PB pitch_wheel
|
|
#define PRCH program_chng
|
|
#define CHPR channel_aftertouch
|
|
#define SYSEX system_exclusive
|
|
|
|
#define ARB 259
|
|
#define MINOR 260
|
|
#define MAJOR 261
|
|
|
|
#define CH 262
|
|
#define NOTE 263
|
|
#define VAL 264
|
|
#define CON 265
|
|
#define PROG 266
|
|
|
|
#define INT 267
|
|
#define STRING 268
|
|
#define STRESC 269
|
|
#define ERR 270
|
|
#define NOTEVAL 271
|
|
#define EOL 272
|
|
|
|
#define META 273
|
|
#define SEQSPEC (META+1+sequencer_specific)
|
|
#define TEXT (META+1+text_event)
|
|
#define COPYRIGHT (META+1+copyright_notice)
|
|
#define SEQNAME (META+1+sequence_name)
|
|
#define INSTRNAME (META+1+instrument_name)
|
|
#define LYRIC (META+1+lyric)
|
|
#define MARKER (META+1+marker)
|
|
#define CUE (META+1+cue_point)
|
|
#define SEQNR (META+1+sequence_number)
|
|
#define KEYSIG (META+1+key_signature)
|
|
#define TEMPO (META+1+set_tempo)
|
|
#define TIMESIG (META+1+time_signature)
|
|
#define SMPTE (META+1+smpte_offset)
|
|
|
|
#define note_off 0x80
|
|
#define note_on 0x90
|
|
#define poly_aftertouch 0xa0
|
|
#define control_change 0xb0
|
|
#define program_chng 0xc0
|
|
#define channel_aftertouch 0xd0
|
|
#define pitch_wheel 0xe0
|
|
#define system_exclusive 0xf0
|
|
#define delay_packet (1111)
|
|
|
|
#define damper_pedal 0x40
|
|
#define portamento 0x41
|
|
#define sostenuto 0x42
|
|
#define soft_pedal 0x43
|
|
#define general_4 0x44
|
|
#define hold_2 0x45
|
|
#define general_5 0x50
|
|
#define general_6 0x51
|
|
#define general_7 0x52
|
|
#define general_8 0x53
|
|
#define tremolo_depth 0x5c
|
|
#define chorus_depth 0x5d
|
|
#define detune 0x5e
|
|
#define phaser_depth 0x5f
|
|
|
|
#define data_inc 0x60
|
|
#define data_dec 0x61
|
|
|
|
#define non_reg_lsb 0x62
|
|
#define non_reg_msb 0x63
|
|
#define reg_lsb 0x64
|
|
#define reg_msb 0x65
|
|
|
|
#define meta_event 0xFF
|
|
#define sequence_number 0x00
|
|
#define text_event 0x01
|
|
#define copyright_notice 0x02
|
|
#define sequence_name 0x03
|
|
#define instrument_name 0x04
|
|
#define lyric 0x05
|
|
#define marker 0x06
|
|
#define cue_point 0x07
|
|
#define channel_prefix 0x20
|
|
#define end_of_track 0x2f
|
|
#define set_tempo 0x51
|
|
#define smpte_offset 0x54
|
|
#define time_signature 0x58
|
|
#define key_signature 0x59
|
|
#define sequencer_specific 0x7f
|
|
|
|
#define Seq_Circuits (0x01) /* Sequential Circuits Inc. */
|
|
#define Big_Briar (0x02) /* Big Briar Inc. */
|
|
#define Octave (0x03) /* Octave/Plateau */
|
|
#define Moog (0x04) /* Moog Music */
|
|
#define Passport (0x05) /* Passport Designs */
|
|
#define Lexicon (0x06) /* Lexicon */
|
|
#define Tempi (0x20) /* Bon Tempi */
|
|
#define Siel (0x21) /* S.I.E.L. */
|
|
#define Kawai (0x41)
|
|
#define Roland (0x42)
|
|
#define Korg (0x42)
|
|
#define Yamaha (0x43)
|
|
|
|
#define lowerbyte(x) ((unsigned char)(x & 0xff))
|
|
#define upperbyte(x) ((unsigned char)((x & 0xff00)>>8))
|
|
#define NULLFUNC 0
|
|
#define MSGINCREMENT 128
|
|
|
|
#ifdef NO_YYLENG_VAR
|
|
#define yyleng yylength
|
|
#endif
|
|
|
|
static FILE *F;
|
|
|
|
static char *Msgbuff = NULL;
|
|
static int Msgsize = 0;
|
|
static int Msgindex = 0;
|
|
|
|
static int TrkNr;
|
|
static int TrksToDo = 1;
|
|
static int Measure, M0, Beat, Clicks;
|
|
static long T0;
|
|
|
|
static int fold = 0;
|
|
static int notes = 0;
|
|
static int times = 0;
|
|
static char *Onmsg = "On ch=%d n=%s v=%d\n";
|
|
static char *Offmsg = "Off ch=%d n=%s v=%d\n";
|
|
static char *PoPrmsg = "PoPr ch=%d n=%s v=%d\n";
|
|
static char *Parmsg = "Par ch=%d c=%d v=%d\n";
|
|
static char *Pbmsg = "Pb ch=%d v=%d\n";
|
|
static char *PrChmsg = "PrCh ch=%d p=%d\n";
|
|
static char *ChPrmsg = "ChPr ch=%d v=%d\n";
|
|
static jmp_buf erjump;
|
|
static int err_cont = 0;
|
|
static int TrkNr;
|
|
static int Format, Ntrks;
|
|
static int Measure, M0, Beat, Clicks;
|
|
static long T0;
|
|
static char* buffer = 0;
|
|
static int buflen,bufsiz= 0;
|
|
|
|
extern long yyval;
|
|
extern int yyleng;
|
|
extern int lineno;
|
|
extern char *yytext;
|
|
extern int do_hex;
|
|
extern int eol_seen;
|
|
extern FILE *yyin;
|
|
|
|
static int mywritetrack();
|
|
static void checkchan();
|
|
static void checknote();
|
|
static void checkval();
|
|
static void splitval();
|
|
static void get16val();
|
|
static void checkcon();
|
|
static void checkprog();
|
|
static void checkeol();
|
|
static void gethex();
|
|
|
|
int (*Mf_getc)() = NULLFUNC;
|
|
int (*Mf_error)() = NULLFUNC;
|
|
int (*Mf_header)() = NULLFUNC;
|
|
int (*Mf_starttrack)() = NULLFUNC;
|
|
int (*Mf_endtrack)() = NULLFUNC;
|
|
int (*Mf_on)() = NULLFUNC;
|
|
int (*Mf_off)() = NULLFUNC;
|
|
int (*Mf_pressure)() = NULLFUNC;
|
|
int (*Mf_parameter)() = NULLFUNC;
|
|
int (*Mf_pitchbend)() = NULLFUNC;
|
|
int (*Mf_program)() = NULLFUNC;
|
|
int (*Mf_chanpressure)() = NULLFUNC;
|
|
int (*Mf_sysex)() = NULLFUNC;
|
|
int (*Mf_arbitrary)() = NULLFUNC;
|
|
int (*Mf_metamisc)() = NULLFUNC;
|
|
int (*Mf_seqnum)() = NULLFUNC;
|
|
int (*Mf_eot)() = NULLFUNC;
|
|
int (*Mf_smpte)() = NULLFUNC;
|
|
int (*Mf_tempo)() = NULLFUNC;
|
|
int (*Mf_timesig)() = NULLFUNC;
|
|
int (*Mf_keysig)() = NULLFUNC;
|
|
int (*Mf_sqspecific)() = NULLFUNC;
|
|
int (*Mf_text)() = NULLFUNC;
|
|
|
|
static readtrack();
|
|
static badbyte();
|
|
static metaevent();
|
|
static sysex();
|
|
static chanmessage();
|
|
static msginit();
|
|
static msgleng();
|
|
static msgadd();
|
|
static biggermsg();
|
|
|
|
float mf_ticks2sec();
|
|
unsigned long mf_sec2ticks(float,int,unsigned int);
|
|
void mfwrite();
|
|
|
|
int (*Mf_putc)() = NULLFUNC;
|
|
int (*Mf_wtrack)() = NULLFUNC;
|
|
int (*Mf_wtempotrack)() = NULLFUNC;
|
|
|
|
int Mf_nomerge = 0;
|
|
long Mf_currtime = 0L;
|
|
|
|
static long Mf_toberead = 0L;
|
|
static long Mf_numbyteswritten = 0L;
|
|
|
|
static long readvarinum();
|
|
static long read32bit();
|
|
static long to32bit();
|
|
static int read16bit();
|
|
static int to16bit();
|
|
static char *msg();
|
|
static void readheader();
|
|
|
|
static int verbose_flag;
|
|
static int dbg=0;
|
|
char data[5];
|
|
int chan;
|
|
int Mf_RunStat = 0;
|
|
static int laststat;
|
|
static int lastmeta;
|
|
int verbose = 0;
|
|
|
|
int filegetc();
|
|
int fileputc();
|
|
void WriteVarLen();
|
|
int eputc(unsigned char);
|