home *** CD-ROM | disk | FTP | other *** search
/ Audio 4.94 - Over 11,000 Files / audio-11000.iso / amiga / midi / med210.lhw / in.adf / Source / med210src.lzh / med-newmsgh.c < prev    next >
C/C++ Source or Header  |  1990-07-14  |  24KB  |  795 lines

  1. /* MED - musiikkieditori ⌐ 1989, 1990 by Teijo Kinnunen */
  2. #include <hardware/custom.h>
  3. #include "med.h"
  4. #include "medproto.h"
  5. #define    SHIFT    (IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT)
  6. #define ALT    (ALTLEFT|ALTRIGHT)
  7. extern struct CIA far ciaa;
  8. extern struct Custom far custom;
  9. extern struct Image eq1image;
  10. extern struct RastPort *wrp;
  11. extern struct Kappale far song;
  12. extern struct Window *window,*pw;
  13. extern struct NewWindow far pnw;
  14. extern struct Screen *screen;
  15. extern struct StringInfo strinfo[];
  16. extern struct PropInfo far propinfo[];
  17. extern struct Image far kuviot,far loadgadgimg,far savegadgimg;
  18. extern struct Gadget far gadget1[],far gadget2[],far gadget3[],far gadget4[];
  19. extern struct Gadget far gadget5[],far gadget6[],far gadget9[],far *glists[];
  20. extern struct Gadget far gadget7[],far gadgetA[];
  21. extern UWORD *imgdataptr[],far nappokt,chip mouse0[],chip mouse1[],lastrep,lastreplen;
  22. extern BOOL updscrflag,trackon[];
  23. extern LONG eq1strt0;
  24. extern char kappaleennimi[];
  25. extern UBYTE firstdisptrk,thiscol,counter,lastmidic,lastmidip;
  26. UWORD nykyinenosio;
  27. UBYTE far midiactive = 0;
  28. UBYTE blocks,samplenum = 0,cursorx = 4,currtrk = 0,currpos = 0;
  29. BOOL ilmoitusnakyy = FALSE;
  30. UWORD volatile tempo = 60,pblock,pseqnum,pstate,pline;
  31. WORD volatile actplayline;
  32. struct Lohko far *lohko[100];
  33. static BOOL __regargs Handle7(UWORD);
  34. static void __regargs Handle2(UWORD),Handle3(UWORD),Handle4(UWORD);
  35. static void __regargs Handle5(UWORD),Handle6(UWORD),HandlePlainKey(UWORD,UWORD);
  36. static void __regargs Handle9(UWORD),HandleA(UWORD);
  37. static void __regargs KasitteleNappain(void);
  38. static BOOL __regargs KasitteleGadget(void);
  39. static UBYTE waitsomething;
  40. static char *abouttxt[] = {    "MED V2.10 ⌐1990 by Teijo Kinnunen",
  41.     "Address: Oksantie 19...","SF-86300  OULAINEN, FINLAND",
  42.     "IFF 8SVX loader by S. Hayes","Unauthorized copying of...",
  43.     "...MED V2.10 is absolutely...","...allowed (surprise!!)",
  44.     "---- Greetings: -----","Greetings to Erkki (again...)...",
  45.     "...and to everybody else." };
  46. static UWORD pb2,pl2,psn2;
  47. extern ULONG class;
  48. extern UWORD code,qual;
  49. extern WORD mousey;
  50. extern APTR iaddr;
  51.  
  52. BOOL KasitteleViesti()
  53. {
  54.     if(waitsomething) {
  55.         if(waitsomething == 1 && pw) {
  56.             if(class == MOUSEBUTTONS && code == SELECTUP) return(0);
  57.             eq1strt0 = 0L; CloseWindow(pw); pw = NULL;
  58.             Korosta(&gadget3[6],(BOOL)eq1strt0); }
  59.         waitsomething = 0;
  60.     }
  61.     if(ilmoitusnakyy && (!(class == MOUSEBUTTONS && code ==
  62.         SELECTUP) && (class != RAWKEY || (class == RAWKEY &&
  63.         !(code & 0x80)))))    Ilmoita(NULL);
  64.     Disable();
  65.     pb2 = pblock;    /* copy these variables here, so they won't */
  66.     pl2 = pline;   /* change during handling */
  67.     psn2 = pseqnum;
  68.     Enable();
  69.     switch(class) {
  70.         case RAWKEY:
  71.             KasitteleNappain();
  72.             break;
  73.         case GADGETDOWN:
  74.         case GADGETUP:
  75.             return(KasitteleGadget());
  76.         case MOUSEBUTTONS:
  77.             if(!HandleMBs() && (code == MENUDOWN ||
  78.                 (code == SELECTDOWN && mousey < 11))) {
  79.                 ShowTitle(screen,updscrflag);
  80.                 if(!(updscrflag = !updscrflag)) {
  81.                     RemEqualizer();
  82.                     RemCopperList();
  83.                     if(screen->Height >= 256) eq1strt0 = 0L;
  84.                     if(gadget3[22].GadgetID & 0x1000) InitDisp();
  85.                 } else {
  86.                     if(gadget3[21].GadgetID & 0x1000)
  87.                         InitEqualizer();
  88.                     if(gadget3[6].GadgetID & 0x1000 &&
  89.                         screen->Height >= 256)
  90.                         eq1strt0 = (LONG)(screen
  91.                         ->BitMap.Planes[0]+8484);
  92.                     if(gadget3[22].GadgetID & 0x1000) InitDisp();
  93.                 }
  94.             }
  95.     }
  96.     return(0);    /* ei lopu */
  97. }
  98.  
  99. static BOOL __regargs KasitteleGadget()
  100. {
  101.     UWORD gid = (((struct Gadget *)iaddr)->GadgetID) & 0xfff;
  102.     switch(gid & 0xf00) {
  103.         case 0x100:    OsionValinta((struct Gadget *)iaddr); break;
  104.         case 0x200:    Handle2(gid);    break;
  105.         case 0x300:    Handle3(gid);    break;
  106.         case 0x400:    Handle4(gid);    break;
  107.         case 0x500:    Handle5(gid);    break;
  108.         case 0x600:    Handle6(gid);    break;
  109.         case 0x700:    return(Handle7(gid));    break;
  110.         case 0x800:    Handle8(gid);    break;
  111.         case 0x900:    Handle9(gid);    break;
  112.         case 0xA00:    HandleA(gid);    break;
  113.         case 0xB00:    HandleB(gid);        break;
  114.         case 0xF00:
  115.             if(gid == 0xF00) Handle6(0x600);
  116.             else if(gid == 0xF01) Handle6(0x601);
  117.             else if(gid == 0xF02) {
  118.                 if(nappokt < 3) Handle6((UWORD)(nappokt + 0x613));
  119.                 else Handle6(0x612);
  120.             }
  121.     }
  122.     return(0);
  123. }
  124.  
  125. static void __regargs KasitteleNappain()
  126. {
  127.     UBYTE ntrks;
  128.     if(qual & IEQUALIFIER_CONTROL) {
  129.         switch(code) {
  130.             case 0x05: case 0x06:
  131.                 if(qual & SHIFT) EditHandler((UWORD)(code+0x100));
  132.                 else Handle3((UWORD)(0x302 + code));
  133.                 break;
  134.             case CURSORLEFT:
  135.                 if(firstdisptrk > 4) firstdisptrk -= 4;
  136.                 else if(firstdisptrk) firstdisptrk = 0;
  137.                 else firstdisptrk = lohko[pb2]->numtracks - 4;
  138.                 currtrk = firstdisptrk + currpos;
  139.                 PaivitaNaytto(TRUE);    DispInfoGadgets();
  140.                 break;
  141.             case CURSORRIGHT:
  142.                 ntrks = lohko[pb2]->numtracks;
  143.                 if(firstdisptrk == ntrks - 4)
  144.                     firstdisptrk = 0;
  145.                 else if(firstdisptrk + 4 > ntrks - 4)
  146.                     firstdisptrk = ntrks - 4;
  147.                 else firstdisptrk += 4;
  148.                 currtrk = firstdisptrk + currpos;
  149.                 PaivitaNaytto(TRUE);    DispInfoGadgets();
  150.                 break;
  151.             case 0x3E: Handle3(0x30C); break;
  152.             case 0x1E: Handle3(0x30D); break;
  153.             case 0x3D: Handle3(0x30E); break;
  154.             case 0x1D: Handle3(0x30F); break;
  155.             case 0x2D: Handle3(0x311); break;
  156.             case 0x2F: Handle3(0x310); break;
  157.             case 0x0F: Handle3(0x312); break;
  158.             case 0x3C: Handle3(0x313); break;
  159.             case 0x2E: Handle3(0x314); break;
  160.             case 0x20: Handle6(0x619); break;
  161.             case 0x23: DspFreeMem(); break;
  162.             case 0x40: ResetMIDI(); break;
  163.             case 0x13: RetFileName(); break;
  164.             case 0x37: SetMark(); break;
  165.             case 0x32: case 0x33: case 0x34:
  166.                 HandleMark((UBYTE)code); break;
  167.             default: if((qual & SHIFT) && code >= 0x01 &&
  168.                    code <= 0x0A) EditHandler((UWORD)(code+0x100));
  169.                  else if(code >= 0x50 && code <= 0x59)
  170.                      OsionValinta(&gadget1[code - 0x50]);
  171.                  else HandlePlainKey(code,qual);
  172.         }
  173.     }
  174.     else if(qual & AMIGAKEYS) {
  175.         if(code == 0x28) Handle2(0x214);
  176.         else if(code == 0x17) {
  177.             OsionValinta(&gadget1[2]);
  178.             if(qual & SHIFT) {
  179.                 UWORD pos = RemoveGadget(window,&gadget4[7]);
  180.                 song.sample[samplenum].sname[0] = 0;
  181.                 AddGadget(window,&gadget4[7],pos);
  182.                 RefreshGList(&gadget4[7],window,NULL,1);
  183.             }
  184.             ActivateGadget(&gadget4[7],window,NULL);
  185.         }
  186.         else if(code == 0x23) Handle3(0x305);
  187.         else if(code == 0x26) Handle4(0x406);
  188.         else if(code == 0x33) Handle5((UWORD)(qual&SHIFT?0x504:0x500));
  189.         else if(code == 0x32) Handle5((UWORD)(qual&SHIFT?0x505:0x501));
  190.         else if(code == 0x34) Handle5((UWORD)(qual&SHIFT?0x506:0x502));
  191.         else if(code == 0x14) DoSlide((UBYTE)(qual & SHIFT ? 1:0));
  192.         else if(code == 0x19) Handle3(0x300);
  193.         else if(code == 0x13 && nykyinenosio == 4)
  194.             ActivateGadget(&gadget4[8],window,NULL);
  195.         else HandlePlainKey(code,qual);
  196.     }
  197.     else if((qual & SHIFT) && (qual & ALT)) {
  198.         if(code >= 0x50 && code <= 0x59) Ilmoita(abouttxt[code-0x50]);
  199.         else if(code == 0x40) Handle3(0x300);
  200.         else HandlePlainKey(code,qual);
  201.     }
  202.     else if(qual & SHIFT) {
  203.         switch(code) {
  204.             case 0x40: Handle3(0x303); break;
  205.             case 0x1D: case 0x1E: case 0x1F:
  206.                 Handle6((UWORD)(0x5ED+code));    break;
  207.             case 0x2D: case 0x2E: case 0x2F:
  208.                 Handle6((UWORD)(0x5E0+code));    break;
  209.             case 0x3D: case 0x3E: case 0x3F:
  210.                 Handle6((UWORD)(0x5D3+code));    break;
  211.             default:
  212.                 if((code >= 0x01 && code <= 0x0A) ||
  213.                     code == 0x46)
  214.                     EditHandler(code);
  215.                 else HandlePlainKey(code,qual);
  216.         }
  217.     }
  218.     else if(qual & ALT) {
  219.         BYTE slsteps[] = { -1,1,5 };
  220.         switch(code) {
  221.             case 0x40: Handle3(0x304); break;
  222.             case 0x1D: case 0x1E: case 0x1F:
  223.                 ScrollSLDown(slsteps[code - 0x1D]); break;
  224.             case 0x3D: case 0x3E: case 0x3F:
  225.                 ScrollSLUp(slsteps[code - 0x3D]); break;
  226.             case 0x2D: HandleB(0xB03); break;
  227.             case 0x2E: LoadSelectedSample(); break;
  228.             case 0x2F: HandleB(0xB04); break;
  229.             default:    HandlePlainKey(code,qual);
  230.         }
  231.     }
  232.     else if(code == 0x40) Handle3(0x302); /* Stop playing */
  233.     else HandlePlainKey(code,qual);
  234. }
  235.  
  236. static void __regargs HandlePlainKey(UWORD code,UWORD qual)
  237. {
  238.     switch(code) {
  239.         case CURSORUP:
  240.             if(qual & SHIFT) { if(pb2) pblock = pb2 - 1; }
  241.             else if(qual & ALT) pblock = 0;
  242.             else {
  243.                 Disable(); /* bulletproof (or is it??) */
  244.                 if((gadget6[1].GadgetID & 0x1000) &&
  245.                     !(pline & 0x01) && pline-- <= 0)
  246.                         pline = lohko[pblock]->lines;
  247.                 if(pline-- <= 0) pline = lohko[pblock]->lines;
  248.                 actplayline = pline - 1;
  249.                 Enable();
  250.             }
  251.             if(qual & (SHIFT|ALT)) {
  252.                 pline = 0;
  253.                 actplayline = -1;
  254.             }
  255.             PaivitaNaytto(FALSE);
  256.             break;
  257.         case CURSORDOWN:
  258.             if(qual & SHIFT) { if(pb2 < blocks - 1) pblock = pb2 + 1; }
  259.             else if(qual & ALT) pblock = blocks - 1;
  260.             else {
  261.                 Disable();
  262.                 if((gadget6[1].GadgetID & 0x1000) &&
  263.                     !(pline & 0x01)) pline++;
  264.                 if(++pline > lohko[pblock]->lines)
  265.                     pline -= lohko[pblock]->lines + 1;
  266.                 actplayline = pline - 1;
  267.                 Enable();
  268.             }
  269.             if(qual & (SHIFT|ALT)) {
  270.                 pline = 0;
  271.                 actplayline = -1;
  272.             }
  273.             PaivitaNaytto(FALSE);
  274.             break;
  275.         case CURSORLEFT:
  276.             if(qual & SHIFT) {
  277.                 if(qual & ALT) {
  278.                     if(samplenum >= 16) samplenum -= 16;
  279.                     else samplenum = 0;
  280.                     PaivitaSoittimennimi();
  281.                 } else EdSoitin();
  282.             } else MoveCursor((BYTE)-1,qual);
  283.             break;
  284.         case CURSORRIGHT:
  285.             if(qual & SHIFT) {
  286.                 if(qual & ALT) {
  287.                     if(samplenum <= 46) samplenum += 16;
  288.                     else samplenum = 62;
  289.                     PaivitaSoittimennimi();
  290.                 } else SeurSoitin();
  291.             } else MoveCursor(1,qual);
  292.             break;
  293.         case 0x50: case 0x51: case 0x52: case 0x53:
  294.             Handle6((UWORD)(0x5C2+code));    break;
  295.         case 0x55: case 0x56: case 0x57: case 0x58: case 0x59:
  296.             F6_10(code,pb2); break;
  297.         case 0x45: /* Esc */ Handle6(0x600);    break;
  298.         case 0x1D: case 0x1E: case 0x1F:
  299.             Handle6((UWORD)(0x5E5+code));    break;
  300.         case 0x2D: case 0x2E: case 0x2F:
  301.             Handle6((UWORD)(0x5D8+code));    break;
  302.         case 0x3D: case 0x3E: case 0x3F:
  303.             Handle6((UWORD)(0x5CB+code));    break;
  304.         case 0x5F: Ilmoita("Try Shift+Alt+F1-10!!!"); break;
  305.         case 0:    Handle6(0x601); break; /* 2╫space */
  306.         case 0x42: HLLine(pb2,(UBYTE)pl2); PaivitaNaytto(TRUE); break;
  307.         default:
  308.             SoitaNappain(code,TRUE,qual);
  309.     }
  310. }
  311.  
  312. void OsionValinta(struct Gadget *gd)
  313. {
  314.     UWORD edno = nykyinenosio;
  315.     struct Gadget *scangptr;
  316.     if((gd->GadgetID & 0xff) == nykyinenosio) return; /* ei nykyistΣ */
  317.     Forbid(); /* this may be not necessary, but for to be sure... */
  318.     if(gadget1[12].NextGadget) RemoveGList(window,gadget1[12].NextGadget,-1);
  319.     nykyinenosio = 1;    /* Korosta() tarkistaa nykyisen osion */
  320.     if(edno) Korosta(&gadget1[edno - 2],FALSE);
  321.     edno = gd->GadgetID & 0xff;
  322.     Korosta(&gadget1[edno-2],TRUE);
  323.     nykyinenosio = edno;
  324.     kuviot.ImageData = imgdataptr[nykyinenosio];
  325.     DrawImage(&(screen->RastPort),&kuviot,5,18);
  326.     if(nykyinenosio == 2) {
  327.         if(gadget2[10].GadgetID & 0x1000)
  328.             DrawImage(&(screen->RastPort),&loadgadgimg,162,19);
  329.         else    DrawImage(&(screen->RastPort),&savegadgimg,162,19);
  330.     }
  331.     for(scangptr = glists[nykyinenosio];scangptr;scangptr = scangptr->NextGadget)
  332.         if(scangptr->GadgetID & 0x1000) { /* on korostettu */
  333.             scangptr->GadgetID &= ~0x1000; /* korostus pois */
  334.             Korosta(scangptr,TRUE); /* ja korostetaan taas */
  335.         }
  336.     AddGList(window,glists[nykyinenosio],-1,-1,NULL);
  337.     RefreshGList(glists[nykyinenosio],window,NULL,-1);
  338.     Permit();
  339.     switch(nykyinenosio) { /* osiokohtainen nΣyt÷npΣivitys */
  340.         case 0x2:
  341.             UpdateFReqDsp();    break;
  342.         case 0x5: ShowLineNum();
  343.         case 0x4: case 0x9:    /* soitin, lohko, midi */
  344.             PaivitaSoittimennimi();    break;
  345.         case 0x3:  /* soitto */
  346.             TulostaSoittoLohkot(); ShowTempo();    break;
  347.         case 0x6: DispPrgData(); break;
  348.         case 0x7:  /* muut - lootien vΣrit kohdalleen */
  349.             SetAPen(wrp,4);        RectFill(wrp,55,52,62,59);
  350.             SetAPen(wrp,5);        RectFill(wrp,65,52,72,59);
  351.             SetAPen(wrp,6);        RectFill(wrp,75,52,82,59);
  352.             SetAPen(wrp,7);        RectFill(wrp,85,52,92,59);
  353.             SetAPen(wrp,0);        DrawColorGadgets((BYTE)-1);
  354.             GetUndoColors();    break;
  355.         case 0x8:    ShowVols(); break;
  356.         case 0xA:    PlayTransp(song.playtransp); break;
  357.         case 0xB:    DisplayPathList(); DisplayDirName();
  358.     }
  359. }
  360.  
  361. static void __regargs Handle2(UWORD gid) /* tiedostot */
  362. {
  363.     char *fres;
  364.     switch(gid) {
  365.         case 0x20A:
  366.             Korosta(&gadget2[10],TRUE);
  367.             Korosta(&gadget2[11],FALSE);
  368.             DrawImage(&(screen->RastPort),&loadgadgimg,162,19);
  369.             RemoveGList(window,gadget2[16].NextGadget,-1);
  370.             AddGList(window,&gadget2[17],-1,-1,NULL);
  371.             break;
  372.         case 0x20B:
  373.             Korosta(&gadget2[10],FALSE);
  374.             Korosta(&gadget2[11],TRUE);
  375.             DrawImage(&(screen->RastPort),&savegadgimg,162,19);
  376.             RemoveGList(window,gadget2[16].NextGadget,-1);
  377.             AddGList(window,&gadget2[20],-1,-1,NULL);
  378.             break;
  379.         case 0x214: case 0x215: case 0x216: case 0x217: case 0x218:
  380.             Handle3(0x302); /* Stop playing!!! */
  381.             StartLoad();
  382.             switch(gid) {
  383.                 case 0x214: fres = LoadSong(kappaleennimi);
  384.                         break;
  385.                 case 0x215: strcpy(song.sample[samplenum].sname,kappaleennimi);
  386.                         lastrep = lastreplen = 0;
  387.                         lastmidic = lastmidip = 0;
  388.                         fres = LoadInstrument(kappaleennimi,FALSE);
  389.                         if(fres == NOERR) SampleLoaded();
  390.                         break;
  391.                 case 0x216: fres = STModLoader(kappaleennimi);
  392.                         break;
  393.                 case 0x217: fres = DoSave(); break;
  394.                 case 0x218: fres = SaveRawSample(kappaleennimi);
  395.                         break;
  396.             }
  397.             ClrFileName();
  398.             StopLoad();
  399.             diskerr(fres);
  400.             break;
  401.         case 0x219: fres = DelFile();
  402.                 diskerr(fres);
  403.         case 0x209: break;
  404.         default:
  405.             FReqHandler(gid);    
  406.     }
  407. }
  408.  
  409. static void __regargs Handle3(UWORD gid) /* soitto */
  410. {
  411.     UWORD edpstate = pstate;
  412.     switch(gid) {
  413.         case 0x300:  /* Soita kappale */
  414.             pline = psn2 = pseqnum = 0;
  415.             actplayline = -1;
  416.         case 0x303:  /* Jatka kappaletta */
  417.             pstate = SOITAKAPPALE;
  418.             pblock = song.playseq[psn2];
  419.             Korosta(&gadget3[0],TRUE);
  420.             Korosta(&gadget3[1],FALSE);
  421.             if(edpstate == ALASOITA) {
  422.                 actplayline = pline - 1;
  423.                 ciaa.ciacra |= CIACRAF_START;
  424.             }
  425.             break;
  426.         case 0x301:  /* Soita lohkoa */
  427.             pline = 0;
  428.             actplayline = -1;
  429.         case 0x304:  /* Jatka lohkoa */
  430.             pstate = SOITALOHKO;
  431.             Korosta(&gadget3[0],FALSE);
  432.             Korosta(&gadget3[1],TRUE);
  433.             if(edpstate == ALASOITA) {
  434.                 actplayline = pline - 1;
  435.                 ciaa.ciacra |= CIACRAF_START;
  436.             }
  437.             break;
  438.         case 0x302:  /* Soitto seis!! */
  439.             pstate = ALASOITA;
  440.             Korosta(&gadget3[0],FALSE);
  441.             Korosta(&gadget3[1],FALSE);
  442.             SammutaAanet(999);
  443.             SetPointer(window,&mouse1[0],23,16,-1,0);
  444.             if(qual & SHIFT) {
  445.                 SetCmd(pb2,pl2,currtrk,0xFFE);
  446.                 PaivitaNaytto(TRUE);
  447.             }
  448.             break;
  449.         case 0x305:  /* Suodatin */
  450.             if(qual & SHIFT) {
  451.                 SetCmd(pb2,pl2,currtrk,(UWORD)(song.flags
  452.                     & FLAG_FILTERON ? 0xFF9 : 0xFF8));
  453.                 PaivitaNaytto(TRUE);
  454.             } else {
  455.                 song.flags ^= FLAG_FILTERON;
  456.                 AsetaSuodatin();
  457.             }
  458.             break;
  459.         case 0x306:
  460.             Toggle(&gadget3[6]);
  461.             if(updscrflag) {
  462.                 if(gadget3[6].GadgetID & 0x1000) {
  463.                     if(screen->Height >= 256) eq1strt0 =
  464.                       (LONG)(screen->BitMap.Planes[0]+8484);
  465.                     else if(pw = OpenWindow(&pnw)) {
  466.                       DrawImage(pw->RPort,&eq1image,0,0);
  467.                       eq1strt0=(LONG)(screen->BitMap.Planes[0]+1124);
  468.                       waitsomething = 1; }
  469.                 } else if(screen->Height >= 256) eq1strt0 = 0L;
  470.             }
  471.             break;
  472.         case 0x307:
  473.             song.flags |= FLAG_STSLIDE;
  474.             DispVolAndSldType();
  475.             break;
  476.         case 0x308:
  477.             song.flags &= ~FLAG_STSLIDE;
  478.             DispVolAndSldType();
  479.             break;
  480.         case 0x309: ChgTempo((UWORD)((propinfo[1].HorizPot + 137) /
  481.                 274 + 1)); break;
  482.         case 0x30A: if(tempo > 1) ChgTempo((UWORD)(tempo - 1)); break;
  483.         case 0x30B: if(tempo < 240) ChgTempo((UWORD)(tempo + 1)); break;
  484.         case 0x30C: if(psn2) pseqnum = psn2 - 1; break;
  485.         case 0x30D: if(psn2 < song.songlen) pseqnum = psn2 + 1; break;
  486.         case 0x30E: pseqnum = 0; break;
  487.         case 0x30F: pseqnum = song.songlen - 1; break;
  488.         case 0x310: if(psn2 == song.songlen) { /* + */
  489.                 if(song.songlen < 100)
  490.                   song.playseq[(++song.songlen) - 1] = 0;
  491.                 else DisplayBeep(screen);
  492.             }
  493.             else if(song.playseq[psn2] < blocks - 1)
  494.                 song.playseq[psn2]++;
  495.             break;
  496.         case 0x311: if(psn2 == song.songlen) {    /* - */
  497.                 if(song.songlen > 1) {
  498.                     song.songlen--;
  499.                     pseqnum = psn2 - 1;
  500.                 }
  501.             }
  502.             else if(song.playseq[psn2] > 0)
  503.                 song.playseq[psn2]--;
  504.             break;
  505.         case 0x312: InsertSeq(0); break;
  506.         case 0x313: DelSeq(); break;
  507.         case 0x314: InsertSeq((UBYTE)pb2); break;
  508.         case 0x315: Toggle(&gadget3[21]);
  509.                 if(updscrflag) {
  510.                 if(gadget3[21].GadgetID & 0x1000)
  511.                     InitEqualizer();
  512.                 else { RemEqualizer(); RemCopperList(); }
  513.                 }
  514.                 break;
  515.         case 0x316: Toggle(&gadget3[22]);
  516.                 if(updscrflag) InitDisp();
  517.                 break;
  518.         case 0x317: song.flags |= FLAG_VOLHEX;
  519.                 DispVolAndSldType();
  520.                 break;
  521.         case 0x318: song.flags &= ~FLAG_VOLHEX;
  522.                 DispVolAndSldType();
  523.                 break;
  524.     }
  525.     if(gid >= 0x30C && gid <= 0x311) {
  526.         TulostaLohkoJaSoitin();
  527.         TulostaSoittoLohkot();
  528.     }
  529. }
  530.  
  531. static void __regargs Handle5(UWORD gid) /* lohko 1 */
  532. {
  533.     BOOL doit = 0;
  534.     switch(gid) {
  535.         case 0x50F:
  536.             SetMark();
  537.             break;
  538.         case 0x510: case 0x511: case 0x512:
  539.             HandleMark((UBYTE)(gid - 0x510 + 0x32));
  540.             break;
  541.         case 0x508:  /* Uusi */
  542.             if(blocks < 100 && !AllocBlock((UWORD)blocks,4,64)) blocks++;
  543.             TulostaLohkoJaSoitin();
  544.             break;
  545.         case 0x50A:  /* Tuhoa viim. */
  546.             if(blocks > 1) {
  547.                 Disable();
  548.                 if(pblock < blocks - 1) { blocks--; doit = 1; }
  549.                 Enable();
  550.                 if(doit) FreeBlock((UWORD)blocks);
  551.             }
  552.             TulostaLohkoJaSoitin();
  553.             break;
  554.         case 0x509:  /* Uusi tΣhΣn */
  555.             NewBlockHere(pb2,4,64);
  556.             break;
  557.         case 0x50B:  /* Tuhoa tΣmΣ */
  558.             DelBlockHere(pb2);
  559.             break;
  560.         case 0x500: case 0x501: case 0x502: case 0x503:
  561.             CutCopyPaste((UBYTE)pb2,0,(UWORD)((UWORD)(lohko[pb2]->lines) + 1),
  562.                 (UBYTE)currtrk,1,(UBYTE)(gid-0x500));
  563.             PaivitaNaytto(TRUE);    break;
  564.         case 0x504: case 0x505: case 0x506: case 0x507:
  565.             CutCopyPaste((UBYTE)pb2,0,(UWORD)((UWORD)(lohko[pb2]->lines) + 1),
  566.                 0,lohko[pb2]->numtracks,(UBYTE)(gid-0x504));
  567.             PaivitaNaytto(TRUE);    break;
  568.         case 0x513: case 0x514: case 0x515: case 0x516:
  569.             if(ChangeBlockSize(pb2,(UWORD)(gid - 0x512),
  570.                 (UWORD)((UWORD)(lohko[pb2]->lines) + 1)))
  571.                 Ilmoita(nomem);
  572.             TulostaLohkoJaSoitin();
  573.             break;
  574.         case 0x50C: FreeBuffer(); break;
  575.         case 0x50D: SplitBlock(pb2,pl2); break;
  576.         case 0x50E: JoinBlocks(pb2); break;
  577.     }
  578.     if(gid >= 0x517 && gid <= 0x51D) HighLightLines(pb2,(UWORD)(gid - 0x517));
  579.     else if(gid >= 0x51E && gid <= 0x522) HandleLines(pb2,gid);
  580. }
  581.  
  582. static void __regargs Handle4(UWORD gid) /* soitin */
  583. {
  584.     char *lres;
  585.     switch(gid) {
  586.         case 0x401:
  587.             samplenum = 0;
  588.             PaivitaSoittimennimi();
  589.             break;
  590.         case 0x402:
  591.             samplenum = 62;
  592.             PaivitaSoittimennimi();
  593.             break;
  594.         case 0x403:
  595.             EdSoitin();
  596.             break;
  597.         case 0x404:
  598.             SeurSoitin();
  599.             break;
  600.         case 0x405:    case 0x400:
  601.             StartLoad();
  602.             lastrep = lastreplen = 0;
  603.             lastmidic = lastmidip = 0;
  604.             lres = LoadInstrument(song.sample[samplenum].sname,
  605.                 TRUE);
  606.             PaivitaSoittimennimi();
  607.             StopLoad();
  608.             if(lres == NOERR) SampleLoaded();
  609.             diskerr(lres);
  610.             break;
  611.         case 0x406:  /* hyppΣΣk÷ ukko?????????? */
  612.             if(samplenum < 32) {
  613.                 song.jumpmask ^= 1 << samplenum;
  614.                 if(song.jumpmask & (1 << samplenum))
  615.                     Korosta(&gadget4[6],TRUE);
  616.                 else    Korosta(&gadget4[6],FALSE);
  617.             }
  618.             break;
  619.         case 0x407:    RemoveInstrument();    break;
  620.         case 0x408:    GetRepeat();        break;
  621.         case 0x409:    GetRepLen();        break;
  622.         case 0x40A:
  623.             if(song.sample[samplenum].svol)
  624.                 song.sample[samplenum].svol--;
  625.             DispVolGadget();
  626.             break;
  627.         case 0x40C:
  628.             if(song.sample[samplenum].svol < 64)
  629.               song.sample[samplenum].svol++;
  630.             DispVolGadget();
  631.             break;
  632.         case 0x40B:
  633.             song.sample[samplenum].svol =
  634.                 (propinfo[2].HorizPot + 512) / 1024;
  635.             DispVolGadget();
  636.             break;
  637.         case 0x40D:
  638.             if(song.sample[samplenum].strans > -24)
  639.                 song.sample[samplenum].strans--;
  640.             PaivitaSoittimennimi(); break;
  641.         case 0x40E:
  642.             if(strinfo[8].LongInt >= -24 && strinfo[8].LongInt <= 24)
  643.                 song.sample[samplenum].strans = (BYTE)(strinfo[8].LongInt);
  644.             PaivitaSoittimennimi(); break;
  645.         case 0x40F:
  646.             if(song.sample[samplenum].strans < 24)
  647.                 song.sample[samplenum].strans++;
  648.             PaivitaSoittimennimi();
  649.     }
  650. }
  651.  
  652. static void __regargs Handle6(UWORD gid) /* eli editointi */
  653. {
  654.     if(gid >= 0x612 && gid <= 0x615) {
  655.         Korosta(&gadget6[nappokt + 18],FALSE);
  656.         nappokt = gid - 0x612;
  657.         Korosta(&gadget6[nappokt + 18],TRUE);
  658.     } else if(gid >= 0x602 && gid <= 0x611) {
  659.         Korosta(&gadget6[gid - 0x600],(BOOL)(trackon[gid -
  660.             0x602] = !trackon[gid - 0x602]));
  661.         if(!trackon[gid - 0x602]) SammutaAanet((UWORD)(gid - 0x602));
  662.     } else if(gid == 0x600) Toggle(&gadget6[0]);
  663.     else if(gid == 0x601) Toggle(&gadget6[1]);
  664.     else if(gid == 0x619) Toggle(&gadget6[25]);
  665.     else if(gid == 0x616) DoSlide(0);
  666.     else if(gid == 0x61E) DoSlide(1);
  667.     else EditHandler(gid);    /* jump to local handler routine */
  668.     DispInfoGadgets();
  669. }
  670.  
  671. static void __regargs Handle9(UWORD gid)
  672. {
  673.     switch(gid) {
  674.         case 0x900: /* activate/deactivate MIDI */
  675.             if(gadget9[0].GadgetID & 0x1000) {
  676.                 Korosta(&gadget9[0],FALSE);
  677.                 Korosta(&gadget9[22],FALSE);
  678.                 FreeSerial();
  679.                 midiactive = 0;
  680.             } else if(!GetSerial()) {
  681.                 Korosta(&gadget9[0],TRUE);
  682.                 midiactive = 1;
  683.             } else Ilmoita("Can't allocate serial port.");
  684.             break;
  685.         case 0x913:
  686.             if(song.sample[samplenum].midipreset)
  687.                 song.sample[samplenum].midipreset--;
  688.             DispPresetGadget();
  689.             break;
  690.         case 0x914:
  691.             song.sample[samplenum].midipreset =
  692.                 (propinfo[3].HorizPot + 254) / 510;
  693.             DispPresetGadget();
  694.             break;
  695.         case 0x915:
  696.             if(song.sample[samplenum].midipreset < 128)
  697.                 song.sample[samplenum].midipreset++;
  698.             DispPresetGadget();
  699.             break;
  700.         case 0x912:
  701.             if(strinfo[5].LongInt < 0 || strinfo[5].LongInt
  702.                 > 128) {
  703.                     DisplayBeep(screen);
  704.             } else    song.sample[samplenum].midipreset =
  705.                     (UBYTE)(strinfo[5].LongInt);
  706.             DispPresetGadget();
  707.             break;
  708.         case 0x916:
  709.             if(midiactive)    {
  710.                 Toggle(&gadget9[22]);
  711.                 if(gadget9[22].GadgetID & 0x1000)
  712.                     custom.intena = 0x8800; /*RBF on*/
  713.                 else    custom.intena = 0x0800; /*RBF off*/
  714.             }
  715.             break;
  716.         case 0x917:
  717.             Toggle(&gadget9[23]);
  718.             break;
  719.         default:
  720.             if(gid >= 0x901 && gid <= 0x911) {
  721.                 song.sample[samplenum].midich =    gid-0x901;
  722.                 PaivitaSoittimennimi();
  723.             }
  724.     }
  725. }    
  726.  
  727. static BOOL __regargs Handle7(UWORD gid)
  728. {
  729.     switch(gid) {
  730.         case 0x70D: case 0x70E: case 0x70F:
  731.             if(gid == 0x70D) song.flags &= ~FLAG_JUMPINGON;
  732.             else if(gid == 0x70E) song.flags |=
  733.                 (FLAG_JUMPINGON|FLAG_JUMP8TH);
  734.             else {    song.flags |= FLAG_JUMPINGON;
  735.                 song.flags &= ~FLAG_JUMP8TH;
  736.             }
  737.             UpdateJumpGadgets();
  738.             break;
  739.         case 0x711: case 0x712: case 0x713:
  740.             if(gadget7[gid - 0x701].GadgetID & 0x1000)
  741.                 Korosta(&gadget7[gid - 0x701],FALSE);
  742.             else {
  743.                 Korosta(&gadget7[16],(BOOL)(gid == 0x711));
  744.                 Korosta(&gadget7[17],(BOOL)(gid == 0x712));
  745.                 Korosta(&gadget7[18],(BOOL)(gid == 0x713));
  746.             }
  747.             break;
  748.         case 0x714:
  749.             Handle3(0x302);
  750.             if(gadget7[16].GadgetID & 0x1000) {
  751.                 Korosta(&gadget7[16],FALSE);
  752.                 AlustaKappale(TRUE); PaivitaNaytto(TRUE);
  753.             } else if(gadget7[17].GadgetID & 0x1000) {
  754.                 Korosta(&gadget7[17],FALSE);
  755.                 AlustaKappale(FALSE); PaivitaNaytto(FALSE);
  756.             } else if(gadget7[18].GadgetID & 0x1000) {
  757.                 Korosta(&gadget7[18],FALSE);
  758.                 return(1); /* QUIT !!!!!! */
  759.             }
  760.             break;
  761.         case 0x715: case 0x716:
  762.             Toggle(&gadget7[gid - 0x715 + 20]);
  763.             break;
  764.         default:
  765.             if(gid >= 0x700 && gid <=0x70C) ColorHandler(gid);
  766.     }
  767.     return(0);
  768. }
  769.  
  770. static void __regargs HandleA(UWORD gid)
  771. {
  772.     static BYTE trtb[4] = { 12,1,-1,-12 };
  773.     switch(gid) {
  774.         case 0xA0C: PlayTransp((BYTE)(song.playtransp - 1)); break;
  775.         case 0xA0D: PlayTransp((BYTE)((propinfo[4].HorizPot + 1311) / 2622 - 13)); break;
  776.         case 0xA0E: PlayTransp((BYTE)(song.playtransp + 1)); break;
  777.         case 0xA11: case 0xA12:
  778.             Korosta(&gadgetA[17],(BOOL)(gid == 0xA11));
  779.             Korosta(&gadgetA[18],(BOOL)(gid == 0xA12));
  780.             break;
  781.         case 0xA0F: ExpandBlock(pb2); break;
  782.         case 0xA10: ShrinkBlock(pb2); break;
  783.         default:
  784.             if(gid >= 0xA00 && gid <= 0xA0B)
  785.                 Transpose(trtb[gid & 0x0003],(UBYTE)((gid -
  786.                     0xA00) / 4));
  787.             break;
  788.     }
  789. }
  790.  
  791. void MIDIon() /* called by Load200Song if there are any MIDI instruments */
  792. {
  793.     if(!midiactive) Handle9(0x900);
  794. }
  795.