[comp.sources.amiga] v90i275: MIDIstuff 1.0 - midi tool package, Part01/01

amiga-request@abcfd20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (10/11/90)

Submitted-by: "Carlo 'Lynx' v. Loesch " <loesch@lan.informatik.tu-muenchen.dbp.de>
Posting-number: Volume 90, Issue 275
Archive-name: midi/midistuff-1.0/part01

[ a uuencoded private library and two power window files enclosed.
  see comp.binaries.amiga for executables  ...tad ]

This is the MIDIstuff package, 4 modules that make use of the MidiLib.
MIDIkeys displays incoming notes on a piano keyboard and simulates a
piano keyboard on the Amiga keyboard.  MIDIrec is a simple MIDI
Recorder, very simple, MIDIdump is a very simple SystemExclusive
storage utility and the MIDIclock is an unreliable Clock generator :-)

#!/bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 1 (of 1)."
# Contents:  PRO_README README lib lib/ynx.lib.uu src src/ClockPOW.c
#   src/MAKEFILE src/MIDIclock.c src/MIDIclock.uu src/MIDIdump.c
#   src/MIDIkeys.c src/MIDIrec.POW.uu src/MIDIrec.c src/RecPOW.c
# Wrapped by tadguy@abcfd20 on Wed Oct 10 20:14:29 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'PRO_README' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'PRO_README'\"
else
echo shar: Extracting \"'PRO_README'\" \(3310 characters\)
sed "s/^X//" >'PRO_README' <<'END_OF_FILE'
XM	I	D	I	S	T	U	F	F
X~	~	~	~	~	~	~	~	~
X
X	Release 1.0 - - - MIDIstuff part I - - - Date: 16 Aug 1990
X			PROGRAMMER'S README
X
XList of files the sources package should include:
X~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
XREADME		Same as with binaries package
XPRO_README	Additional info and copyright notice
X
Xlib		Compiler libraries used with MIDIstuff, MANX library format.
Xlib/ynx.lib	Some simple routines of mine, sources can be obtained from me.
X		The MIDI.lib and A.lib (ARP) are *not* included here, get
X		yourself the current releases of it, and hope my stuff
X		cooperates! :-)
X
Xsrc/ClockPOW.c		Powerwindows output of MIDIclock.POW
Xsrc/MAKEFILE
Xsrc/MIDIclock.c
Xsrc/MIDIclock.POW	Powerwindows file for MIDIclock
Xsrc/MIDIdump.c
Xsrc/MIDIkeys.c
Xsrc/MIDIrec.c
Xsrc/MIDIrec.POW		Powerwindows file for MIDIrec
Xsrc/RecPOW.c		Powerwindows output of MIDIrec.POW
X
XCOPYRIGHT NOTICE
X The sources package is placed into freeware, which in my eyes means that
X you are free to use and copy the package and modify it for own private
X purposes, any commercial purposes need my permission.
X
XCONTACT
X I'd really like to be in contact with anyone who wants to work on this
X software, I *do* want to work with others, so if you have suggestions /
X improvements / bug fixes send'em right up to me. If you post things into
X NetNews I might not notice. My address is in the other README. Every
X help will be acknowledged when included with future releases.
X
XBUGS
X Here's some additional information for MIDI programmers about the
X
XMIDIclock	V1.0	"MIDI Clock Generator"
X~~~~~~~~~
X Sometimes the MIDIclock goes into overhead, i tried to
X react trying to flush timer requests and starting anew, but
X somehow requests can survive and after some time hang up
X the machine, as a warning the clock toggles the power led
X everytime an overhead is detected, I guess the whole thing
X should be replaced by accuracy calculations, well, they're
X there, they just don't do what they're supposed to. One
X more problem, the prop gadget doesn't work the way it
X should, too! Avoid moving it while the clock is started!
X
X	#define's
X	 ~~~~~~~~
X	VBLANK:		use the VBLANK unit instead of MICROHZ
X	OVERHEAD_HANDLE	enable the little overhead checking routine
X	ACCURACY	try to be more accurate by time calculations
X	CLOCKPRIO	the task priority of the clock, or undefine it.
X
XFuture enhancements:	(hopefully, if I can afford the time...)
X The next thing to do is a "Human Feel" Quantizer for the MIDI Recorder,
X this might surprise you, since such a feature is only to be found with
X the best sequencer packages, but I currently use quite good sequencer
X software on the C64 (!) called SuperTrack, the human quantize is the
X feature I miss most on that program, I already wrote a "Groove" Quantizer
X in BASIC (!), but it's a drag, so this is what I want to have next!
X Then I will look into structure enhancements hoping to create the
X "Lord of Sequence" that I have been fantasizing about for years, a
X really complex MIDI Sequencer, the first to be "ShareWare" (!) I hope!
X Btw, I wonder if anyone wrote that "Graphic MIDI Router" the programmer
X of the midi.library was dreaming about in his "Simple MIDI Route" program.
X
XFINALLY...
X This package was developed on an Amy 500 with Harddisk & 1M FastRAM.
X I wonder if it worx under Kick 2.0...
X
X
X(*lynx*)
END_OF_FILE
if test 3310 -ne `wc -c <'PRO_README'`; then
    echo shar: \"'PRO_README'\" unpacked with wrong size!
fi
chmod +x 'PRO_README'
# end of 'PRO_README'
fi
if test -f 'README' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'README'\"
else
echo shar: Extracting \"'README'\" \(7437 characters\)
sed "s/^X//" >'README' <<'END_OF_FILE'
X	M	I	D	I	S	T	U	F	F
X	~	~	~	~	~	~	~	~	~
X
X	Release 1.0 - - - MIDIstuff part I - - - Date: 16 Aug 1990
X
X        Ok, so this is my little MIDI tool package. It's the first
X             release, it's my first Amiga release anyway. :-)
X      Introducing: This package contains 4 little tools that use the
X      MIDI.library so that they can use MIDI at the same time and can
X                   easily be combined in a modular way.
X
XMIDIkeys	V1.0	"Virtual MIDI Keyboard"
X~~~~~~~~
X Simulates a MIDI keyboard by painting a 10-octave (!) (full MIDI note range)
X into a window, all incoming MIDI notes (kinda OMNI ON) are displayed by
X highlighting the keys, the colours change depending on the velocity, when
X the window is activated a piano keyboard is simulated on the Amiga keyboard
X which is converted into outgoing MIDI events. Input and output streams are
X by default sent to the MIDI interface.
X
X	SYNOPSYS: [run] MIDIkeys [-i <Input>] [-o <Output>] [-t] [<Name>]
X	~~~~~~~~
X With the <i> and <o> options MIDI input & output streams can be redirected,
X if a stream doesn't exist then the keyboard simply won't have it, e.g.
X "MIDIkeys -i none" will cause MIDIkeys to not have any input to show.
X The <t> enables an additional "thru" route between the input and output.
X The <Name> is by default "Keyboard", it is the name used in the public MIDI
X routing lists, you can use an other if you use more than one keyboard, the
X new name will appear in the titlebar of the window.
X
X For other notifications the screen titlebar is used. MIDIkeys has a few
X special keys: Right-Amiga-[`] toggles MIDI thru, also F10 does.
X F2 and F1 respectively increment and decrement the channel the keyboard
X sends on, which by default is 1.
X And there also is a silly surprise key hidden somewhere...
X
XMIDIdump	V1.0	"Simple MIDI SysX Dumper"
X~~~~~~~~
X Receives & Sends MIDI "System Exclusive" data, (sysx, patch data for
X synthesizers etc.). Data can be stored and retrieved from DOS.
X
X	SYNOPSYS: [run] MIDIdump
X	~~~~~~~~
X This tool always connects directly to the MIDI ports. It allocates 50000
X bytes of buffer space for sysx data at startup. It opens a text window
X and displays the list of commands, it uses the ARP FileRequester for
X data storage. The program is self-explicatory (I hope!).
X
XMIDIrec		V1.0	"Little MIDI Recorder"
X~~~~~~~
X Records or plays back note data from the musical instrument digital
X interface (MIDI) using MIDI realtime information as timing clock.
X Sequential music data can be stored and retrieved from DOS.
X
X	SYNOPSYS: [run] MIDIrec [-i <Input>] [-o <Output>] [-t] [<Name>]
X	~~~~~~~~
X Arguments and options are identical to those of MIDIkeys, but, if a MIDI
X socket doesn't exist the program complains.
X
X You'll be surprised when you run it, it has no "PLAY" or "STOP" keys,
X in fact it expects START and STOP events to come from MIDI along with the
X timing information, so the only key there needs to be is the "RECORD"
X gadget which toggles recording and playback, when pressed it automatically
X 'rewinds' so that recording or playback can be started immediately without
X even stopping the clock, unless you have a drum machine or sequencer
X attached, which would get out of sync. When activating the "RECORD" gadget
X the buffer is automatically deleted, no "tape merging" can be done!
X A MIDI-start-event rewinds the tape too, so the "REWIND" gadget isn't
X usually needed. For notifications the screen titlebar is used.
X Further functions can be obtains by picking menu items or pressing the
X equivalent keys. The functions and keys are:
X
X	Load	(right-amiga-"l")	Choose a file to load.
X	Save As	(right-amiga-"s")	Choose a filename to save music to.
X	Re-Read	(right-amiga-"r")	Load that file again.
X	Write	(right-amiga-"w")	Save it again.
X	Help	(right-amiga-".")	Give info about "tape".
X	Thru	(right-amiga-"`")	Toggle the thru function.
X
XMIDIclock	V1.0	"MIDI Clock Generator"
X~~~~~~~~~
X Should be a reliable source of MIDI realtime clock information, but it
X isn't. I warn you, this program generates a lot of load, too. It is better
X to avoid using it, rather have clock events come in from the real MIDI.
X But if you have no other choice...
X
X	SYNOPSYS: [run] MIDIclock [-o <Output>] [<Name>]
X	~~~~~~~~
X Redirect the output as usual, use <Name> if you want more then one
X (bleargh!) MIDI clock in your system! (to generate MIDI coughs etc..)
X
X The MIDIclock is called by the timer.device 96 times per quarter note, it
X then outputs a clock event to its MIDI port, which can be redirected
X into the recorder or anywhere else. It has 3 buttons, START, STOP and
X CONTINUE, which do what they're supposed to, a proportional gadget
X changes the speed, which by default is set to 120 b/m.
X
X	 BUGS:	Amiga may halt when too much overhead is generated.
X	 ~~~~
X This happens all too easy, for example when doing lots of multi-tasking
X like running a mouse accelerator or other load. It also can happen when
X you use the speed gadget while the clock is running, so always stop it
X when changing output speed, better not change it at all, it does strange
X things sometimes! The MIDIclock has a little overhead detecting routine,
X it will toggle the power-LED when overhead is detected. If the flashing
X rapidly increases you better click the MIDIclock away and start a new one.
X
XList of files the binaries package should include:
X~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
XREADME
XMIDIclock		The executables
XMIDIdump
XMIDIkeys
XMIDIrec
XEXEC.ME			A script to run a typical configuration
X
XLibs			The libraries used by the executables
XLibs/ARP.Library	I'm not sure if they are the latest releases.
XLibs/MIDI.Library	Put them in libs: if you don't have them.
X
XSeQuences		Data files that can be played by MIDIrec.
XSeQuences/Bass & Tubes         [Lynx'86]	One channel, non-dynamic.
XSeQuences/Castagna Groove      [Lynx'89]	Dynamic, multi-channel.
XSeQuences/Hand Play            [scratch]	Dynamic, one channel.
XSeQuences/Once Had A Dream     [Lynx'89]	Dynamic, multi-channel.
XSeQuences/Pray Talk            [Lynx'87]	Non-dynamic.
X
XSysX			Data files for the MIDIdump
XSysX/CasioRequest.x	A sysx data dump request for Casio CZ synths.
X
XCOPYRIGHT NOTICE
X The binaries package is placed into public domain, this also includes the
X music files, use them whereever you want, with one exception:
X "Pray Talk" may not be used without my prior permission.
X The package is provided "as is". I don't guarantee the functionality of
X any data provided with this package.
X
X Source-code and binaries have originally been posted as seperated
X packages, yet the may also appear together (in one single zoo).
X Follow-up MIDIstuff packages may contain more efficient versions of
X these programs, but also new MIDI modules like a MIDI-to-Amiga-Audio
X interface, enhanced recording software like a MIDI sequencer, a
X screen-sharing interface for all modules, etc...
X
XCONCLUDING...
X Hope this helps you MIDIaners out there, enjoy music, enjoy MIDIstuff! :-)
X Btw, none of the executables can be made resident.
X
XMaterial encouragements to:
X
X	~~~	Carl "Lynx" v. Loesch
X	$ $	  Georgenstr. 142
X	 v	 D - 8 Muenchen 40
X	\_/	       ~~~~~~~~        "West" Germany...
X
XVirtual encouragements and suggestions to:
X
X	loesch @ informatik.tu-muenchen.de
X		(valid till november'90 i hope)
X	lynx @ suttner.informatik.uni-oldenburg.de
X		(if the mailers manage to get through to this machine)
X	gebhart @ informatik.tu-muenchen.de
X		(if the above doesn't works; a dear friend of mine)
END_OF_FILE
if test 7437 -ne `wc -c <'README'`; then
    echo shar: \"'README'\" unpacked with wrong size!
fi
chmod +x 'README'
# end of 'README'
fi
if test ! -d 'lib' ; then
    echo shar: Creating directory \"'lib'\"
    mkdir 'lib'
fi
if test -f 'lib/ynx.lib.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'lib/ynx.lib.uu'\"
else
echo shar: Extracting \"'lib/ynx.lib.uu'\" \(7665 characters\)
sed "s/^X//" >'lib/ynx.lib.uu' <<'END_OF_FILE'
Xbegin 700 ynx.lib
XM86H````"7U-A>4YU;0`W`E]->4]P96Y7:6YD;W<`:`)?1V5T4V-R965N`)4"1
XM7TUA:V5087)E;G0`P0)?0S)8`.P"7TYU;51O4W1R:6YG`#L#7T=E=%=I;F1OK
XM=P"!`U]4:&EC:U1E>'0`X@-?0VAE8VM4=6D`*01?3&]A9$9R97%#;VP`*01?*
XM3&]A9$%S`"D$7U-A=F5&<F5Q0V]L`"D$7U-A=F5!<P`I!%],;V%D`"D$7U-A6
XM=F4`````````````````````````````````````````````````````````;
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM``````````````````````````````!!2E-A>4YU;0``````7```````````$
XM``8````<``D`'``WP``""```7U-A>4YU;0`'"```7TYU;51O4W1R:6YG``<(K
XM``!?36]V90`'"```7U-E=$%096X`!P@``%]497AT``<(```N8F5G:6X`````)
XM'TY5_^Y"IT*G2&W_[R\M``P13KKZ<0`?3^\`$!M`_^XO+0`4+RT`$!4O+0`(:
XM3KKZ<@`=3^\`#"\M`!@O+0`(3KKZ<P`?4$\0+?_N2(!(P"\`2&W_[Q4O+0`(K
XM3KKZ=``73^\`#$Y=3G7U````04I->4]P96Y7:0```$0````````````%``$`G
XM'``)`!L`,<```@@``%]->4]P96Y7:6YD;W<`!P@``%]/<&5N5VEN9&]W``<(Q
XM``!?0VEA;P`'"@``7W9I9&5O<VEG``<(```N8F5G:6X``````H``.AM.50``A
XM+PHO+0`(3KKZ<0`96$\D0$J`9@I(>OHA8``P$4ZZ^G(`'UA/(&H`5G``$"@`N
XM#W(!X:$1@ZW0`G,`'R`*)%].74YU3F\@=VEN9&\1=P#U`$%*1V5T4V-R964`<
XM``!:`````````````P```!0`"0`4`"W```((``!?1V5T4V-R965N``<(``!?2
XM3W!E;E-C<F5E;@`'"```+F)E9VEN````'TY5_^!";?_@.VT`%O_B.VT?`!K_B
XMY#MM`![_YCMM`!+_Z!\;;0`C_^H;;0`G_^L[;0`J'__L.VT`"O_N0JW_\"MMM
XM``P?__1"K?_X*VT`+/_\2&W_X!%.NOIQ`!583TY=3G7U`$%*36%K95!A<F4`+
XM``!:`````````````P```!,`"0`3`"S```((``!?36%K95!A<F5N=``'"```8
XM7W-T<FQE;@`'"```+F)E9VEN```93E7__"\M``A.NOIQ`!]83]"M``A3@"M`0
XM__P@;?_\'['M``AG&B!M__P,$``O9Q`?(&W__`P0`#IG!E.M__Q@W!\@;?_\;
XM#!``.F<((&W__$(0'6`((&W__$(H``%.74YU]0``04I#,E@``````````#P`.
XM```4```````"``(`$``)``X`*\```@@``%]#,E@`!P@``"YB96=I;@`#@```E
XM`X``$1-.50``]1\P,3(S-#4V-S@Y86)C9&5F$`#T]1)?7P#T'7``$"T`"\"\.
XM````#T'Z^F``$QMP"`#0A"%A`#$?<``0+0`+P+P```#PZ(A!^OI@`!,;<`@`_
XMT(1A`!%!^OIA`!4@"$Y=3G7U`````$%*3G5M5&]3='(```#4````````````'
XM!````!4`"0`5`$_```((``!?3G5M5&]3=')I;F<`!P@``"YM;V1U``<(```N(
XM9&EV=0`'"```+F)E9VEN`!].5?_V2.<,`'@`>@!*K0`4'V8(*WP````P`!1*K
XMK0`(9S`7<@H@+0`(3KKZ<0`?T+P````P$@52!70`%`%![1W_]A&`*`!R"B`M[
XM``A.NOIR`!\K0``(8,IP`!`%(BT`$+*`'V,H<``0!'(`$@4D+0`0E($?L()DP
XM%!`$4@1R`!(`(&T`#!\1K0`7&`!@VF`62JT`$&<0'W``$`4B+0`0LH!D!%,%*
XM8/`?2@5C'E,%<``0!4'M__82!!]2!'0`%`$B;0`,$[`(`"@`'V#><``0!"!M/
XM``Q",`@`<``9$`1,WP`P3EU.=?4```!!2D=E=%=I;F1O````E```````````A
XM``4``0`;``D`&@!&P``""```7T=E=%=I;F1O=P`'"```7T]P96Y7:6YD;W<`#
XM!P@``%]#:6%O``<*``!?=FED96]S:6<`!P@``"YB96=I;@````*``(H?3E7_#
XMT"\*.VT`#O_0.VT`$A__TCMM`!;_U#MM`!K_UAMM'P`?_]@;;0`C_]DK;0`D\
XM_]H?("T`*("\````"BM`_]Y"K1__XBMM``C_ZD*M_^Y"K?_R&SM\``'__DAMT
XM_]!.NOIQ`!E83R1`2H!F"DAZ^B%@`#`13KKZ<@`?6$\@:@!6<``0*``/<@'A#
XMH1&#K=`"<P`?(`HD7TY=3G5.;R!W:6YD;Q%W`/4`````04I4:&EC:U1E>```+
XM`-8````````````(````)``)`"0`8<```@@``%]4:&EC:U1E>'0`!P@``%]!`
XM<VM3;V9T4W1Y;&4`!P@``%]39713;V9T4W1Y;&4`!P@``%]S=')L96X`!P@`G
XM`%]3971!4&5N``<(``!?36]V90`'"```7U1E>'0`!P@``"YB96=I;@``'4Y5)
XM``!(YPP`+RT`"$ZZ^G$`'UA/*``O!$AX``0O+0`(3KKZ<@`;3^\`#"@`+RT`X
XM%$ZZ^G,`'UA/&@`0+0`;2(!(P"\`+RT3``A.NOIT`!]03R`M`!!2@"\`("T`6
XM#%*`%R\`+RT`"$ZZ^G4`'T_O``P0!4B`2,`O`"\M`!05+RT`"$ZZ^G8`'T_OZ
XM``P0+0`?2(!(P"\`+RT3``A.NOIT`!]03R\M`!`O+0`,+RT`"$ZZ^G4`'T_O>
XM``P0!4B`2,`O`"\M`!05+RT`"$ZZ^G8`'4_O``PO!$*G+RT`"$ZZ^G(`'4_OW
XM``PH`$S?`#!.74YU]0```$%*0VAE8VM4=6D```"`````````````"````"(`W
XM"0`B`$?```((``!?0VAE8VM4=6D`!PH``%]W:6X`!P@``%]'971-<V<`!P@`M
XM`%]297!L>4US9P`'"```7TAA;F1L945V96YT``<(``!?2&ET84ME>0`'"```Z
XM7T-I86\`!P@``"YB96=I;@`93E4``$CG#B`@;=`"<0`5+R@`5DZZ^G(`'UA/"
XM)$!*@&=<*"H`%#PJ`!@7*BH`'"\*3KKZ<P`96$\@!&`B+P5.NOIT`!M83V`XT
XM<``P!B\`3KKZ=0`76$]@*D*G3KKZ=@`?6$]@()"\````0&?6D+P``!\`P&?.D
XMD+P```$`9]Z0O```'0(`9\A@D$S?!'!.74YU]0``04I&:6QE<P```````IP`Z
XM```````````:``(`6@`)`%@!*<```@@``%],;V%D1G)E<4-O;``""``27TQO,
XM861!<P`'"@``7V9R97$`!PH``%]L;V%D;F%M90`'"```7T9I;&5297%U97-T?
XM``<*``!?9&ER``<*``!?9FEL90`'"```7W-T<F-P>0`'"```7U1A8VM/;@`''
XM"```7TQO861)=``""`!P7U-A=F5&<F5Q0V]L``((`()?4V%V94%S``<*``!?6
XM<V%V96YA;64`!P@``%]3879E270``@@`X%],;V%D``<*``!?<F5T``<(``!?\
XM4U!R:6YT9@`'"```7U-A>0`'"```7T]P96X`!P@``%]296%D``<(``!?0VQO7
XM<V4``@@!L%]3879E``<(``!?1&5L971E1FEL90`'"```7T%R<$QO8VL`!P@`K
XM`%]7<FET90`'"```+F)E9VEN``````*``7@"@`)F'TY5```@;0`,$7P``@`)$
XM3ET73G5.50``(&W0`G(`%T/Z`$X@B4'Z^G,`$2)MT`)R`!DC2``$0?K_TB)MS
XMT`)R`!4C2``2+RW0`G(`$4ZZ^G0`%UA/2H!G($AZ^G4`$4AZ^G8`$4ZZ^G<`*
XM$U!/2'KZ<P`12'KZ=@`13KKZ>``34$].NOIY`!E.74YU3&]A9```'TY5```@%
XM;0`,$7P``P`)3ET73G5.50``(&W0`G(`%T/Z`$X@B4'Z^GP`$2)MT`)R`!DCG
XM2``$0?K_TB)MT`)R`!4C2``2+RW0`G(`$4ZZ^G0`%UA/2H!G($AZ^G4`$4AZW
XM^G8`$4ZZ^G<`$U!/2'KZ?``12'KZ=@`13KKZ>``34$].NOI]`!E.74YU4V%V4
XM90``'4Y5``!(YP@@+RT`"$AZ^B%@`#`12'KZ?P`13KKZ<`$53^\`#$AZ^G\`W
XM$4ZZ^G$!&UA/2'@#[2\M``A.NOIR`1]03R1`2H!G%"\M`!`O+0`,$R\*3KKZ9
XM<P$=3^\`#"@`(`IG""\*3KKZ=`$?6$]*A&<D(`12@&<>+P1(>OHA8``^$4AZG
XM^G\`$4ZZ^G`!%4_O``Q(>OI_`!%.NOIQ`1583V`,2'KZ(6``4((13KKZ<0$?W
XM6$]X`"`$3-\$$$Y=3G5,;Q]A9&EN9R`G)7,G+@`E;&0@'V)Y=&5S(&QO861E!
XM9"X`*D\?;W!S*BP@8V]U;&1N)W0@;!5O860N```?3E4``$CG""!X`)7*+RT`A
XM"!%(>OHA80`P$4AZ^G\`$4ZZ^G`!%4_O``Q(>OI_`!%.NOIQ`1=83R\M``A.F
XMNOIV`1M83TAX__\O+0`(3KKZ=P$?4$]*@&8H2'@#[B\M``A.NOIR`1]03R1`+
XM2H!G%"\M`!`O+0`,$R\*3KKZ>`$=3^\`#"@`(`IG""\*3KKZ=`$?6$]*A&<F9
XM(`12@&<@+RT`$!%(>OHA80`]$4AZ^G\`$4ZZ^G`!%4_O``Q(>OI_`!%.NOIQC
XM`1583V`*2'KZ(6$`7X$13KKZ<0$?6$],WP003EU.=5-A=FEN9Q\@)R5S)RX`X
XM)6QD(&)Y=&5S'R!S=&]R960N`"I!<F=H*BP?(&-O=6QD;B=T('-A=F4N`/4`-
X#`````
X``
Xend
Xsize 5448
END_OF_FILE
if test 7665 -ne `wc -c <'lib/ynx.lib.uu'`; then
    echo shar: \"'lib/ynx.lib.uu'\" unpacked with wrong size!
fi
# end of 'lib/ynx.lib.uu'
fi
if test ! -d 'src' ; then
    echo shar: Creating directory \"'src'\"
    mkdir 'src'
fi
if test -f 'src/ClockPOW.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/ClockPOW.c'\"
else
echo shar: Extracting \"'src/ClockPOW.c'\" \(2138 characters\)
sed "s/^X//" >'src/ClockPOW.c' <<'END_OF_FILE'
X
Xstruct PropInfo Gadget4SInfo = {
X	AUTOKNOB+FREEHORIZ,
X	-31007,-1,
X	327,-1,
X};
X
Xstruct Image Image1 = {
X	49,0,
X	6,12,
X	0,
X	NULL,
X	0x0000,0x0000,
X	NULL
X};
X
Xstruct IntuiText IText1 = {
X	3,0,JAM2,
X	7,4,
X	NULL,
X	(UBYTE *)"Speed",
X	NULL
X};
X
Xstruct Gadget Gadget4 = {
X	NULL,
X	187,12,
X	107,16,
X	GADGHBOX+GADGHIMAGE,
X	RELVERIFY,
X	PROPGADGET,
X	(APTR)&Image1,
X	NULL,
X	&IText1,
X	NULL,
X	(APTR)&Gadget4SInfo,
X	NULL,
X	NULL
X};
X
XSHORT BorderVectors1[] = {
X	0,0,
X	53,0,
X	53,17,
X	0,17,
X	0,0
X};
Xstruct Border Border1 = {
X	-2,-1,
X	3,0,JAM1,
X	5,
X	BorderVectors1,
X	NULL
X};
X
Xstruct IntuiText IText4 = {
X	2,0,JAM2,
X	108,4,
X	NULL,
X	(UBYTE *)"Continue",
X	NULL
X};
X
Xstruct IntuiText IText3 = {
X	2,0,JAM2,
X	60,4,
X	NULL,
X	(UBYTE *)"Stop",
X	&IText4
X};
X
Xstruct IntuiText IText2 = {
X	2,0,JAM2,
X	4,4,
X	NULL,
X	(UBYTE *)"Start",
X	&IText3
X};
X
Xstruct Gadget g_Start = {
X	&Gadget4,
X	6,12,
X	50,16,
X	NULL,
X	RELVERIFY,
X	BOOLGADGET,
X	(APTR)&Border1,
X	NULL,
X	&IText2,
X	NULL,
X	NULL,
X	NULL,
X	NULL
X};
X
XSHORT BorderVectors2[] = {
X	0,0,
X	77,0,
X	77,17,
X	0,17,
X	0,0
X};
Xstruct Border Border2 = {
X	-2,-1,
X	3,0,JAM1,
X	5,
X	BorderVectors2,
X	NULL
X};
X
Xstruct Gadget g_Continue = {
X	&g_Start,
X	109,12,
X	74,16,
X	NULL,
X	RELVERIFY,
X	BOOLGADGET,
X	(APTR)&Border2,
X	NULL,
X	NULL,
X	NULL,
X	NULL,
X	NULL,
X	NULL
X};
X
XSHORT BorderVectors3[] = {
X	0,0,
X	44,0,
X	44,17,
X	0,17,
X	0,0
X};
Xstruct Border Border3 = {
X	-2,-1,
X	3,0,JAM1,
X	5,
X	BorderVectors3,
X	NULL
X};
X
Xstruct Gadget g_Stop = {
X	&g_Continue,
X	62,12,
X	41,16,
X	NULL,
X	RELVERIFY,
X	BOOLGADGET,
X	(APTR)&Border3,
X	NULL,
X	NULL,
X	NULL,
X	NULL,
X	NULL,
X	NULL
X};
X
X#define GadgetList1 g_Stop
X
Xstruct NewWindow NewWindowStructure1 = {
X	189,50,
X	300,31,
X	0,2,
X	GADGETUP+CLOSEWINDOW,
X	WINDOWDRAG+WINDOWCLOSE,
X	&g_Stop,
X	NULL,
X	(UBYTE *)" MIDI Clock Generator ",
X	NULL,
X	NULL,
X	5,5,
X	640,200,
X	WBENCHSCREEN
X};
X
X
Xvoid HandleEvent(object)
XAPTR object;
X{
X  if (object == (APTR)&g_Stop) { Stop(object); return; }
X  if (object == (APTR)&g_Continue) { Continue(object); return; }
X  if (object == (APTR)&g_Start) { Start(object); return; }
X  if (object == (APTR)&Gadget4) { NewSpeed(object); return; }
X}
X#define HANDLEEVENT HandleEvent
X
X/* end of PowerWindows source generation */
END_OF_FILE
if test 2138 -ne `wc -c <'src/ClockPOW.c'`; then
    echo shar: \"'src/ClockPOW.c'\" unpacked with wrong size!
fi
chmod +x 'src/ClockPOW.c'
# end of 'src/ClockPOW.c'
fi
if test -f 'src/MAKEFILE' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/MAKEFILE'\"
else
echo shar: Extracting \"'src/MAKEFILE'\" \(591 characters\)
sed "s/^X//" >'src/MAKEFILE' <<'END_OF_FILE'
XCFLAGS	= +l -s
XINCDIR	= inc:
XINTUI	= syms:intuition
XLIBS	= -lynx -lmidi -la -lc32
X
X.c.oi:
X	cc $(CFLAGS) +I$(INTUI) -o $@ $*
X
XMIDIstuff:	$(INTUI) MIDIkeys MIDIrec MIDIdump MIDIclock
X	run midirec
X	run midiclock -o Recorder
X	run midikeys -i Recorder -o Recorder
X
XMIDIkeys:	MIDIkeys.oi
X	ln +q MIDIkeys.oi $(LIBS)
X
XMIDIrec:	MIDIrec.oi RecPOW.oi
X	ln +q MIDIrec.oi RecPOW.oi $(LIBS)
X
XMIDIdump:	MIDIdump.oi
X	ln +q MIDIdump.oi $(LIBS)
X
XMIDIclock:	MIDIclock.oi ClockPOW.oi
X	ln +q MIDIclock.oi ClockPOW.oi $(LIBS)
X
X$(INTUI):
X	cc +l -s +H$(INTUI) -o t:itmp $(INCDIR)intuition/intuition.h
X	delete t:itmp
END_OF_FILE
if test 591 -ne `wc -c <'src/MAKEFILE'`; then
    echo shar: \"'src/MAKEFILE'\" unpacked with wrong size!
fi
chmod +x 'src/MAKEFILE'
# end of 'src/MAKEFILE'
fi
if test -f 'src/MIDIclock.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/MIDIclock.c'\"
else
echo shar: Extracting \"'src/MIDIclock.c'\" \(4453 characters\)
sed "s/^X//" >'src/MIDIclock.c' <<'END_OF_FILE'
X/*			C	L	O	C	K
X#define	VBLANK
X*/
X#define	OVERHEAD_HANDLE
X#define	NO_ACCURACY
X#define	CLOCKPRIO	19L
X
Xextern	struct	Gadget		Gadget4SInfo;
Xextern	struct	NewWindow	NewWindowStructure1;
Xextern	struct	IntuiText	IText1;
X
X#ifdef	VBLANK
X# define UNIT	UNIT_VBLANK
X#else
X# define UNIT	UNIT_MICROHZ
X#endif
X
X#include "LYNX.H"
X#include <hardware/cia.h>
X
X#include <MIDI/MIDI.h>
XEXPORT	struct	MidiBase	*MidiBase;
XEXPORT	struct	MSource		*source=0;
XEXPORT	struct	MRoute		*sroute=0;
Xchar	prgname[] =	"Clock",	*name = prgname;
Xchar	midiout[] =	"MidiOut",	*output= midiout;
Xchar	banner[] =
X "*| MIDI Clock Generator V0.3 by Carlo \"Lynx\" von Loesch '90 |*";
Xunion	Event clockevent;
X
X#include <libraries/ARPbase.h>
XEXPORT	struct	ArpBase		*ArpBase;
XEXPORT	struct	IntuitionBase	*IntuitionBase;
XEXPORT	struct	GfxBase		*GfxBase;
XEXPORT	struct	Window		*win;
XEXPORT	struct	RastPort	*rp;
X
X#include <devices/timer.h>
Xlong	timersig;
Xstruct	MsgPort		*timpo;
Xstruct	timerequest	*tr;
X#ifdef ACCURACY
Xlong	TimerBase;
Xstruct	timeval	t1=NULL, t2=NULL;
Xstruct	timerequest	*tr2;
XULONG	normic;
X#endif
X
Xchar	nomem[]="Don't do that, Dave";
XFLAG	on = NO, play = NO;
XEXPORT	long	sigs, videosig;
X
Xmain(argc, argv) long argc; char *argv[]; {
X	register struct timerequest *time;
X	register ULONG t;
X
X	ifnot (ArpBase = OpenLibrary("arp.library",ArpVersion))
X		Ciao("No ARP.Library");
X	IntuitionBase =	ArpBase -> IntuiBase;
X	GfxBase =	ArpBase -> GfxBase;
X	ifnot (MidiBase = ArpOpenLibrary (MIDINAME,MIDIVERSION))
X		Ciao ("No MIDI.Library");
X
X	for (t=1; t<argc; t++) {
X		if (argv[t][0]=='-') switch (argv[t][1]) {
X			case 'o':	output = argv[++t]; break;
X			default:	Ciao("Bad args");
X		}
X		else name = argv[t];
X	}
X	win = MyOpenWindow(&NewWindowStructure1);
X	SetWindowTitles (win, -1L, banner);
X	rp = win -> RPort;
X	if (!(source = CreateMSource (name, NULL))) Ciao (nomem);
X	if (!(sroute = MRouteSource (source, output, NULL)))
X		Ciao ("no route out");
X	if (! (timpo = CreatePort (0L, 0L)))	Ciao (nomem);
X	if (! (tr = CreateExtIO (timpo, sizeof(struct timerequest)) ))
X		Ciao (nomem);
X	if (OpenDevice (TIMERNAME, UNIT, tr, 0)) Ciao ("No Timer");
X	timersig = 1L<<timpo->SIGH; time = tr;
X	sigs = timersig | videosig;
X	clockevent.p[0] = (char) MS_CLOCK;
X
X#ifdef ACCURACY
X	TimerBase = (long) time->tr_node.io_Device;
X	if (! (tr2 = CreateExtIO (timpo, sizeof(struct timerequest)) ))
X		Ciao (nomem);
X	if (OpenDevice (TIMERNAME, UNIT_MICROHZ, tr2,0)) Ciao ("No Timer");
X	tr2 ->tr_node.io_Command = TR_GETSYSTIME;
X	normic =
X#endif
X	time->tr_time.tv_micro   = Speed2Mic(120);
X	time->tr_node.io_Command = TR_ADDREQUEST;
X	time->tr_time.tv_secs    = 0;
X#ifdef CLOCKPRIO
X	SetTaskPri(FindTask(NULL), CLOCKPRIO);
X#endif
X	forever if (play) {
X#ifdef ACCURACY
X		DoIO (time); GetTime (&t1);
X#else
X		SendIO (time);
X#endif
X		PutMidiMsg (source, &clockevent);
X#ifdef ACCURACY
X		GetTime (&t2);
X		SubTime (&t2, &t1);
X		if ((time->tr_time.tv_micro = normic - t2.tv_micro) < 0)
X			TOG_LED;
X#else
X# ifdef OVERHEAD_HANDLE
X		if (CheckIO(time)) {
X			AbortIO(time); TOG_LED; DoIO(time);
X		} else
X# endif
X		if (timersig != Wait(sigs)) CheckTui();
X#endif
X	    } else if (timersig != Wait(sigs)) CheckTui();
X}
X
XNewSpeed () {
X	register long a;
X	static char s[3];
X
X	a = 1 + (Gadget4SInfo.HorizPot / Gadget4SInfo.HorizBody);
X	NumToString (a, s, 3, ' ');
X	IText1.IText = s;
X	RefreshGadgets (win->FirstGadget, win, NULL);
X	tr->tr_time.tv_micro = Speed2Mic (a);
X}
XStop() {
X	SendMIDI (MS_STOP); play = NO;
X}
XStart() {
X	if (!play) {
X		SendMIDI (MS_START); play = YES;
X	}
X}
XContinue() {
X	if (!play) {
X		SendMIDI (MS_CONTINUE); play = YES;
X	}
X}
XHitaKey() {}
X
XSendMIDI (command) ULONG command; {
X	static union Event otherevent;
X
X	otherevent.p[0] = (UBYTE) command;
X	PutMidiMsg (source, &otherevent);
X}
X
X#ifdef	ACCURACY
XGetTime	(ti)
Xstruct timeval *ti; {
X	DoIO (tr2);
X	ti->tv_secs = tr2->tr_time.tv_secs;
X	ti->tv_micro= tr2->tr_time.tv_micro;
X}
X#endif
X
XCiao (str) char *str; {
X	if (str) {
X		INFO (str);
X		if (win) SetWindowTitles (win, str, str);
X		Delay (44L);
X	}
X	if (win)	CloseWindowSafely (win);
X	if (sroute)	DeleteMRoute	(sroute);
X	if (source)	DeleteMSource	(source);
X#ifdef ACCURACY
X	if (tr2) {
X		CloseDevice (tr);
X		DeleteExtIO (tr, sizeof(struct timerequest));
X	}
X#endif
X	if (tr)	{
X		AbortIO (tr); CloseDevice (tr);
X		DeleteExtIO (tr, sizeof(struct timerequest));
X	}
X	if (timpo)	DeletePort (timpo);
X	if (ArpBase)	CloseLibrary	(ArpBase);
X	OFF_LED;
X	exit(str ? 4404L : 0L);
X}
X
Xlong Speed2Mic (speed) ULONG speed; {
X	return (156250000/speed);
X}
END_OF_FILE
if test 4453 -ne `wc -c <'src/MIDIclock.c'`; then
    echo shar: \"'src/MIDIclock.c'\" unpacked with wrong size!
fi
chmod +x 'src/MIDIclock.c'
# end of 'src/MIDIclock.c'
fi
if test -f 'src/MIDIclock.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/MIDIclock.uu'\"
else
echo shar: Extracting \"'src/MIDIclock.uu'\" \(1422 characters\)
sed "s/^X//" >'src/MIDIclock.uu' <<'END_OF_FILE'
Xbegin 700 MIDIclock.POW
XM4&]W97)7:6YD;W=S('8R+C`@J3$Y.#<@8GD@24Y/5D%44D].24-3+"!)3D,N.
XM("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@```#O@````D@``#^````H
XM`0`````!``````M#;&]C:U!/5RYC```````````!````"@```D``!0`%`H``9
XMR`````````````0`Q*\````````!```"`+T`,@$L`!\`!0`%_____P```!<@Z
XM34E$22!#;&]C:R!'96YE<F%T;W(@```!O!@`/@`,`"D`$`````,``0`!N\0`R
XM`````````````````````````;OP__[__P,```4``;O4````````````+```K
XM`"P`$0```!$```````````````H````!`,5GR`#%>;@`Q7G(`,6AX```L6``@
XM`5<(````!V=?4W1O<``````%4W1O<``````!``````$``````0`````!```!#
XMQ>@`;0`,`$H`$`````,``0`!O$0``````````````````````````;QP__[_N
XM_P,```4``;Q4````````````30```$T`$0```!$```````````````H````!?
XM``&\F``!O4```;RP``'%N``!Q<@``<78````"V=?0V]N=&EN=64`````"4-O[
XM;G1I;G5E``````$``````0`````!``````$```+&Z``&``P`,@`0`````P`!?
XM``'&%````````<9````````````````!QMC__O__`P``!0`!QB0`````````O
XM```U````-0`1````$0```````````@`!```$``0```````'&8``!QG`````&[
XM4W1A<G0``@`!```\``0```````'&D``!QJ`````%4W1O<``"``$``&P`!```M
XM`````<;```````````E#;VYT:6YU90`````*`````0`!RM```<K@``'*\``!B
XMRS```<M```'+F`````AG7U-T87)T``````93=&%R=``````!``````$`````=
XM`0`````!````````NP`,`&L`$`````,``P`"R@```````,68P````````LG@>
XM``4`Q:%P__[__P,```4``L<D````````````;@```&X`$0```!$``````#$`Z
XM```&``P``````````````````````P`!```'``0``````,682``````````&,
XM4W!E960``0.&X?__`4?__P````@``P`!`,2M.`#%E````580`,?B$`#%E!@`_
XIQ^(@`````0`````)3F5W4W!E960``````0`````!``````$``````0#%W
X``
Xend
Xsize 986
END_OF_FILE
if test 1422 -ne `wc -c <'src/MIDIclock.uu'`; then
    echo shar: \"'src/MIDIclock.uu'\" unpacked with wrong size!
fi
# end of 'src/MIDIclock.uu'
fi
if test -f 'src/MIDIdump.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/MIDIdump.c'\"
else
echo shar: Extracting \"'src/MIDIdump.c'\" \(5131 characters\)
sed "s/^X//" >'src/MIDIdump.c' <<'END_OF_FILE'
X/*			 MIDI-System-Exclusive Dumper
X		Written, arranged, produced by Carl Ch. v. Loesch.
X
X		V1.0alpha	Saturday 19. 8. 89
XChanges:	V1.0beta	Saturday  9. 6. 90
X		V1.0gamma	Tuesday  25. 7. 90  now uses midi.library!
X		V1.0		Wednesday 15.8. 90  now uses arp.lib too
X*/
X#include "Lynx.h"
X#define	XBUFSIZE	50000L
X
X#include <libraries/ARPbase.h>
XEXPORT	struct	ArpBase		*ArpBase;
XEXPORT	struct	IntuitionBase	*IntuitionBase;
XEXPORT	char	file[FCHARS+DSIZE+1]="", dir[DSIZE+1]="SysX",
X		loadname[FCHARS+1]="out.x", savename[FCHARS+1]="in.x";
XEXPORT	struct	FileRequester	*freq;
XEXPORT	struct	Window		*win;
X
X#include <MIDI/MIDI.h>
XEXPORT	struct	MidiBase	*MidiBase;
XEXPORT	struct	MSource		*source=0;
XEXPORT	struct	MDest		*dest=0;
XEXPORT	struct	MRoute		*droute=0, *sroute=0;
XEXPORT	struct	MidiPacket	*packet=0;
Xstatic	struct	MRouteInfo routeinfo = { MMF_SYSEX };
X     /* receive only sys/ex msg's */
X
Xstruct NewWindow nw = {
X	10, 24, 620, 117,
X	3, 2, CLOSEWINDOW+RAWKEY, WINDOWCLOSE+WINDOWDEPTH+WINDOWDRAG
X	+SMART_REFRESH+WINDOWSIZING+NOCAREREFRESH,
X	NULL, NULL, "*| MIDI SysX Dumper V1.0 by Carlo von Loesch '89/90 |*",
X	NULL, NULL,
X	300, 11, 640, 500,
X	WBENCHSCREEN
X};
X
XEXPORT	char	name[]="MIDIdump";
XEXPORT	char	nomem[] = "Out of RAM";
XEXPORT	UBYTE	*xbuffer, ret[77];
XEXPORT	FLAG	timer = NO, cons = NO, logon = YES, spool = NO;
XEXPORT	long	xlen = 0, sigs, videosig, midisig;
Xstruct	IOStdReq conreq;
X
X_main	() {
X	ifnot (ArpBase = OpenLibrary("arp.library",ArpVersion))
X		Ciao("No ARP.Library");
X	IntuitionBase =	ArpBase -> IntuiBase;
X	ifnot (MidiBase = ArpOpenLibrary (MIDINAME,MIDIVERSION))
X		Ciao ("No MIDI.Library");
X
X	conreq.io_Data = win = MyOpenWindow (&nw);
X	OpenDevice("console.device", NULL, &conreq, NULL); cons=YES;
X	ifnot (xbuffer = ArpAlloc (XBUFSIZE)) Ciao (nomem);
X
X	ifnot (freq = ArpAllocFreq()) Ciao (nomem); 
X	freq->fr_Dir = dir; freq->fr_Window = win;
X	freq -> fr_FuncFlags = FRF_NewWindFunc;
X
X	ifnot (source = CreateMSource (name, NULL))	Ciao (nomem);
X	ifnot (sroute = MRouteSource (source, "MidiOut", NULL))
X		Ciao ("No route out");
X	ifnot (dest = CreateMDest (name, NULL))		Ciao (nomem);
X	ifnot (droute = MRouteDest ("MidiIn", dest, &routeinfo))
X		Ciao ("No route in");
X	midisig = 1L<<dest->DestPort->SIGH;
X	sigs = midisig | videosig;
X
X	HelpX ();
X	while (logon) {
X		if (midisig == Wait (sigs)) HandleMIDI();
X		else CheckTui ();
X	}
X	Ciao (NULL);
X}
X
XHandleMIDI () {
X	register long i;
X
X	if (packet = GetMidiPacket (dest)) {
X		xlen = packet->Length;
X		if (xlen < XBUFSIZE)
X			for (i=0; i<xlen; i++) xbuffer[i]=packet->MidiMsg[i];
X		else {
X			SPrintf (ret, "Buffer too small for %ld bytes.", xlen);
X			Say (ret);
X			xlen = 0;
X		}
X		FreeMidiPacket	(packet);
X		SPrintf (ret, "%ld bytes received.", xlen);
X		Say (ret);
X	}
X}
X
XHitaKey	(raw)
XULONG	raw; {
X	static	FLAG ctrl = NO;
X	register UBYTE z;
X
X	z = raw & 0x7f;
X	if (z == 99) { 
X		if (raw & 0x80) ctrl=NO;
X		else ctrl=YES;
X		return;
X	}
X	if (ctrl) switch (raw) {
X		case 16:/* Q */ logon = NO;
X	} else if (z == raw) {
X		switch (raw) {
X			case 20:/* T */ Transmit();	break;
X			case 51:/* C */ CheckX();	break;
X			case 40:/* L */ LoadAs();	break;
X			case 33:/* S */ SaveAs();	break;
X			case 69:/*ESC*/ logon = NO;
X			case 68:/*RET*/ HelpX ();
X		}
X		spool = NO;
X	}
X}
X
XLoadIt() {	xlen = Load (file, xbuffer,(long) XBUFSIZE);	}
XSaveIt() {	if (xlen) Save (file, xbuffer,(long) xlen);	}
XLogOut() {	logon = NO;	}
XHandleEvent() {}	/* no gadgets */
XTransmit () {
X	if (xlen) SendMIDI ("sysx buffer", xbuffer, xlen);
X	else Say ("*yawn*");
X}
X
Xlong SendMIDI (inf, buf, len)
X char	*inf;
X UBYTE	*buf;
X long	len;	{
X	register long r;
X
X	if (inf) {
X		SPrintf (ret, "Sending %s: %ld bytes.", inf, len);
X		Say (ret);
X	}
X	PutMidiMsg (source, xbuffer);
X	if (inf) Say ("sent.");
X}
X
X#define	ZOTARK	15
XCheckX () {
X	register UBYTE n;
X	register long i, j;
X	UBYTE	line[16];
X
X	if (xlen) {
X		spool = YES;
X		Say ("dump buffer:");
X		for (i=0; i<xlen; i++) {
X			n = xbuffer[i];
X			SPrintf (ret, " %s", C2X(n)); SayMore (ret);
X			j = i & ZOTARK;
X			if (n<32 || (n>127 && n<160)) n = '.';
X			line[j] = n;
X			if (j==ZOTARK) {
X				SPrintf (ret, " \xab %s \xbb",line);
X				Say (ret); CheckTui(); if (!spool) break;
X			}
X		}
X		Say (".");
X	}
X	else Say ("*yawn*");
X}
X
XHelpX () {
X	Say (" [L]oad into buffer.");
X	Say (" [T]ransmit to MIDI.");
X	Say (" [S]ave to disk.");
X	Say (" [C]heck buffer contents.");
X	Say ("\n [ESC]ape from here!");
X	Say (" [RET] type this info again.");
X	Say ("\nWhatever system-exclusive data arrives");
X	Say ("will be stored into buffer rightaway.");
X	SPrintf (ret, "\nBuffer currently contains %ld bytes.", xlen);
X	Say (ret);
X}
X
XSay (text) char *text; {
X	char tmp[78];
X	SPrintf (tmp, "%s\n", text); SayMore (tmp);
X}
XSayMore (text) char *text; {
X	conreq.io_Data = (APTR) text;
X	conreq.io_Length = -1;
X	conreq.io_Command = CMD_WRITE;
X	DoIO(&conreq);
X}
X
XCiao (str) char *str; {
X	if (cons) {
X		if (str) {
X			Say (str); Delay(21L);
X		}
X		CloseDevice (&conreq);
X	}
X	if (win)	CloseWindowSafely (win);
X	if (droute)	DeleteMRoute	(droute);
X	if (sroute)	DeleteMRoute	(sroute);
X	if (dest)	DeleteMDest	(dest);
X	if (source)	DeleteMSource	(source);
X	if (ArpBase)	CloseLibrary	(ArpBase);
X	exit (str ? 4404L : 0L);
X}
END_OF_FILE
if test 5131 -ne `wc -c <'src/MIDIdump.c'`; then
    echo shar: \"'src/MIDIdump.c'\" unpacked with wrong size!
fi
chmod +x 'src/MIDIdump.c'
# end of 'src/MIDIdump.c'
fi
if test -f 'src/MIDIkeys.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/MIDIkeys.c'\"
else
echo shar: Extracting \"'src/MIDIkeys.c'\" \(6472 characters\)
sed "s/^X//" >'src/MIDIkeys.c' <<'END_OF_FILE'
X/*			      Virtual MIDI Keyboard
X		Written, arranged, produced by Carl Ch. v. Loesch.
X				(c)  1989, 1990.
X*/
X#include "Lynx.h"
X
X#include <libraries/ARPbase.h>
Xstruct	ArpBase		*ArpBase;
Xstruct	IntuitionBase	*IntuitionBase;
Xstruct	GfxBase		*GfxBase;
Xstruct	Window		*win;
Xstruct	RastPort	*rp;
X
X#include <MIDI/MIDI.h>
Xstruct	MidiBase	*MidiBase;
Xstruct	MSource		*source=0;
Xstruct	MDest		*dest=0;
Xstruct	MRoute		*droute=0, *sroute=0, *troute;
Xstruct	MRouteInfo	routeinfo = { MMF_NOTEOFF | MMF_NOTEON, 0xffff };
X
Xstatic UBYTE keytable[128] = {
X	0,61,63,0,66,68,70,0,73,75,0,78,80,82,0,0,	/*  0..15 */
X	62,64,65,67,69,71,72,74,76,77,79,81,0,0,0,0,	/* 16..31 */
X	42,44,46,0,49,51,0,54,56,58,0,0,0,0,0,0,	/* 32..47 */
X	41,43,45,47,48,50,52,53,55,57,59,0,0,0,0,0,	/* 48..63 */
X	0,0,60,0,83,0,0,0,0,0,0,0,0,0,0,0,		/* 64..79 (tab,cr) */
X	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,		/* 80..95 */
X	0,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,		/* 96..111 (rsh) */
X	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,		/* 112..127 */
X	};
X
X#define	JOKES	6
Xstatic	char jokes[JOKES][70] = {
X"                    INCORRECT PASSWORD. TRY AGAIN.                    ",
X"           The password to go eat at the mensa is 'MAHLZEIT'          ",
X"          How many cans can a can can if a can can can cans?          ",
X" The Lynx says:    The best is yet to come... to come... to come...   ",
X"    The Lord of Sequence. The ultimate Amiga MIDI sequencer program.  ",
X"Greet'ns to SNEAK, NOAK, KIR, MADGUIT, KBR, YETI, ANT, WIZ, CRACKAKAN.",
X};
X
Xstruct NewWindow nw = {
X	0, 11, 640, 40,
X	1, 2, CLOSEWINDOW+RAWKEY,
X	WINDOWCLOSE+WINDOWDEPTH+WINDOWDRAG+SMART_REFRESH,
X	NULL, NULL, NULL, NULL, NULL,
X	0, 0, 0, 0,
X	WBENCHSCREEN
X};
X
Xchar	keyboard[] =	"Keyboard",	*name  = keyboard;
Xchar	midiin[] =	"MidiIn",	*input = midiin;
Xchar	midiout[] =	"MidiOut",	*output= midiout;
Xchar	nomem[] = "Gimme RAM!";
Xchar	banner[] =
X "*| Virtual MIDI Keyboard V1.0 by Carlo \"Lynx\" von Loesch (c)89 |*";
Xchar	header[] = "*| Virtual MIDI Keyboard ", *title = header;
XFLAG	logon = TRUE, thru = FALSE;
XEXPORT	long	videosig, sigs;
X
Xmain(argc, argv) long argc; char *argv[]; {
X	register struct	IntuiMessage	*tuimsg;
X	register union Event	*e;
X	register long	t;
X	register short	s;
X
X	ifnot (ArpBase = OpenLibrary("arp.library",ArpVersion))
X		Ciao("No ARP.Library");
X	IntuitionBase =	ArpBase -> IntuiBase;
X	GfxBase =	ArpBase -> GfxBase;
X	ifnot (MidiBase = ArpOpenLibrary (MIDINAME,MIDIVERSION))
X		Ciao ("No MIDI.Library");
X
X	for (t=1; t<argc; t++) {
X		if (argv[t][0]=='-') select (argv[t][1]) {
Xwhen 'i':		input = argv[++t]; break;
Xwhen 'o':		output = argv[++t]; break;
Xwhen 't':		Thru(); break;
Xotherwise		Ciao("Bad args");
X		}
X		else title = name = argv[t];
X	}
X	win = MyOpenWindow (&nw);
X	SetWindowTitles (win, title, banner);
X	rp = win->RPort;
X	for (t=0; t<10; t++) DrawOctave (rp, t);
X
X	ifnot	(source = CreateMSource (name, NULL))	Ciao (nomem);
X	ifnot	(dest = CreateMDest (name, NULL))	Ciao (nomem);
X	sroute = MRouteSource (source, output, NULL);
X	droute = MRouteDest (input, dest, &routeinfo);
X
X	sigs = videosig | (1L << dest->DestPort->SIGH);
X	while (logon) {
X		if (videosig != Wait (sigs))
X		    while (e = GetMidiMsg (dest)) {
X			Show (e->l);
X			FreeMidiMsg (e);
X		}
X		else while (tuimsg = GetMsg (win->UserPort)) {
X			t=tuimsg->Class; s=tuimsg->Code; ReplyMsg (tuimsg);
X			select (t) {
Xwhen RAWKEY:			HitaKey(s); break;
Xwhen CLOSEWINDOW:		logon = FALSE;
X			}
X		}
X	}
X	Ciao ("Please close the window, it's cold outside.  *grin*  :-)");
X}
X
XHitaKey	(raw)
Xshort	raw; {
X	static union Event e;
X	static char	chan;
X	static FLAG amiga = FALSE;
X#ifdef	CTRL
X	static FLAG ctrl = FALSE;
X#endif
X	register UBYTE z;
X
X	z = (UBYTE) (raw & 0x7f);
X	if (z == 103) {
X		if (raw & 0x80) amiga=FALSE;
X		else amiga=TRUE;
X		return;
X	}
X#ifdef	CTRL
X	if (z == 99) {
X		if (raw & 0x80) ctrl=FALSE;
X		else ctrl=TRUE;
X		return;
X	}
X	if (ctrl) select (raw) {
Xwhen 51:/* C */	logon = FALSE;
X	}
X	else
X#endif
X	if (amiga) select (raw) {
Xwhen 0: /* ` */	Thru();
X	}
X	else if (e.p[1] = keytable[z]) {
X		e.p[0] = MS_NOTEON + chan;
X		if (raw & 0x80)	e.p[2] = 0;
X		else		e.p[2] = 64;
X/* I think 64 is the standard velocity value for non-dynamic keyboards */
X		PutMidiMsg (source, &e);
X		Show (e);
X	}
X	else select (raw) {
Xwhen 89:/*F10*/	Thru();	break;
Xwhen 43:/* # */	Jokerman();	break;
Xwhen 81:/*F2*/	chan+=2; if (chan>16) chan=1;
Xwhen 80:/*F1*/	if (--chan<0) chan=15;
X		title[0] = chan+49; Say (title);
X	}
X}
X
XThru() {
X	register UBYTE *ret;
X
X	if (thru = !thru)
X	    if (troute = MRoutePublic (input, output, routeinfo))
X		ret = "Route has been established.";
X	    else { thru = NO; ret = "No route could be established."; }
X	else { DeleteMRoute (troute); ret = "Route deleted."; }
X	Say (ret);
X}
X
X#define COLORS	4
X#define DEPTH	2
X#define	TOP	11
X#define	BOT	37
X#define	MID	26
X#define	LEFMARG	5
X
XShow (e)
X union Event e; {
X	register long z, o;
X	static char offs[12] =
X		{ 1, 6, 11, 16, 22, 27, 32, 37, 42, 47, 52, 58 };
X	static char white[12] =
X		{ 1, 0, 10, 0, 19, 28, 0, 37, 0, 46, 0, 55 };
X
X	z = e.p[2];			/* velocity */
X	if (!z || e.p[0] == MS_NOTEOFF)	SetAPen (rp, 0L);
X	else SetAPen (rp, z / (128/(COLORS-1)) + 1 );
X	if (z == 7) Jokerman();
X
X	z = e.p[1] % 12;	o = 63 * (e.p[1]-z)/12 + LEFMARG;
X	if (white[z]) RectFill (rp, o+white[z], MID+1, o+white[z]+7, BOT-1);
X	z = o + offs[z] + 1;
X	RectFill (rp, z, TOP+1, z+3, MID-1);
X}
X
XDrawOctave	(raz, x)
X   int	raz, x; {
X	x = 63*x + LEFMARG;
X	Move (raz, x, TOP);	/* box around it */
X	Draw (raz, x+63, TOP);	Draw (raz, x+63, BOT);
X	Draw (raz, x, BOT);	Draw (raz, x, TOP);
X
X	x+=9;	Move (raz, x, BOT);	DrawKey (raz, x, 3);
X	x+=9;	Move (raz, x, BOT);	DrawKey (raz, x, 2);
X	x+=9;	Move (raz, x, BOT);	Draw	(raz, x, TOP);
X	x+=9;	Move (raz, x, BOT);	DrawKey (raz, x, 4);
X	x+=9;	Move (raz, x, BOT);	DrawKey (raz, x, 3);
X	x+=9;	Move (raz, x, BOT);	DrawKey (raz, x, 2);
X}
X
XDrawKey		(raz, x, i)
X   int	raz, x, i; {
X	Draw (raz, x, MID);
X	Draw (raz, x-i, MID);
X	Draw (raz, x-i, TOP);
X	Move (raz, x, MID);
X	Draw (raz, x-i+5, MID);
X	Draw (raz, x-i+5, TOP);
X}
X
XJokerman() {
X	static UBYTE	joker = 0;
X	SetWindowTitles (win, jokes[joker++], banner);
X	if (joker==JOKES) joker = 0;
X}
X
XSay (str) char *str; { if (win) SetWindowTitles (win, -1L, str); }
X
XCiao	(str)
X  char	*str; {
X	if (str) { Say (str); Delay (25L); }
X	if (win)	CloseWindowSafely (win);
X	if (droute)	DeleteMRoute	(droute);
X	if (sroute)	DeleteMRoute	(sroute);
X	if (thru)	DeleteMRoute	(troute);
X	if (dest)	DeleteMDest	(dest);
X	if (source)	DeleteMSource	(source);
X	if (ArpBase)	CloseLibrary	(ArpBase);
X	exit (NULL);
X}
END_OF_FILE
if test 6472 -ne `wc -c <'src/MIDIkeys.c'`; then
    echo shar: \"'src/MIDIkeys.c'\" unpacked with wrong size!
fi
chmod +x 'src/MIDIkeys.c'
# end of 'src/MIDIkeys.c'
fi
if test -f 'src/MIDIrec.POW.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/MIDIrec.POW.uu'\"
else
echo shar: Extracting \"'src/MIDIrec.POW.uu'\" \(1708 characters\)
sed "s/^X//" >'src/MIDIrec.POW.uu' <<'END_OF_FILE'
Xbegin 700 MIDIrec.POW
XM4&]W97)7:6YD;W=S('8R+C`@J3$Y.#<@8GD@24Y/5D%44D].24-3+"!)3D,N.
XM("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@```#O@````D@``#^````H
XM`0`````!``````E296-03U<N8P```````````0``$`H```-```4`!0*``,@`>
XMPP#P```````"`,!I@````````0```@'E`#(`FP`?``4`!?____\````0($U)_
XM1$D@4F5C;W)D97(@``##B3@`40`,`$0`$````0,``0##B0P``````,!NF```;
XM``````````(`PAI`__[__P,```4`PXD<````````````1P```$<`$0```!$`Y
XM``````````(``0``"``$``````#`;T``````````!U)E8V]R9``````*```!O
XM`0#`;U``P'&X`,!QR`#`<U@`P'-H`,!T6`````EG7U)E8V]R9``````'4F5CC
XM;W)D``````$``````0`````!``````$````````'``P`1``0`````P`!`,.)`
XM9```````PBEP````````````!`#"+U#__O__`P``!0##B70```````````!'.
XM````1P`1````$0```````````@`!```)``0``````,!T@``````````'4F5WB
XM:6YD``````H````!`,($``#!&Q@`P>%(`,(96`#"&9@`PD*P````"6=?4F5W!
XM:6YD``````=297=I;F0``````0`````!``````$``````0``PP"0`0``````#
XM`$L```##`7``PV#P````"%!R;VIE8W0``,,!$`##`I``;`##!R``````$````
XMPPB@``````("`P$```````````!H``@```````````````5,;V%D``````$`I
XM`,,"H`##!T@0<@##"3``````$```PPOP``````("`P$`````````"0!H``@`$
XM``````````````A292UR96%D``````$``,,)6`##!X`0<P##-M@`````$```;
XMPP[8``````("`P$`````````$@!H``@```````````````E3879E(&%S(```?
XM```!``###!``PS<8$'<`PT)``````!```,,^8``````"`@,!`````````!L`2
XM:``(```````````````&5W)I=&4``````0``PS<H`,,W@````,-,:`##3X@0_
XM`````````````@(#`0`````````D`&@`"```````````````!5%U:70`````$
XM`0``PTR0`,-":````,-1V```````````!@(#`0``````(0`#`'@`"```````I
XM````````$"!A<F4@>6]U('-U<F4_(``````!``##3Z@!``!2````.0```,.)V
XMD``````````&5&]O;',``,-2``##81`0+@##B;``````$```PXG8``````("B
XM`P$```````````"```@```````````````5(96QP``````$``,.*(`##BC@0=
XM8`##B?@`````$`````````````("`P$`````````"0"```@`````````````-
X3``Q4;V=G;&4@5&AR=0`````!``("V
X``
Xend
Xsize 1189
END_OF_FILE
if test 1708 -ne `wc -c <'src/MIDIrec.POW.uu'`; then
    echo shar: \"'src/MIDIrec.POW.uu'\" unpacked with wrong size!
fi
# end of 'src/MIDIrec.POW.uu'
fi
if test -f 'src/MIDIrec.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/MIDIrec.c'\"
else
echo shar: Extracting \"'src/MIDIrec.c'\" \(5581 characters\)
sed "s/^X//" >'src/MIDIrec.c' <<'END_OF_FILE'
X/*		M	I	D	I	R	E	C
X
X			      Little MIDI Recorder
X		Written, arranged, produced by Carl Ch. v. Loesch.
X
X	V0.1	February'89,	V0.2	August'89,	V0.3	July'90
X	V1.0	August'90.
X#define	DEBUG
X*/
X#include "Lynx.h"
Xextern	struct	Menu		Menu1;
Xextern	struct	NewWindow	NewWindowStructure1;
XEXPORT	char	ret[80];
X
X#include <MIDI/MIDI.h>
XEXPORT	struct	MidiBase	*MidiBase;
XEXPORT	struct	MSource		*source=0;
XEXPORT	struct	MDest		*dest=0;
XEXPORT	struct	MRoute		*droute=0, *sroute=0, *troute;
Xstatic	struct	MRouteInfo	routeinfo = { MMF_CHAN + MMF_SYSRT, 0xffff };
X
XEXPORT	char	prgname[] =	"Recorder",	*name  = prgname;
XEXPORT	char	midiin[] =	"MidiIn",	*input = midiin;
XEXPORT	char	midiout[] =	"MidiOut",	*output= midiout;
X
X#include <libraries/ARPbase.h>
XEXPORT	struct	ArpBase		*ArpBase;
XEXPORT	struct	IntuitionBase	*IntuitionBase;
XEXPORT	char	file[FCHARS+DSIZE+1]="", dir[DSIZE+1]="Sequences",
X		loadname[FCHARS+1]="Hello", savename[FCHARS+1]="Hello";
XEXPORT	struct	FileRequester	*freq;
XEXPORT	struct	Window		*win;
X
X#define	TAPELEN		15000
XEXPORT	struct Tape {
X	union Event event;
X	short clock;
X} *tape;
X
X#define	RECORDERPRIO	3L
XEXPORT	char	banner[] =
X "*| Little MIDI Recorder V1.0 by Carlo \"Lynx\" von Loesch (c)90 |*";
XEXPORT	char	*title = banner;
XEXPORT	char	nomem[] = "Out of RAM";
XEXPORT	ULONG	tc = 0, tl = 0, ck = 0, nextck, lastck;
XEXPORT	FLAG	on = YES, thru = NO, play = NO, rec = NO;
XEXPORT	long	midisig, videosig, sigs;
X
Xmain(argc, argv) long argc; char *argv[]; {
X	register	long	t;
X	register	short	s;
X	register	union Event	*e;
X
X	ifnot (ArpBase = OpenLibrary("arp.library",ArpVersion))
X		Ciao("No ARP.Library");
X	IntuitionBase =	ArpBase -> IntuiBase;
X	ifnot (MidiBase = ArpOpenLibrary (MIDINAME,MIDIVERSION))
X		Ciao ("No MIDI.Library");
X	ifnot (tape = ArpAlloc (TAPELEN * sizeof(struct Tape)))
X		Ciao (nomem);
X
X	for (t=1; t<argc; t++) {
X		if (argv[t][0]=='-') select (argv[t][1]) {
X			when 'i':	input = argv[++t]; break;
X			when 'o':	output = argv[++t]; break;
X			when 't':	Thru(); break;
X			otherwise	Ciao("Bad args");
X		}
X		else title = name = argv[t];
X	}
X	ifnot (source = CreateMSource (name, NULL))	Ciao (nomem);
X	ifnot (sroute = MRouteSource (source, output, NULL))
X		Ciao ("No route out");
X	ifnot (dest = CreateMDest (name, NULL))		Ciao (nomem);
X	ifnot (droute = MRouteDest (input, dest, &routeinfo))
X		Ciao ("No route in");
X	midisig = 1L<<dest->DestPort->SIGH;
X
X	win = MyOpenWindow(&NewWindowStructure1); Say (banner);
X	SetMenuStrip (win, &Menu1);
X	sigs = videosig | midisig;
X
X	ifnot (freq = ArpAllocFreq()) Ciao (nomem); 
X	freq->fr_Dir = dir; freq->fr_Window = win;
X	freq -> fr_FuncFlags = FRF_NewWindFunc;
X
X#ifdef RECORDERPRIO
X	SetTaskPri(FindTask((char *) 0L), RECORDERPRIO);
X#endif
X	while (on) {
X		t = Wait (sigs);
X		if (t == midisig) while (e = GetMidiMsg (dest)) {
X			HandleMIDI (e->l); FreeMidiMsg (e);
X		} else MyCheckTui();
X	}
X	Ciao (NULL);
X}
X
XHandleMIDI (e) union Event e; {
X	if (e.p[0] > 0xf0) select (e.p[0]) {
Xwhen MS_CLOCK:		if (play) PlayIt(); break;
Xwhen MS_START:		Rewind();
Xwhen MS_CONTINUE:	play=YES; LBUG ("PLAY at clk", ck); break;
Xwhen MS_STOP:		play=NO; LBUG ("STOP at clk", ck); break;
Xotherwise		XBUG ("Weird Event", e.l);
X	}
X	else if (rec && play && tl < TAPELEN) {
X#ifdef TOUCHSTART
X		if (!tl) ck=1;
X	/* start counting from first input, ignoring sync */
X#endif
X		tape[tl].clock = ck - lastck;
X		tape[tl++].event = e;
X		lastck = ck;
X	}
X}
X
XPlayIt() {
X	if (!rec && (ck == nextck)) {
X		PutMidiMsg (source, &tape[tc++].event);
X		while (tape[tc].clock == 0)
X			PutMidiMsg (source, &tape[tc++].event);
X		if (tc < tl) nextck = ck + tape[tc].clock;
X		else nextck = 0;
X	}
X	ck++;
X}
X
XThru() {
X	if (thru = !thru)
X	  if (troute = MRoutePublic (input, output, routeinfo))
X		SPrintf (ret,
X"Route between %s and %s has been established.", input, output);
X	  else { thru = NO; SPrintf (ret,
X"No route between %s and %s could be established.", input, output);
X	  }
X	else {
X		DeleteMRoute (troute);
X		SPrintf (ret, "Ok. No more route between %s and %s.",
X			input, output);
X	}
X	Say (ret);
X}
X
XRecord() {
X	rec=!rec;
X	FBUG ("RECORD", rec);
X	Rewind();
X}
XRewind() {
X	tc=0; ck=1; nextck=(ULONG) tape[0].clock; lastck=1;
X	if (rec) tl=0;
X	LBUG ("REWIND with tl", tl);
X}
XSaveIt() {
X	if (tl) Save (file, &tape[0],(long) tl*sizeof(struct Tape));
X}
XLoadIt() {
X	play=NO; Rewind();
X	tl = Load (file, &tape[0],(long) TAPELEN*sizeof(struct Tape))
X		/ sizeof(struct Tape);
X}
XHelp() {
X	SPrintf (ret, "Clock: %ld, Counter: %ld, SeqLength: %ld.",
X		ck, tc, tl); Say (ret);
X}
X
XMyCheckTui() {
X	register struct	IntuiMessage	*tuimsg;
X	register ULONG	class, obj;
X	register USHORT	code;
X
X	while (tuimsg = GetMsg (win->UserPort)) {
X		class =	tuimsg->Class;
X		code =	tuimsg->Code;
X		obj=	tuimsg->IAddress;	ReplyMsg (tuimsg);
X		switch (class) {
Xcase MENUPICK:		DoMenu(code);		break;
Xcase GADGETUP:		HandleEvent (obj);	break;
Xcase CLOSEWINDOW:	Ciao (NULL);
X		}
X	}
X}
X
XDoMenu (code) USHORT code; {
X	NBUG (" MenuCode", code);
X	select (MENUNUM(code)) {
Xwhen 0:		select (ITEMNUM(code)) {
X	when 0:		LoadAs(); break;
X	when 1:		LoadIt(); break;
X	when 2:		SaveAs(); break;
X	when 3:		SaveIt(); break;
X	when 4:		Ciao(NULL);
X		} break;
Xwhen 1:		select (ITEMNUM(code)) {
X	when 0:		Help(); break;
X	when 1:		Thru();
X		}
X	}
X}
X
XSay (str) char *str; { if (win) SetWindowTitles (win, -1L, str); }
X
XCiao (str)  char *str; {
X	if (win)	CloseWindowSafely (win);
X	if (droute)	DeleteMRoute	(droute);
X	if (sroute)	DeleteMRoute	(sroute);
X	if (thru)	DeleteMRoute	(troute);
X	if (dest)	DeleteMDest	(dest);
X	if (source)	DeleteMSource	(source);
X	if (ArpBase) {
X		if (str)	Puts(str);
X		CloseLibrary	(ArpBase);
X	}
X	exit (str ? 4404L : 0L);
X}
END_OF_FILE
if test 5581 -ne `wc -c <'src/MIDIrec.c'`; then
    echo shar: \"'src/MIDIrec.c'\" unpacked with wrong size!
fi
chmod +x 'src/MIDIrec.c'
# end of 'src/MIDIrec.c'
fi
if test -f 'src/RecPOW.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/RecPOW.c'\"
else
echo shar: Extracting \"'src/RecPOW.c'\" \(3339 characters\)
sed "s/^X//" >'src/RecPOW.c' <<'END_OF_FILE'
X
XSHORT BorderVectors1[] = {
X	0,0,
X	71,0,
X	71,17,
X	0,17,
X	0,0
X};
Xstruct Border Border1 = {
X	-2,-1,
X	3,0,JAM1,
X	5,
X	BorderVectors1,
X	NULL
X};
X
Xstruct IntuiText IText1 = {
X	2,0,JAM2,
X	9,4,
X	NULL,
X	(UBYTE *)"Rewind",
X	NULL
X};
X
Xstruct Gadget g_Rewind = {
X	NULL,
X	7,12,
X	68,16,
X	NULL,
X	RELVERIFY,
X	BOOLGADGET,
X	(APTR)&Border1,
X	NULL,
X	&IText1,
X	NULL,
X	NULL,
X	NULL,
X	NULL
X};
X
XSHORT BorderVectors2[] = {
X	0,0,
X	71,0,
X	71,17,
X	0,17,
X	0,0
X};
Xstruct Border Border2 = {
X	-2,-1,
X	3,0,JAM1,
X	5,
X	BorderVectors2,
X	NULL
X};
X
Xstruct IntuiText IText2 = {
X	2,0,JAM2,
X	8,4,
X	NULL,
X	(UBYTE *)"Record",
X	NULL
X};
X
Xstruct Gadget g_Record = {
X	&g_Rewind,
X	81,12,
X	68,16,
X	NULL,
X	RELVERIFY+TOGGLESELECT,
X	BOOLGADGET,
X	(APTR)&Border2,
X	NULL,
X	&IText2,
X	NULL,
X	NULL,
X	NULL,
X	NULL
X};
X
X#define GadgetList1 g_Record
X
Xstruct IntuiText IText3 = {
X	3,1,COMPLEMENT,
X	0,0,
X	NULL,
X	(UBYTE *)"Toggle Thru",
X	NULL
X};
X
Xstruct MenuItem MenuItem2 = {
X	NULL,
X	0,9,
X	128,8,
X	ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHBOX,
X	0,
X	(APTR)&IText3,
X	NULL,
X	'`',
X	NULL,
X	MENUNULL
X};
X
Xstruct IntuiText IText4 = {
X	3,1,COMPLEMENT,
X	0,0,
X	NULL,
X	(UBYTE *)"Help",
X	NULL
X};
X
Xstruct MenuItem MenuItem1 = {
X	&MenuItem2,
X	0,0,
X	128,8,
X	ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHBOX,
X	0,
X	(APTR)&IText4,
X	NULL,
X	'.',
X	NULL,
X	MENUNULL
X};
X
Xstruct Menu Menu2 = {
X	NULL,
X	82,0,
X	57,0,
X	MENUENABLED,
X	"Tools",
X	&MenuItem1
X};
X
Xstruct IntuiText IText5 = {
X	3,1,COMPLEMENT,
X	0,0,
X	NULL,
X	(UBYTE *)" are you sure? ",
X	NULL
X};
X
Xstruct MenuItem SubItem1 = {
X	NULL,
X	33,3,
X	120,8,
X	ITEMTEXT+ITEMENABLED+HIGHBOX,
X	0,
X	(APTR)&IText5,
X	NULL,
X	NULL,
X	NULL,
X	MENUNULL
X};
X
Xstruct IntuiText IText6 = {
X	3,1,COMPLEMENT,
X	0,0,
X	NULL,
X	(UBYTE *)"Quit",
X	NULL
X};
X
Xstruct MenuItem MenuItem7 = {
X	NULL,
X	0,36,
X	104,8,
X	ITEMTEXT+ITEMENABLED+HIGHBOX,
X	0,
X	(APTR)&IText6,
X	NULL,
X	NULL,
X	&SubItem1,
X	MENUNULL
X};
X
Xstruct IntuiText IText7 = {
X	3,1,COMPLEMENT,
X	0,0,
X	NULL,
X	(UBYTE *)"Write",
X	NULL
X};
X
Xstruct MenuItem MenuItem6 = {
X	&MenuItem7,
X	0,27,
X	104,8,
X	ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHBOX,
X	0,
X	(APTR)&IText7,
X	NULL,
X	'w',
X	NULL,
X	MENUNULL
X};
X
Xstruct IntuiText IText8 = {
X	3,1,COMPLEMENT,
X	0,0,
X	NULL,
X	(UBYTE *)"Save as ",
X	NULL
X};
X
Xstruct MenuItem MenuItem5 = {
X	&MenuItem6,
X	0,18,
X	104,8,
X	ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHBOX,
X	0,
X	(APTR)&IText8,
X	NULL,
X	's',
X	NULL,
X	MENUNULL
X};
X
Xstruct IntuiText IText9 = {
X	3,1,COMPLEMENT,
X	0,0,
X	NULL,
X	(UBYTE *)"Re-read",
X	NULL
X};
X
Xstruct MenuItem MenuItem4 = {
X	&MenuItem5,
X	0,9,
X	104,8,
X	ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHBOX,
X	0,
X	(APTR)&IText9,
X	NULL,
X	'r',
X	NULL,
X	MENUNULL
X};
X
Xstruct IntuiText IText10 = {
X	3,1,COMPLEMENT,
X	0,0,
X	NULL,
X	(UBYTE *)"Load",
X	NULL
X};
X
Xstruct MenuItem MenuItem3 = {
X	&MenuItem4,
X	0,0,
X	104,8,
X	ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHBOX,
X	0,
X	(APTR)&IText10,
X	NULL,
X	'l',
X	NULL,
X	MENUNULL
X};
X
Xstruct Menu Menu1 = {
X	&Menu2,
X	0,0,
X	75,0,
X	MENUENABLED,
X	"Project",
X	&MenuItem3
X};
X
X#define MenuList1 Menu1
X
Xstruct NewWindow NewWindowStructure1 = {
X	485,50,
X	155,31,
X	0,2,
X	GADGETUP+MENUPICK+CLOSEWINDOW,
X	WINDOWDRAG+WINDOWCLOSE+ACTIVATE,
X	&g_Record,
X	NULL,
X	(UBYTE *)" MIDI Recorder ",
X	NULL,
X	NULL,
X	5,5,
X	640,200,
X	WBENCHSCREEN
X};
X
X
Xvoid HandleEvent(object)
XAPTR object;
X{
X  if (object == (APTR)&g_Record) { Record(object); return; }
X  if (object == (APTR)&g_Rewind) { Rewind(object); return; }
X}
X#define HANDLEEVENT HandleEvent
X
X/* end of PowerWindows source generation */
END_OF_FILE
if test 3339 -ne `wc -c <'src/RecPOW.c'`; then
    echo shar: \"'src/RecPOW.c'\" unpacked with wrong size!
fi
chmod +x 'src/RecPOW.c'
# end of 'src/RecPOW.c'
fi
echo shar: End of archive 1 \(of 1\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have the archive.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
Mail comments to the moderator at <amiga-request@uunet.uu.net>.
Post requests for sources, and general discussion to comp.sys.amiga.