adding midicomp for midi<-->plain text conversion
This commit is contained in:
parent
ec7e4375c3
commit
2514a62bc8
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -1,3 +1,5 @@
|
||||||
/Java/MoppyDesk/nbproject/private/
|
/Java/MoppyDesk/nbproject/private/
|
||||||
/Java/MoppyDesk/build/
|
/Java/MoppyDesk/build/
|
||||||
/Java/MoppyDesk/dist/
|
/Java/MoppyDesk/dist/
|
||||||
|
midicomp
|
||||||
|
*.o
|
||||||
|
|
30
tools/midicomp-0.0.4/Makefile
Normal file
30
tools/midicomp-0.0.4/Makefile
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
# $Id: makefile.unx,v 1.3 1991/11/15 19:31:00 piet Rel $
|
||||||
|
|
||||||
|
CFLAGS = -O
|
||||||
|
# If you have an old version of flex that defines yyleng
|
||||||
|
# as a macro rather than a variable, uncomment the following line:
|
||||||
|
# CFLAGS = -O -DNO_YYLENG_VAR
|
||||||
|
|
||||||
|
SRCS = midicomp.c t2mf.fl t2mflex.c yyread.c
|
||||||
|
|
||||||
|
EXECS = midicomp
|
||||||
|
|
||||||
|
all: $(EXECS)
|
||||||
|
|
||||||
|
midicomp: midicomp.h midicomp.o t2mf.h t2mflex.o
|
||||||
|
$(CC) midicomp.o t2mflex.o -o midicomp
|
||||||
|
|
||||||
|
t2mflex.c: t2mf.fl
|
||||||
|
flex -i -s -Ce t2mf.fl
|
||||||
|
mv lex.yy.c t2mflex.c
|
||||||
|
|
||||||
|
t2mflex.o: t2mflex.c t2mf.h
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o midicomp
|
||||||
|
|
||||||
|
install:
|
||||||
|
cp midicomp /usr/bin ; mv midicomp midicom.exe
|
||||||
|
|
||||||
|
dist:
|
||||||
|
tar czf midicomp-$$(cat VERSION).tar.gz ./ --exclude=*.html --exclude=*.tar.gz
|
177
tools/midicomp-0.0.4/Readme
Normal file
177
tools/midicomp-0.0.4/Readme
Normal file
|
@ -0,0 +1,177 @@
|
||||||
|
midicomp v0.0.2 20070722 markc@renta.net
|
||||||
|
|
||||||
|
A program to manipulate SMF (Standard MIDI File) files. midicomp will
|
||||||
|
both read and write SMF files in 0 or format 1 and also read and write
|
||||||
|
it's own plain text format. This means a SMF file can be turned into
|
||||||
|
easily parseble text, edited with any text editor or filtered through
|
||||||
|
any script language, and "recompiled" back into a binary SMF file.
|
||||||
|
|
||||||
|
Originally based on mf2t/t2fm by Piet van Oostrum and others. It should
|
||||||
|
build on any linux simply by typing "make" in the source directory.
|
||||||
|
|
||||||
|
Changes:
|
||||||
|
|
||||||
|
v0.0.2 20070722 Fixed gcc4+ compiler bug and exit warnings
|
||||||
|
v0.0.1 20031129 Initial release, combined mf2t+t2fm, added getopt args
|
||||||
|
|
||||||
|
Command line argument usage:
|
||||||
|
|
||||||
|
-d --debug send any debug output to stderr
|
||||||
|
-v --verbose output in columns with notes on
|
||||||
|
-c --compile compile ascii input into SMF
|
||||||
|
-n --note note on/off value as note|octave
|
||||||
|
-t --time use absolute time instead of ticks
|
||||||
|
-fN --fold=N fold sysex data at N columns
|
||||||
|
|
||||||
|
To translate a SMF file to plain ascii format:
|
||||||
|
|
||||||
|
midicomp some.mid # to view as plain text
|
||||||
|
midicomp some.mid > some.asc # to create a text version
|
||||||
|
|
||||||
|
To translate a plain ascii formatted file to SMF:
|
||||||
|
|
||||||
|
midicomp -c some.asc some.mid # input and output filenames
|
||||||
|
midicomp -c some.mid < some.asc # input from stdin with one arg
|
||||||
|
|
||||||
|
midicomp some.mid | somefilter | midicomp -c some2.mid
|
||||||
|
|
||||||
|
Format of the textfile:
|
||||||
|
|
||||||
|
File header: Mfile <format> <ntrks> <division>
|
||||||
|
Start of track: MTrk
|
||||||
|
End of track: TrkEnd
|
||||||
|
|
||||||
|
Note On: On <ch> <note> <vol>
|
||||||
|
Note Off: Off <ch> <note> <vol>
|
||||||
|
Poly Pressure: PoPr[PolyPr] <ch> <note> <val>
|
||||||
|
Channel Pressure: ChPr[ChanPr] <ch> <val>
|
||||||
|
Controller parameter: Par[Param] <ch> <con> <val>
|
||||||
|
Pitch bend: Pb <ch> <val>
|
||||||
|
Program change: PrCh[ProgCh] <ch> <prog>
|
||||||
|
Sysex message: SysEx <hex>
|
||||||
|
Arbutrary midi bytes: Arb <hex>
|
||||||
|
|
||||||
|
Sequence nr: Seqnr <num>
|
||||||
|
Key signature: KeySig <num> <manor>
|
||||||
|
Tempo: Tempo <num>
|
||||||
|
Time signature: TimeSig <num>/<num> <num> <num>
|
||||||
|
SMPTE event: SMPTE <num> <num> <num> <num> <num>
|
||||||
|
|
||||||
|
Meta text events: Meta <texttype> <string>
|
||||||
|
Meta end of track: Meta TrkEnd
|
||||||
|
Sequencer specific: SeqSpec <type> <hex>
|
||||||
|
Misc meta events: Meta <type> <hex>
|
||||||
|
|
||||||
|
The <> have the following meaning:
|
||||||
|
|
||||||
|
<ch> ch=<num>
|
||||||
|
<note> n=<noteval> [note=<noteval>]
|
||||||
|
<vol> v=<num> [vol=<num>]
|
||||||
|
<val> v=<num> [val=<num>]
|
||||||
|
<con> c=<num> [con=<num>]
|
||||||
|
<prog> p=<num> [prog=<num>]
|
||||||
|
<manor> minor or major
|
||||||
|
<noteval> either a <num> or A-G optionally followed by #,
|
||||||
|
followed by <num> without intermediate spaces.
|
||||||
|
<texttype> Text Copyright SeqName TrkName InstrName Lyric Marker Cue
|
||||||
|
<type> a hex number of the form 0xab
|
||||||
|
<hex> a sequence of 2-digit hex numbers (without 0x)
|
||||||
|
separated by space
|
||||||
|
<string> a string between double quotes (like "text").
|
||||||
|
|
||||||
|
Misc notes:
|
||||||
|
|
||||||
|
Channel numbers are 1-based, all other numbers are as they appear in the
|
||||||
|
midifile.
|
||||||
|
|
||||||
|
<division> is either a positive number (giving the time resolution in
|
||||||
|
clicks per quarter note) or a negative number followed by a positive
|
||||||
|
number (giving SMPTE timing).
|
||||||
|
|
||||||
|
<format> <ntrks> <num> are decimal numbers.
|
||||||
|
|
||||||
|
The <num> in the Pb is the real value (two midibytes combined)
|
||||||
|
|
||||||
|
In Tempo it is a long (32 bits) value. Others are in the interval 0-127
|
||||||
|
|
||||||
|
The SysEx sequence contains the leading F0 and the trailing F7.
|
||||||
|
|
||||||
|
In a string certain characters are escaped:
|
||||||
|
|
||||||
|
" and \ are escaped with a \
|
||||||
|
a zero byte is written as \0
|
||||||
|
CR and LF are written as \r and \n respectively
|
||||||
|
other non-printable characters are written as \x<2 hex digits>
|
||||||
|
When -f is given long strings and long hex sequences are folded by inserting
|
||||||
|
\<newline><tab>. If in a string the next character would be a space or
|
||||||
|
tab it will be escaped by \
|
||||||
|
|
||||||
|
midicomp will accept all formats that mf2t can produce, plus a number of
|
||||||
|
others. Input is case insensitive (except in strings) and extra tabs and
|
||||||
|
spaces are allowed. Newlines are required but empty lines are allowed.
|
||||||
|
Comment starts with # at the beginning of a lexical item and continues
|
||||||
|
to the end of the line. The only other places where a # is legal are
|
||||||
|
insides strings and as a sharp symbol in a symbolic note.
|
||||||
|
|
||||||
|
In symbolic notes + and # are allowed for sharp, b and - for flat.
|
||||||
|
|
||||||
|
In bar:beat:click time the : may also be /
|
||||||
|
|
||||||
|
On input a string may also contain \t for a tab, and in a folded
|
||||||
|
string any whitespace at the beginning of a continuation line is skipped.
|
||||||
|
|
||||||
|
Hex sequences may be input without intervening spaces if each byte is
|
||||||
|
given as exactly 2 hex digits.
|
||||||
|
|
||||||
|
Hex sequences may be given where a string is required and vice versa.
|
||||||
|
|
||||||
|
Hex numbers of the form 0xaaa and decimal numbers are equivalent.
|
||||||
|
Also allowed as numbers are "bank numbers" of the form '123. In fact
|
||||||
|
this is equivalent to the octal number 012 (subtract 1 from each
|
||||||
|
digit, digits 1-8 allowed). The letters a-h may also be used for 1-8.
|
||||||
|
|
||||||
|
The input is checked for correctness but not extensively. An
|
||||||
|
errormessage will generally imply that the resulting midifile is illegal.
|
||||||
|
|
||||||
|
channel number can be recognized by the regular expression /ch=/.
|
||||||
|
note numbers by /n=/ or /note=/, program numbers by /p=/ or /prog=/.
|
||||||
|
Meta events by /^Meta/ or /^SeqSpec/.
|
||||||
|
Text events by /"/, continued lines by /\\$/, continuation lines by /$\t/
|
||||||
|
(that was a TAB character).
|
||||||
|
|
||||||
|
In awk each parameter is a field, in perl you can use split to get the
|
||||||
|
parameters (except for strings).
|
||||||
|
|
||||||
|
The following perl script changes note off messages to note on with
|
||||||
|
vol=0, deletes controller 3 changes, makes some note reassignments on
|
||||||
|
channel 10, and changes the channel numbers from channel 1 depending
|
||||||
|
on the track number.
|
||||||
|
|
||||||
|
------------------------------- test.pl -------------------------------
|
||||||
|
%drum = (62, 36, 63, 47, 65, 61, 67, 40, 68, 54);
|
||||||
|
|
||||||
|
while (<>) {
|
||||||
|
next if /c=3/;
|
||||||
|
s/Off(.*)v=[0-9]*/On\1v=0/;
|
||||||
|
if (/ch=10/ && /n=([0-9]*)/ && $drum{$1}) {
|
||||||
|
s/n=$1/"n=".$drum{$1}/e;
|
||||||
|
}
|
||||||
|
if (/^MTrk/) {++$trknr ; print "track $trknr\n";}
|
||||||
|
if ($trknr > 2) { s/ch=1\b/ch=3/; }
|
||||||
|
else { s/ch=1\b/ch=4/; }
|
||||||
|
print || die "Error: $!\n";
|
||||||
|
}
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
|
||||||
|
and this is the corresponding awk script.
|
||||||
|
|
||||||
|
------------------------------- test.awk -------------------------------
|
||||||
|
BEGIN { drum[62] = 36; drum[63] = 47; drum[65] = 61; \
|
||||||
|
drum[67] = 40; drum[68] = 54 }
|
||||||
|
/c=3/ { next }
|
||||||
|
($2 == "Off") { $2 = "On"; $5 = "v=0" }
|
||||||
|
/ch=10/ { n = substr($4, 3); if (n in drum) $4 = "n=" drum[n] }
|
||||||
|
/^MTrk/ { trknr++ }
|
||||||
|
/ch=1 / { if (trknr > 2) { $3 = "ch=2" } else { $3 = "ch=3" } }
|
||||||
|
{ print }
|
||||||
|
------------------------------------------------------------------------
|
1
tools/midicomp-0.0.4/VERSION
Normal file
1
tools/midicomp-0.0.4/VERSION
Normal file
|
@ -0,0 +1 @@
|
||||||
|
0.0.2
|
39
tools/midicomp-0.0.4/ex1-plain.txt
Normal file
39
tools/midicomp-0.0.4/ex1-plain.txt
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
MFile 1 1 384
|
||||||
|
MTrk
|
||||||
|
0 Meta SeqName "Track 1"
|
||||||
|
0 On ch=1 n=48 v=70
|
||||||
|
0 Tempo 500000
|
||||||
|
0 TimeSig 4/4 32 99
|
||||||
|
96 On ch=1 n=48 v=0
|
||||||
|
96 On ch=1 n=50 v=70
|
||||||
|
192 On ch=1 n=50 v=0
|
||||||
|
192 On ch=1 n=52 v=70
|
||||||
|
288 On ch=1 n=52 v=0
|
||||||
|
288 On ch=1 n=53 v=70
|
||||||
|
384 On ch=1 n=53 v=0
|
||||||
|
384 On ch=1 n=55 v=70
|
||||||
|
480 On ch=1 n=55 v=0
|
||||||
|
480 On ch=1 n=57 v=70
|
||||||
|
576 On ch=1 n=57 v=0
|
||||||
|
576 On ch=1 n=59 v=70
|
||||||
|
672 On ch=1 n=59 v=0
|
||||||
|
672 On ch=1 n=60 v=70
|
||||||
|
768 On ch=1 n=60 v=0
|
||||||
|
768 On ch=1 n=62 v=70
|
||||||
|
864 On ch=1 n=62 v=0
|
||||||
|
864 On ch=1 n=60 v=70
|
||||||
|
960 On ch=1 n=60 v=0
|
||||||
|
960 On ch=1 n=59 v=70
|
||||||
|
1056 On ch=1 n=59 v=0
|
||||||
|
1056 On ch=1 n=57 v=70
|
||||||
|
1152 On ch=1 n=57 v=0
|
||||||
|
1152 On ch=1 n=55 v=70
|
||||||
|
1248 On ch=1 n=55 v=0
|
||||||
|
1248 On ch=1 n=53 v=70
|
||||||
|
1344 On ch=1 n=53 v=0
|
||||||
|
1344 On ch=1 n=52 v=70
|
||||||
|
1440 On ch=1 n=52 v=0
|
||||||
|
1440 On ch=1 n=50 v=70
|
||||||
|
1536 On ch=1 n=50 v=0
|
||||||
|
1536 Meta TrkEnd
|
||||||
|
TrkEnd
|
39
tools/midicomp-0.0.4/ex1-verbose.txt
Normal file
39
tools/midicomp-0.0.4/ex1-verbose.txt
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
MFile 1 1 384
|
||||||
|
MTrk
|
||||||
|
000:00:000 Meta SeqName "Track 1"
|
||||||
|
000:00:000 On ch=1 note=c4 vol=70
|
||||||
|
000:00:000 Tempo 500000
|
||||||
|
000:00:000 TimeSig 4/4 32 99
|
||||||
|
000:00:096 On ch=1 note=c4 vol=0
|
||||||
|
000:00:096 On ch=1 note=d4 vol=70
|
||||||
|
000:00:192 On ch=1 note=d4 vol=0
|
||||||
|
000:00:192 On ch=1 note=e4 vol=70
|
||||||
|
000:00:288 On ch=1 note=e4 vol=0
|
||||||
|
000:00:288 On ch=1 note=f4 vol=70
|
||||||
|
000:01:000 On ch=1 note=f4 vol=0
|
||||||
|
000:01:000 On ch=1 note=g4 vol=70
|
||||||
|
000:01:096 On ch=1 note=g4 vol=0
|
||||||
|
000:01:096 On ch=1 note=a4 vol=70
|
||||||
|
000:01:192 On ch=1 note=a4 vol=0
|
||||||
|
000:01:192 On ch=1 note=b4 vol=70
|
||||||
|
000:01:288 On ch=1 note=b4 vol=0
|
||||||
|
000:01:288 On ch=1 note=c5 vol=70
|
||||||
|
000:02:000 On ch=1 note=c5 vol=0
|
||||||
|
000:02:000 On ch=1 note=d5 vol=70
|
||||||
|
000:02:096 On ch=1 note=d5 vol=0
|
||||||
|
000:02:096 On ch=1 note=c5 vol=70
|
||||||
|
000:02:192 On ch=1 note=c5 vol=0
|
||||||
|
000:02:192 On ch=1 note=b4 vol=70
|
||||||
|
000:02:288 On ch=1 note=b4 vol=0
|
||||||
|
000:02:288 On ch=1 note=a4 vol=70
|
||||||
|
000:03:000 On ch=1 note=a4 vol=0
|
||||||
|
000:03:000 On ch=1 note=g4 vol=70
|
||||||
|
000:03:096 On ch=1 note=g4 vol=0
|
||||||
|
000:03:096 On ch=1 note=f4 vol=70
|
||||||
|
000:03:192 On ch=1 note=f4 vol=0
|
||||||
|
000:03:192 On ch=1 note=e4 vol=70
|
||||||
|
000:03:288 On ch=1 note=e4 vol=0
|
||||||
|
000:03:288 On ch=1 note=d4 vol=70
|
||||||
|
001:00:000 On ch=1 note=d4 vol=0
|
||||||
|
001:00:000 Meta TrkEnd
|
||||||
|
TrkEnd
|
BIN
tools/midicomp-0.0.4/ex1.mid
Normal file
BIN
tools/midicomp-0.0.4/ex1.mid
Normal file
Binary file not shown.
1350
tools/midicomp-0.0.4/midicomp.c
Normal file
1350
tools/midicomp-0.0.4/midicomp.c
Normal file
File diff suppressed because it is too large
Load Diff
252
tools/midicomp-0.0.4/midicomp.h
Normal file
252
tools/midicomp-0.0.4/midicomp.h
Normal file
|
@ -0,0 +1,252 @@
|
||||||
|
/*
|
||||||
|
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);
|
121
tools/midicomp-0.0.4/midifile.h
Normal file
121
tools/midicomp-0.0.4/midifile.h
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
/* $Id: midifile.h,v 1.3 1991/11/03 21:50:50 piet Rel $ */
|
||||||
|
|
||||||
|
static readtrack();
|
||||||
|
static badbyte();
|
||||||
|
static metaevent();
|
||||||
|
static sysex();
|
||||||
|
static chanmessage();
|
||||||
|
static msginit();
|
||||||
|
static msgleng();
|
||||||
|
static msgadd();
|
||||||
|
static biggermsg();
|
||||||
|
|
||||||
|
/* definitions for MIDI file parsing code */
|
||||||
|
extern int (*Mf_getc)();
|
||||||
|
extern int (*Mf_header)();
|
||||||
|
extern int (*Mf_starttrack)();
|
||||||
|
extern int (*Mf_endtrack)();
|
||||||
|
extern int (*Mf_on)();
|
||||||
|
extern int (*Mf_off)();
|
||||||
|
extern int (*Mf_pressure)();
|
||||||
|
extern int (*Mf_parameter)();
|
||||||
|
extern int (*Mf_pitchbend)();
|
||||||
|
extern int (*Mf_program)();
|
||||||
|
extern int (*Mf_chanpressure)();
|
||||||
|
extern int (*Mf_sysex)();
|
||||||
|
extern int (*Mf_metamisc)();
|
||||||
|
extern int (*Mf_sqspecific)();
|
||||||
|
extern int (*Mf_seqnum)();
|
||||||
|
extern int (*Mf_text)();
|
||||||
|
extern int (*Mf_eot)();
|
||||||
|
extern int (*Mf_timesig)();
|
||||||
|
extern int (*Mf_smpte)();
|
||||||
|
extern int (*Mf_tempo)();
|
||||||
|
extern int (*Mf_keysig)();
|
||||||
|
extern int (*Mf_arbitrary)();
|
||||||
|
extern int (*Mf_error)();
|
||||||
|
extern long Mf_currtime;
|
||||||
|
extern int Mf_nomerge;
|
||||||
|
|
||||||
|
/* definitions for MIDI file writing code */
|
||||||
|
extern int (*Mf_putc)();
|
||||||
|
extern int (*Mf_wtrack)();
|
||||||
|
extern int (*Mf_wtempotrack)();
|
||||||
|
float mf_ticks2sec();
|
||||||
|
unsigned long mf_sec2ticks();
|
||||||
|
void mfwrite();
|
||||||
|
|
||||||
|
/* MIDI status commands most significant bit is 1 */
|
||||||
|
#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)
|
||||||
|
|
||||||
|
/* 7 bit controllers */
|
||||||
|
#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
|
||||||
|
|
||||||
|
/* parameter values */
|
||||||
|
#define data_inc 0x60
|
||||||
|
#define data_dec 0x61
|
||||||
|
|
||||||
|
/* parameter selection */
|
||||||
|
#define non_reg_lsb 0x62
|
||||||
|
#define non_reg_msb 0x63
|
||||||
|
#define reg_lsb 0x64
|
||||||
|
#define reg_msb 0x65
|
||||||
|
|
||||||
|
/* Standard MIDI Files meta event definitions */
|
||||||
|
#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
|
||||||
|
|
||||||
|
/* Manufacturer's ID number */
|
||||||
|
#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)
|
||||||
|
|
||||||
|
/* miscellaneous definitions */
|
||||||
|
#define MThd 0x4d546864L
|
||||||
|
#define MTrk 0x4d54726bL
|
||||||
|
#define lowerbyte(x) ((unsigned char)(x & 0xff))
|
||||||
|
#define upperbyte(x) ((unsigned char)((x & 0xff00)>>8))
|
98
tools/midicomp-0.0.4/t2mf.fl
Normal file
98
tools/midicomp-0.0.4/t2mf.fl
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
/* $Id: t2mf.fl,v 1.3 1991/11/15 19:31:00 piet Rel $ */
|
||||||
|
|
||||||
|
%{
|
||||||
|
|
||||||
|
#include "t2mf.h"
|
||||||
|
|
||||||
|
#ifdef NO_YYLENG_VAR
|
||||||
|
int yylength;
|
||||||
|
#define YY_USER_ACTION yylength = yyleng
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int do_hex = 0;
|
||||||
|
int eol_seen = 0;
|
||||||
|
int lineno = 1;
|
||||||
|
long yyval;
|
||||||
|
long bankno();
|
||||||
|
|
||||||
|
%}
|
||||||
|
|
||||||
|
Hex [0-9a-f]
|
||||||
|
|
||||||
|
%x QUOTE
|
||||||
|
%x HEX
|
||||||
|
%%
|
||||||
|
if (do_hex) {
|
||||||
|
BEGIN(HEX);
|
||||||
|
do_hex = 0;
|
||||||
|
}
|
||||||
|
eol_seen = 0;
|
||||||
|
|
||||||
|
<INITIAL,HEX>[ \t\r] /* skip whitespace */;
|
||||||
|
<INITIAL,HEX>"#".*\n /* skip comment */ lineno++;
|
||||||
|
|
||||||
|
MFile return MTHD;
|
||||||
|
MTrk return MTRK;
|
||||||
|
TrkEnd return TRKEND;
|
||||||
|
|
||||||
|
On return ON;
|
||||||
|
Off return OFF;
|
||||||
|
Po(ly)?Pr return POPR;
|
||||||
|
Par(am)? return PAR;
|
||||||
|
Pb return PB;
|
||||||
|
Pr(og)?Ch return PRCH;
|
||||||
|
Ch(an)?Pr return CHPR;
|
||||||
|
SysEx return SYSEX;
|
||||||
|
Meta return META;
|
||||||
|
SeqSpec return SEQSPEC;
|
||||||
|
Text return TEXT;
|
||||||
|
Copyright return COPYRIGHT;
|
||||||
|
TrkName|SeqName return SEQNAME;
|
||||||
|
InstrName return INSTRNAME;
|
||||||
|
Lyric return LYRIC;
|
||||||
|
Marker return MARKER;
|
||||||
|
Cue return CUE;
|
||||||
|
SeqNr return SEQNR;
|
||||||
|
KeySig return KEYSIG;
|
||||||
|
Tempo return TEMPO;
|
||||||
|
TimeSig return TIMESIG;
|
||||||
|
SMPTE return SMPTE;
|
||||||
|
Arb return ARB;
|
||||||
|
[:/] return '/';
|
||||||
|
|
||||||
|
minor return MINOR;
|
||||||
|
major return MAJOR;
|
||||||
|
|
||||||
|
ch= return CH;
|
||||||
|
n(ote)?= return NOTE;
|
||||||
|
v([oa]l)?= return VAL;
|
||||||
|
c(on)?= return CON;
|
||||||
|
p(rog)?= return PROG;
|
||||||
|
|
||||||
|
[-+]?[0-9]+ sscanf (yytext, "%ld", &yyval); return INT;
|
||||||
|
0x{Hex}+ sscanf (yytext+2, "%lx", &yyval); return INT;
|
||||||
|
\$[A-H1-8]+ yyval = bankno (yytext+1, yyleng-1); return INT;
|
||||||
|
<HEX>{Hex}{Hex}? sscanf (yytext, "%lx", &yyval); return INT;
|
||||||
|
|
||||||
|
[a-g][#b+-]?[0-9]+ return NOTEVAL;
|
||||||
|
|
||||||
|
<INITIAL,HEX>\" BEGIN (QUOTE);
|
||||||
|
<QUOTE>[^\\"\n]* yymore();
|
||||||
|
<QUOTE>\" BEGIN (0); return STRING;
|
||||||
|
<QUOTE>\\(.|\n) yymore();
|
||||||
|
<QUOTE>\n { error ("unterminated string");
|
||||||
|
lineno++; eol_seen++; BEGIN(0); return EOL;
|
||||||
|
}
|
||||||
|
<QUOTE><<EOF>> error ("EOF in string"); return EOF;
|
||||||
|
|
||||||
|
<INITIAL,HEX>\\[ \t\r]*\n lineno++;
|
||||||
|
<INITIAL,HEX>\n lineno++; eol_seen++; BEGIN(0); return EOL;
|
||||||
|
|
||||||
|
<HEX>[g-z][a-z]+ BEGIN (0); return ERR;
|
||||||
|
<HEX>. BEGIN (0); return ERR;
|
||||||
|
[a-z]+ return ERR;
|
||||||
|
. return ERR;
|
||||||
|
|
||||||
|
<<EOF>> return EOF;
|
||||||
|
|
||||||
|
%%
|
48
tools/midicomp-0.0.4/t2mf.h
Normal file
48
tools/midicomp-0.0.4/t2mf.h
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/* $Id: t2mf.h,v 1.2 1991/11/03 21:50:50 piet Rel $ */
|
||||||
|
#include "midifile.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#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)
|
1385
tools/midicomp-0.0.4/t2mflex.c
Normal file
1385
tools/midicomp-0.0.4/t2mflex.c
Normal file
File diff suppressed because it is too large
Load Diff
39
tools/midicomp-0.0.4/yyread.c
Normal file
39
tools/midicomp-0.0.4/yyread.c
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
/* $Id: yyread.c,v 1.2 1991/11/03 21:53:20 piet Rel $ */
|
||||||
|
/* sozobon version */
|
||||||
|
|
||||||
|
#include <memory.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* read, ignoring CR's
|
||||||
|
*
|
||||||
|
* ++jrb
|
||||||
|
*/
|
||||||
|
int _yyread(fd, buf, size)
|
||||||
|
int fd; char *buf; int size;
|
||||||
|
{
|
||||||
|
int count = read(fd, buf, size);
|
||||||
|
int done = 0, i;
|
||||||
|
|
||||||
|
if(count <= 0)
|
||||||
|
return count;
|
||||||
|
|
||||||
|
do{
|
||||||
|
for(i = done; i < (done+count); i++)
|
||||||
|
{
|
||||||
|
if(buf[i] == '\r')
|
||||||
|
{
|
||||||
|
if(i < done + count - 1)
|
||||||
|
bcopy(&buf[i+1], &buf[i], (count -1 - (i - done)));
|
||||||
|
count -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
done += count;
|
||||||
|
if(done == size)
|
||||||
|
return done;
|
||||||
|
count = read(fd, &buf[done], (size - done));
|
||||||
|
} while(count > 0);
|
||||||
|
|
||||||
|
return done;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user