[Back to COMM SWAG index] [Back to Main SWAG index] [Original]
{
This is a Unit for chat doors written in JsDoor, I've written my
own chat door, and I Really missed my old IceChat Tunes, So i've
Come up with a Note-By-Note Playing Routine for Icechat .ICE files..
This can be used Multi-Node, because it loads the file into memory..
Instead of reading it from disk..
Usage is easy, it's just
GETBANK('FILENAME.ICE');
and then just
PLAYNEXTNOTE;
as long as you want, it will only play one note at a time so you
can use it in a LOOP, I use it to Display the moving Status Bar
while playing the note and watching for local/remote keys....
CJ Cliffe * Shareware Overload BBS (613)382-1924 & (613)382-8503
Voice: (613)382-4194
Please feel free to use this anywhere you want...
As long as someone gets good use out of it i'm happy.. }
Unit PlayIce; (* 1995 by CJ Cliffe *)
Interface
Uses Jsdoor,Jsmisc,Crt;
Procedure Getbank(filename: String);
Procedure PlayNextNote;
Implementation
Var
Counter : Integer;
Cbank : Integer;
Soundbnk: Array [1..1500] of String[20]; {Loads To Memory for faster}
{ or Multinode Operation }
Function Str2Num(Convertme: String): LongInt; {Cheap Way Of Converting}
Var
Counting: Longint; {a Numeric String to an }
Begin
{ Integer }
For Counting := 1 to 1000000 do
begin { 1 Mil is High, But It }
If Convertme = Strfunc(Counting) then
begin { Will Stop Long before }
Str2Num := Counting; { It Gets that far, }
Exit; { Because of this
Exit; }
End;
End;
End;
Procedure Getbank(filename: String);
var fil : Text;
Begin
Counter := 0;
{ Reset All Old Tones and Counter }
For Cbank := 1 to 1500 do begin
{ If Any }
Soundbnk[cbank] := '';
end;
cbank := 0;
Assign(fil,filename); { Get Filname }
Reset(Fil);
Repeat
inc(cbank);
Readln(fil,soundbnk[cbank]); { Load File Into Memory }
Until (cbank = 1500) or (EOF(fil));Close(fil);
End;
Procedure PlayNextNote;
var func : String[4]; {Function WAIT, TONE or Comment}
tone : String[5]; {Tone In String Form}
dura : String[4]; {String Form Of Duration / 10}
Temptone : String; {Temporary Storage String}
Label Top;
Begin
Nosound; {Stop Sound }
Top: {Label for Non-Notes}
Inc(Counter); {Update Note}
If counter = cbank then counter := 1; {Song Has Ended, Restart!}
Temptone := SoundBnk[Counter]; {Make a Temporary Copy of the Note}
Func := Temptone; {Get All The Values}
Tone := Copy(Temptone,5,5); {Note Tone}
Dura := Copy(Temptone,10,5); {Note Duration}
Func := Ltrim(Rtrim(Func)); {Strip Spaces For Number Conversion}
Tone := Ltrim(Rtrim(Tone));
Dura := Ltrim(Rtrim(Dura));
If Copy(Func,1,2) = ';' then Goto Top; {Comment Found, Skip Note}
If Func = 'WAIT' then begin
{WAIT found, Stop Sound and wait} Nosound;
{ Stop Sound For Wait } Delay(Str2Num(Tone)*10);
Exit;
End;
If Func = 'TONE' then begin {Tone Found, Play Note and Wait for}
Sound(Str2Num(Tone)); { Dura(tion) }
Delay(Str2Num(Dura)*10); {Dura is in / 10 format, * 10 for }
NoSound; { Normal Play }
Exit;
End;
End;
Begin
End.
{ I'm Working on a keyboard for recording .ICE files, Watch for it in this
Echo... }
{ -------------------------------------------------------------------------}
{ Example Usage Of PLAYICE.PAS }
{
Program IcePlay;
Uses PlayIce,Crt;
Begin
Clrscr;
Writeln('Playing Song, Any key to Stop');
GetBank('LARRY.ICE');
Repeat
PlayNextNote;
Until Keypressed;
End.
}
[Back to COMM SWAG index] [Back to Main SWAG index] [Original]