Editor hudby pre programy v pascale

Delphi & Pascal (česká wiki)
Přejít na: navigace, hledání
Kategória: KMP (Klub mladých programátorov)

Autor: Martin Koleček
Program: Editsnd.pasSpeaker.pas
Potrebné: Manual_snd.txt

S programem EditSnd.exe je mozne generovat soubory s priponou SND. Tyto soubory maji slouzit k ozvuceni programu na profesionalni urovni pomoci PC Speakeru. Vyuziva se k tomu preruseni od casovace nastavene na 100Hz tzn. vzorkovaci frekvence prehravanych zvuku je 100Hz. Nedochazi ke zhrouceni hodin vse je osetreno tak aby sly prehravat zvuky, aby spravne sly hodiny a zaroven aby program mohl vykonavat jine ulohy. Vse bezi na pozadi pres int8 viz. unit speaker.pas.
{ EDITSND.PAS                          Copyright (c) Martin Kolecek }
{ S programem EditSnd.exe je mozne generovat soubory s priponou SND.}
{ Tyto soubory maji slouzit k ozvuceni programu na profesionalni    }
{ urovni pomoci PC Speakeru. Vyuziva se k tomu preruseni od casovace}
{ nastavene na 100Hz tzn. vzorkovaci frekvence prehravanych zvuku   }
{ je 100Hz. Nedochazi ke zhrouceni hodin vse je osetreno tak aby sly}
{ prehravat zvuky, aby spravne sly hodiny a zaroven aby program mohl}
{ vykonavat jine ulohy. Vse bezi na pozadi pres int8                }
{ viz. unit speaker.pas                                             }
{                                                                   }
{ Author: Martin Kolecek                                            }
{ Datum: 18.05.2009                           http://www.trsek.com  }
 
Program EditSND;
Uses CRT,DOS,Texter;
 
 
Const
  FileNamePripona: string[4] = '.snd';
 
Var
  MMSelect: Byte;
  EditSelect: Byte;
  Sloupec: Byte;
  Posuv: Word;
  Xa: Word;
 
  F: File;
  DirInfo: SearchRec;
  FileName: string[12];
  FileNameJmeno: string[8];
  FileNameDialogOK: Boolean;
  Loading: Boolean;
 
  SoundData: array[0..1999] of Word;
  ZvukTab: array[0..99] of Word;
 
{XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}
Procedure NoBeep;
Begin
  While KeyPressed do ReadKey;
End;
 
 
Procedure Init320x200; Assembler;
Asm
  Mov AH, 00h
  Mov AL, 13h
  Int 10h
End;
 
 
Procedure Init80x25; Assembler;
Asm
  Mov AH, 00h
  Mov AL, 03h
  Int 10h
End;
 
 
Procedure WaitRetrace; Assembler;
Asm
    Mov dx,3DAh
@l1:
    In al,dx
    And al,08h
    Jnz @l1
@l2:
    In al,dx
    And al,08h
    Jz  @l2
End;
 
 
Procedure WritePixel (X:Word;Y:Byte;Barva:Word);
Begin
  MEM[$A000:X+Y*320]:=Barva;
End;
 
 
Procedure Blok(x1,y1,x2,y2,Barva:Word);
Var x,y: Word;
Begin
   For y:=y1 to y2 do
   For x:=x1 to x2 do WritePixel(x,y,Barva);
End;
 
 
Procedure Ramecek (X1,Y1,X2,Y2,Barva: Word);
Var DelkaX,DelkaY,I: Word;
Begin
 DelkaX:=X2-X1; DelkaY:=Y2-Y1;
 For I:=0 to DelkaX do WritePixel (X1+I,Y1,Barva);
 For I:=0 to DelkaX do WritePixel (X1+I,Y2,Barva);
 For I:=0 to DelkaY do WritePixel (X1,Y1+I,Barva);
 For I:=0 to DelkaY do WritePixel (X2,Y1+I,Barva);
End;
 
 
Procedure SoundStorno;
Var I,I2:Word;
Begin
  I2:=350;
  For I:=0 to 3 do
  Begin
    Sound(I2);
    Delay(20);
    NoSound;
    Dec(I2,50);
  End;
End;
 
 
Procedure SoundDone;
Var I,I2:Word;
Begin
  I2:=200;
  For I:=0 to 5 do
  Begin
    Sound(I2);
    Delay(20);
    NoSound;
    Inc(I2,50);
  End;
End;
 
 
Procedure InitArrays;
Var I: Word;
Begin
  For I:=0 to 1999 do SoundData[I]:=0;
  For I:=0 to 99 do ZvukTab[I]:=0;
End;
 
 
Procedure FnSave;
Begin
  Assign(F,Filename);
  Reset(F,1);
  BlockWrite(F,SoundData,4000);
  BlockWrite(F,ZvukTab,200);
  Close(F);
  SoundDone;
End;
 
 
Procedure PlaySample;
Begin
  For Posuv:=0 to ZvukTab[EditSelect*2+1] do
  Begin
    Sound(SoundData[ZvukTab[EditSelect*2]+Posuv]);
    Delay(10);
    NoSound;
  End;
End;
 
 
Procedure WriteEditSoundDataScreen;
var x,y,I,Vyska: Word;
Begin
  x:=0; y:=0;
  Blok(x+1,y+1,x+317,y+197,0);
  Ramecek(x,y,x+318,y+198,50);
 
  {kreslime zaznam zvukove stopy}
  x:=10; y:=180;
  For Posuv:=0 to ZvukTab[EditSelect*2+1] do {Posuv:= 0 to Delka}
  Begin
   For Vyska:=0 to Trunc(SoundData[ZvukTab[EditSelect*2]+Posuv]/10) do
   Begin
     WritePixel(x,y,56);
     Dec(y);
   End;
   y:=180;
   Inc(x);
  End;
 
  {kreslime sipku}
  x:=10+Xa; y:=181;
  WritePixel(x,y,60);
  WritePixel(x,y+1,60);
  WritePixel(x,y+2,60);
  WritePixel(x,y+3,60);
  WritePixel(x,y+4,60);
  WritePixel(x,y+5,60);
  WritePixel(x-1,y+1,60);
  WritePixel(x+1,y+1,60);
  WritePixel(x-2,y+2,60);
  WritePixel(x+2,y+2,60);
 
  {vypisujeme hodnotu zvuku}
  x:=2; y:=2;
  WriteNumber(x,y,SoundData[ZvukTab[EditSelect*2]+Xa],False);
End;
 
 
Procedure EditSoundData;
var Ending: Boolean;
Begin
  Posuv:=0;
  Xa:=0;
  Ending:=False;
  Repeat
    WaitRetrace;
    WriteEditSoundDataScreen;
    ReadKey; Delay(100); NoBeep;
    Case Port[$60] of
{Insert}   82: Begin
                 If SoundData[ZvukTab[EditSelect*2]+Xa]<1000 then
                 Inc(SoundData[ZvukTab[EditSelect*2]+Xa]);
               End;
{Delete}   83: Begin
                 If SoundData[ZvukTab[EditSelect*2]+Xa]>0 then
                 Dec(SoundData[ZvukTab[EditSelect*2]+Xa]);
               End;
{Home}     71: Begin
                 If SoundData[ZvukTab[EditSelect*2]+Xa]<990 then
                 Inc(SoundData[ZvukTab[EditSelect*2]+Xa],10);
               End;
{End}      79: Begin
                 If SoundData[ZvukTab[EditSelect*2]+Xa]>10 then
                 Dec(SoundData[ZvukTab[EditSelect*2]+Xa],10);
               End;
{PageUp}   73: Begin
                 If SoundData[ZvukTab[EditSelect*2]+Xa]<900 then
                 Inc(SoundData[ZvukTab[EditSelect*2]+Xa],100);
               End;
{PageDown} 81: Begin
                 If SoundData[ZvukTab[EditSelect*2]+Xa]>100 then
                 Dec(SoundData[ZvukTab[EditSelect*2]+Xa],100);
               End;
{Left}     75: Begin If Xa>0 then Dec(Xa); End;
{Right}    77: Begin If Xa<ZvukTab[EditSelect*2+1] then Inc(Xa); End;
{P=Play}   25: Begin PlaySample; End;
{F2}       60: Begin FnSave; End;
{F5}       63: Begin Ending:=True; End;
{Esc}       1: Begin Ending:=True; End;
    End; {Case End}
  Until Ending=True;
End;
 
 
Procedure WriteEditScreen;
Var x,y,I,A: Word;
    ZacatekZvuku: Word;
    DelkaZvuku: Word;
    CisloZvuku: Byte;
 
    Procedure VipisRadky;
    Begin
      {Cislo zvuku}
      WriteText(x,y,'ZVUK: ');
      WriteNumber(x+30,y,CisloZvuku,False);
 
      {ZacatekZvuku}
      ZacatekZvuku:=ZvukTab[A];
      WriteText(x+52,y,'ZACATEK=');
      WriteNumber(x+100,y,ZacatekZvuku,False);
 
      {DelkaZvuku}
      DelkaZvuku:=ZvukTab[A+1];
      WriteText(x+130,y,'DELKA=');
      WriteNumber(x+166,y,DelkaZvuku,False);
 
      {Rozsah}
      WriteText(x+208,y,'ROZSAH:');
      WriteNumber(x+249,y,ZacatekZvuku,False);
      WriteText(x+274,y,'-');
      WriteNumber(x+281,y,ZacatekZvuku+DelkaZvuku,False);
 
      Inc(A,2);
      Inc(CisloZvuku);
      Inc(y,10);
    End;
 
Begin
  x:=0; y:=0;
  Blok(x,y,x+318,y+198,0);
 
  If EditSelect in [ 0..19] then
  Begin
    Blok(x,EditSelect*10,x+318,EditSelect*10+6,55);
    If Sloupec=0 then Blok(x+52,EditSelect*10,x+122,EditSelect*10+6,56)
                 else Blok(x+130,EditSelect*10,x+130+52,EditSelect*10+6,56);
  End;
 
  If EditSelect in [20..39] then
  Begin
    Blok(x,EditSelect*10-200,x+318,EditSelect*10-200+6,55);
    If Sloupec=0 then Blok(x+52,EditSelect*10-200,x+122,EditSelect*10-200+6,56)
                 else Blok(x+130,EditSelect*10-200,x+130+52,EditSelect*10-200+6,56);
  End;
 
  If EditSelect in [40..49] then
  Begin
    Blok(x,EditSelect*10-400,x+318,EditSelect*10-400+6,55);
    If Sloupec=0 then Blok(x+52,EditSelect*10-400,x+122,EditSelect*10-400+6,56)
                 else Blok(x+130,EditSelect*10-400,x+130+52,EditSelect*10-400+6,56);
  End;
 
  If EditSelect in [ 0..19] then Begin
                                   CisloZvuku:=0;  A:=0;
                                   For I:=0 to 19 do VipisRadky;
                                 End;
  If EditSelect in [20..39] then Begin
                                   CisloZvuku:=20; A:=40;
                                   For I:=0 to 19 do VipisRadky;
                                 End;
  If EditSelect in [40..49] then Begin
                                   CisloZvuku:=40; A:=80;
                                   For I:=0 to  9 do VipisRadky;
                                 End;
End;
 
 
Procedure FnEditor;
Var Ending:Boolean;
Begin
  Ending:=False;
  EditSelect:=0;
  Sloupec:=0;
  Init320x200;
  InitTexter(50);
  Repeat
    WaitRetrace;
    WriteEditScreen;
    ReadKey; Delay(100); NoBeep;
    Case Port[$60] of
{Insert}   82: Begin
                 If Sloupec=0 then { Zacatek [0..1999] }
                 Begin
                   If ZvukTab[EditSelect*2]+ZvukTab[EditSelect*2+1]<1999 then
                   If ZvukTab[EditSelect*2]<1999 then Inc(ZvukTab[EditSelect*2]);
                 End;
                 If Sloupec=1 then { Delka [0..300] }
                 Begin
                   If ZvukTab[EditSelect*2]+ZvukTab[EditSelect*2+1]<1999 then
                   If ZvukTab[EditSelect*2+1]<300 then Inc(ZvukTab[EditSelect*2+1]);
                 End;
               End;
{Delete}   83: Begin
                 If Sloupec=0 then { Zacatek [0..1999] }
                 If ZvukTab[EditSelect*2]>0 then Dec(ZvukTab[EditSelect*2]);
                 If Sloupec=1 then { Delka [0..300] }
                 If ZvukTab[EditSelect*2+1]>0 then Dec(ZvukTab[EditSelect*2+1]);
               End;
{Home}     71: Begin
                 If Sloupec=0 then { Zacatek [0..1999] }
                 Begin
                   If ZvukTab[EditSelect*2]+ZvukTab[EditSelect*2+1]<1989 then
                   If ZvukTab[EditSelect*2]<1989 then Inc(ZvukTab[EditSelect*2],10);
                 End;
                 If Sloupec=1 then { Delka [0..300] }
                 Begin
                   If ZvukTab[EditSelect*2]+ZvukTab[EditSelect*2+1]<1989 then
                   If ZvukTab[EditSelect*2+1]<290 then Inc(ZvukTab[EditSelect*2+1],10);
                 End;
               End;
{End}      79: Begin
                 If Sloupec=0 then { Zacatek [0..1999] }
                 If ZvukTab[EditSelect*2]>10 then Dec(ZvukTab[EditSelect*2],10);
                 If Sloupec=1 then { Delka [0..300] }
                 If ZvukTab[EditSelect*2+1]>10 then Dec(ZvukTab[EditSelect*2+1],10);
               End;
{PageUp}   73: Begin
                 If Sloupec=0 then { Zacatek [0..1999] }
                 Begin
                   If ZvukTab[EditSelect*2]+ZvukTab[EditSelect*2+1]<1899 then
                   If ZvukTab[EditSelect*2]<1899 then Inc(ZvukTab[EditSelect*2],100);
                 End;
                 If Sloupec=1 then { Delka [0..300] }
                 Begin
                   If ZvukTab[EditSelect*2]+ZvukTab[EditSelect*2+1]<1899 then
                   If ZvukTab[EditSelect*2+1]<200 then Inc(ZvukTab[EditSelect*2+1],100);
                 End;
               End;
{PageDown} 81: Begin
                 If Sloupec=0 then { Zacatek [0..1999] }
                 If ZvukTab[EditSelect*2]>100 then Dec(ZvukTab[EditSelect*2],100);
                 If Sloupec=1 then { Delka [0..300] }
                 If ZvukTab[EditSelect*2+1]>100 then Dec(ZvukTab[EditSelect*2+1],100);
               End;
{Up}       72: Begin If EditSelect>0  then Dec(EditSelect); End;
{Down}     80: Begin If EditSelect<49 then Inc(EditSelect); End;
{Left}     75: Begin If Sloupec>0 then Dec(Sloupec); End;
{Right}    77: Begin If Sloupec<1 then Inc(Sloupec); End;
{P=Play}   25: Begin PlaySample; End;
{F6}       64: Begin EditSoundData; End;
{Enter}    28: Begin EditSoundData; End;
{F2}       60: Begin FnSave; End;
{Esc}       1: Begin Ending:=True; End;
    End; {Case End;}
  Until Ending=True;
  ShutdownTexter;
  Init80x25;
End;
 
 
{XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}
Procedure LoadError(CisloChyby:Byte);
Var ErrorMSG: array[1..8] of String;
    X,Y,I,I2:Byte;
Begin
  ErrorMSG[1]:='Nenalezen soubor';
  ErrorMSG[2]:='Nenalezena cesta';
  ErrorMSG[3]:='Pýˇstup zamˇtnut';
  ErrorMSG[4]:='Neplatně deskriptor';
  ErrorMSG[5]:='Nedostatek pamŘti';
  ErrorMSG[6]:='Neplatn‚ prostýedˇ';
  ErrorMSG[7]:='Neplatně form t';
  ErrorMSG[8]:='Soubor nenalezen';
  {Vypisujeme Error MSG yellow}
  X:=27; Y:=12; {souradnice ErrorMSG}
  TextColor(14); {Zluty ramecek ErrorMSG}
  For I:=0 to 22 do Begin GotoXY(X+I,Y); Write('Ü'); End;
  For I:=0 to 22 do Begin GotoXY(X+I,Y+3); Write('ß'); End;
  GotoXY(X,Y+1);     Write('Ű');
  GotoXY(X+22,Y+1);  Write('Ű');
  GotoXY(X,Y+2);     Write('Ű');
  GotoXY(X+22,Y+2);  Write('Ű');
  TextBackground(4); {Cervene pozadi ramecku}
  For I2:=1 to 2 do {vypln}
  For I:=0 to 20 do Begin GotoXY(X+1+I,Y+I2); Write(' '); End;
  GotoXY(X+2,Y+1); Write('CHYBA      ESC=EXIT');
  {Vypisujeme vzniklou chybu}
  GotoXY(X+2,Y+2);
  Case CisloChyby of
    1: Write(ErrorMSG[1]);
    2: Write(ErrorMSG[2]);
    3: Write(ErrorMSG[3]);
    4: Write(ErrorMSG[4]);
    5: Write(ErrorMSG[5]);
    6: Write(ErrorMSG[6]);
    7: Write(ErrorMSG[7]);
    8: Write(ErrorMSG[8]);
  End;
  Repeat Until Port[$60]=1; {Cekej na ESC}
  TextColor(7); TextBackground(0); {Set puvodni}
  GotoXY(X,Y);    ClrEol; {Smazat ErrorMSG Okno}
  GotoXY(X,Y+1);  ClrEol; {Smazat ErrorMSG Okno}
  GotoXY(X,Y+2);  ClrEol; {Smazat ErrorMSG Okno}
  GotoXY(X,Y+3);  ClrEol; {Smazat ErrorMSG Okno}
End;
 
 
Procedure FileNameDialog;
Begin
  TextColor(7); TextBackground(0);
  GotoXY(41,3); Write('ÄÄÄÄÄÄÄÄ');
  GotoXY(27,2); Write('jmeno souboru=');
  ReadLN(FileNameJmeno);
  FileName:=FileNameJmeno+FileNamePripona;
  If Loading=True then
  Begin
    FindFirst(FileName,Archive,DirInfo);
    If DosError>0 then Begin
                         FileNameDialogOK:=False;
                         Case DosError of
                           2: LoadError(1); {Nenalezen soubor}
                           3: LoadError(2); {Nenalezena cesta}
                           5: LoadError(3); {Pýˇstup zamˇtnut}
                           6: LoadError(4); {Neplatně deskriptor}
                           8: LoadError(5); {Nedostatek pamŘti}
                          10: LoadError(6); {Neplatn‚ prostýedˇ}
                          11: LoadError(7); {Neplatně form t}
                          18: LoadError(8); {Soubor nenalezen}
                         End;
                       End
                  else FileNameDialogOK:=True; {DosError=0 tzn. zadna chyba}
  End;
  Loading:=False;
  GotoXY(41,3); ClrEol;
  GotoXY(27,2); ClrEol;
End;
 
 
Procedure FnLoad;
Begin
  Loading:=True;
  FileNameDialog;
  If FileNameDialogOK=True then
  Begin
    Assign(F,Filename);
    Reset(F,1);
    BlockRead(F,SoundData,4000);
    BlockRead(F,ZvukTab,200);
    Close(F);
    SoundDone;
  End
  else FileName:='none';
End;
 
 
Procedure FnCreate;
Var I: Byte;
Begin
  FileNameDialog;
  Assign(F,Filename);
  ReWrite(F,1);
  BlockWrite(F,SoundData,4000);
  BlockWrite(F,ZvukTab,200);
  Close(F);
  SoundDone;
End;
 
 
Procedure FnHelp;
Var I: Byte;
    Ending: Boolean;
Begin
  GotoXY(1,8);  For I:=1 to 80 do Write('Ü');
  GotoXY(1,24); For I:=1 to 80 do Write('ß');
  GotoXY(1,9);  For I:=9 to 23 do Begin GotoXY(1,I); Write('Ű'); End;
  GotoXY(80,9); For I:=9 to 23 do Begin GotoXY(80,I); Write('Ű'); End;
  GotoXY(3,9);  Write('                                                                    Esc=ZpŘt');
  GotoXY(3,10); Write(' Hlavnˇ nabˇdka (textov‚ menu):                                             ');
  GotoXY(3,11); Write(' F1=Help, F2=Save, F3=Load, F4=New File, F5=Editor zvuk…                    ');
  GotoXY(3,13); Write(' Editor zvuk…:                                                              ');
  GotoXY(3,14); Write(' çipky nahoru dol… = věbŘr zvuku, doleva doprava = editace Zaź tku / D‚lky  ');
  GotoXY(3,15); Write(' F6 nebo ENTER = editovat vybraně zvuk, Esc nebo F5 = ZpŘt                  ');
  GotoXY(3,16); Write('                                                                            ');
  GotoXY(3,17); Write(' Insert Delete = pýidat ubrat jednotky                                      ');
  GotoXY(3,18); Write(' Home End = pýidat ubrat desˇtky                                            ');
  GotoXY(3,19); Write(' PgUp PgDn = pýidat ubrat stovky                                            ');
  GotoXY(3,20); Write('                                                                            ');
  GotoXY(3,21); Write(' F10 v textov‚m menu = Exit                                                 ');
  Ending:=False;
  Repeat
    ReadKey; Delay(100); NoBeep;
    Case Port[$60] of
{ESC}    1: Begin Ending:=True; End;
    End; {Case End}
  Until Ending=True;
  For I:=8 to 24 do Begin GotoXY(1,I); ClrEol; End;
End;
 
 
Procedure MMFunction; {enter in menu function}
Begin
  Case MMSelect of
    0: Begin SoundStorno;                                       End; {NIC}
    1: Begin If FileName='none' then FnCreate Else SoundStorno; End; {NEW}
    2: Begin If FileName='none' then SoundStorno Else FnSave;   End; {SAVE}
    3: Begin If FileName='none' then FnLoad Else SoundStorno;   End; {OPEN}
    4: Begin If FileName='none' then SoundStorno Else FnEditor; End; {EDITOR}
    5: Begin FnHelp;                                            End; {HELP}
  End;
End;
 
 
Procedure WriteNabidka;
Begin
  TextColor(14); TextBackground(1);
  GotoXY(1,2); Write('vytvoýit F4');
  GotoXY(1,3); Write('ulo§it   F2');
  GotoXY(1,4); Write('otevýˇt  F3');
  GotoXY(1,5); Write('editor   F5');
  GotoXY(1,6); Write('n povŘda F1');
  TextColor(7); TextBackground(0);
  GotoXY(80,25);
End;
 
 
 
Procedure WriteLista;
Var I: Byte;
Begin
  TextColor(14); TextBackground(1);
  GotoXY(1,1); For I:=1 to 79 do Write(' ');
  GotoXY(2,1); Write('ÉMENU»');
  GotoXY(14,1); Write('EDITOR ZVUKU');
  GotoXY(34,1); Write('soubor=',FileName);
  GotoXY(73,1); Write('F10=EXIT');
  TextColor(7); TextBackground(0);
  GotoXY(80,25);
End;
 
 
Procedure WriteMenu;
Begin
  WriteLista; If MMSelect>0 then WriteNabidka;
  Case MMSelect of
    0: Begin
         TextColor(7); TextBackground(0);
         GotoXY(1,2); ClrEol;
         GotoXY(1,3); ClrEol;
         GotoXY(1,4); ClrEol;
         GotoXY(1,5); ClrEol;
         GotoXY(1,6); ClrEol;
         GotoXY(80,25);
       End;
    1: Begin
         TextColor(2); TextBackground(4);
         GotoXY(1,2); Write('vytvoýit F4');
         TextColor(7); TextBackground(0);
       End;
    2: Begin
         TextColor(2); TextBackground(4);
         GotoXY(1,3); Write('ulo§it   F2');
         TextColor(7); TextBackground(0);
       End;
    3: Begin
         TextColor(2); TextBackground(4);
         GotoXY(1,4); Write('otevýˇt  F3');
         TextColor(7); TextBackground(0);
       End;
    4: Begin
         TextColor(2); TextBackground(4);
         GotoXY(1,5); Write('editor   F5');
         TextColor(7); TextBackground(0);
       End;
    5: Begin
         TextColor(2); TextBackground(4);
         GotoXY(1,6); Write('n povŘda F1');
         TextColor(7); TextBackground(0);
       End;
  End;{Case End}
End;
 
 
Procedure MainMenu;
Var Ending: Boolean;
Begin
  ClrScr;
  MMSelect:=0;
  Ending:=False;
  Repeat
    WriteMenu;
    ReadKey; Delay(100); NoBeep;
    Case Port[$60] of
{ESC}    1: Begin MMSelect:=0; End;
{UP}    72: Begin If MMSelect>1 then Dec(MMSelect) Else MMSelect:=5; End;
{DOWN}  80: Begin If MMSelect<5 then Inc(MMSelect) Else MMSelect:=1; End;
{ENTER} 28: Begin MMFunction; End;
{F1}    59: Begin FnHelp; End;
{F2}    60: Begin If FileName='none' then SoundStorno Else FnSave; End;
{F3}    61: Begin If FileName='none' then FnLoad Else SoundStorno; End;
{F4}    62: Begin If FileName='none' then FnCreate Else SoundStorno; End;
{F5}    63: Begin If FileName='none' then SoundStorno Else FnEditor; End;
{F10}   68: Begin Ending:=True; End;
    End; {Case End}
  Until Ending=True;
End;
 
 
Procedure Main;
Begin
  InitArrays;
  FileName:='none';
  Loading:=False;
  MainMenu;
  ClrScr;
End;
 
 
{XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}
Begin Main; End.