/* MED - musiikkieditori © 1989, 1990 by Teijo Kinnunen */
#include <hardware/custom.h>
#include "med.h"
#include "medproto.h"
#define	SHIFT	(IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT)
#define ALT	(ALTLEFT|ALTRIGHT)
extern struct CIA far ciaa;
extern struct Custom far custom;
extern struct Image eq1image;
extern struct RastPort *wrp;
extern struct Kappale far song;
extern struct Window *window,*pw;
extern struct NewWindow far pnw;
extern struct Screen *screen;
extern struct StringInfo strinfo[];
extern struct PropInfo far propinfo[];
extern struct Image far kuviot,far loadgadgimg,far savegadgimg;
extern struct Gadget far gadget1[],far gadget2[],far gadget3[],far gadget4[];
extern struct Gadget far gadget5[],far gadget6[],far gadget9[],far *glists[];
extern struct Gadget far gadget7[],far gadgetA[];
extern UWORD *imgdataptr[],far nappokt,chip mouse0[],chip mouse1[],lastrep,lastreplen;
extern BOOL updscrflag,trackon[];
extern LONG eq1strt0;
extern char kappaleennimi[];
extern UBYTE firstdisptrk,thiscol,counter,lastmidic,lastmidip;
UWORD nykyinenosio;
UBYTE far midiactive = 0;
UBYTE blocks,samplenum = 0,cursorx = 4,currtrk = 0,currpos = 0;
BOOL ilmoitusnakyy = FALSE;
UWORD volatile tempo = 60,pblock,pseqnum,pstate,pline;
WORD volatile actplayline;
struct Lohko far *lohko[100];
static BOOL __regargs Handle7(UWORD);
static void __regargs Handle2(UWORD),Handle3(UWORD),Handle4(UWORD);
static void __regargs Handle5(UWORD),Handle6(UWORD),HandlePlainKey(UWORD,UWORD);
static void __regargs Handle9(UWORD),HandleA(UWORD);
static void __regargs KasitteleNappain(void);
static BOOL __regargs KasitteleGadget(void);
static UBYTE waitsomething;
static char *abouttxt[] = {	"MED V2.10 ©1990 by Teijo Kinnunen",
	"Address: Oksantie 19...","SF-86300  OULAINEN, FINLAND",
	"IFF 8SVX loader by S. Hayes","Unauthorized copying of...",
	"...MED V2.10 is absolutely...","...allowed (surprise!!)",
	"---- Greetings: -----","Greetings to Erkki (again...)...",
	"...and to everybody else." };
static UWORD pb2,pl2,psn2;
extern ULONG class;
extern UWORD code,qual;
extern WORD mousey;
extern APTR iaddr;

BOOL KasitteleViesti()
{
	if(waitsomething) {
		if(waitsomething == 1 && pw) {
			if(class == MOUSEBUTTONS && code == SELECTUP) return(0);
			eq1strt0 = 0L; CloseWindow(pw); pw = NULL;
			Korosta(&gadget3[6],(BOOL)eq1strt0); }
		waitsomething = 0;
	}
	if(ilmoitusnakyy && (!(class == MOUSEBUTTONS && code ==
		SELECTUP) && (class != RAWKEY || (class == RAWKEY &&
		!(code & 0x80)))))	Ilmoita(NULL);
	Disable();
	pb2 = pblock;	/* copy these variables here, so they won't */
	pl2 = pline;   /* change during handling */
	psn2 = pseqnum;
	Enable();
	switch(class) {
		case RAWKEY:
			KasitteleNappain();
			break;
		case GADGETDOWN:
		case GADGETUP:
			return(KasitteleGadget());
		case MOUSEBUTTONS:
			if(!HandleMBs() && (code == MENUDOWN ||
				(code == SELECTDOWN && mousey < 11))) {
				ShowTitle(screen,updscrflag);
				if(!(updscrflag = !updscrflag)) {
					RemEqualizer();
					RemCopperList();
					if(screen->Height >= 256) eq1strt0 = 0L;
					if(gadget3[22].GadgetID & 0x1000) InitDisp();
				} else {
					if(gadget3[21].GadgetID & 0x1000)
						InitEqualizer();
					if(gadget3[6].GadgetID & 0x1000 &&
						screen->Height >= 256)
						eq1strt0 = (LONG)(screen
						->BitMap.Planes[0]+8484);
					if(gadget3[22].GadgetID & 0x1000) InitDisp();
				}
			}
	}
	return(0);	/* ei lopu */
}

static BOOL __regargs KasitteleGadget()
{
	UWORD gid = (((struct Gadget *)iaddr)->GadgetID) & 0xfff;
	switch(gid & 0xf00) {
		case 0x100:	OsionValinta((struct Gadget *)iaddr); break;
		case 0x200:	Handle2(gid);	break;
		case 0x300:	Handle3(gid);	break;
		case 0x400:	Handle4(gid);	break;
		case 0x500:	Handle5(gid);	break;
		case 0x600:	Handle6(gid);	break;
		case 0x700:	return(Handle7(gid));	break;
		case 0x800:	Handle8(gid);	break;
		case 0x900:	Handle9(gid);	break;
		case 0xA00:	HandleA(gid);	break;
		case 0xB00:	HandleB(gid);		break;
		case 0xF00:
			if(gid == 0xF00) Handle6(0x600);
			else if(gid == 0xF01) Handle6(0x601);
			else if(gid == 0xF02) {
				if(nappokt < 3) Handle6((UWORD)(nappokt + 0x613));
				else Handle6(0x612);
			}
	}
	return(0);
}

static void __regargs KasitteleNappain()
{
	UBYTE ntrks;
	if(qual & IEQUALIFIER_CONTROL) {
		switch(code) {
			case 0x05: case 0x06:
				if(qual & SHIFT) EditHandler((UWORD)(code+0x100));
				else Handle3((UWORD)(0x302 + code));
				break;
			case CURSORLEFT:
				if(firstdisptrk > 4) firstdisptrk -= 4;
				else if(firstdisptrk) firstdisptrk = 0;
				else firstdisptrk = lohko[pb2]->numtracks - 4;
				currtrk = firstdisptrk + currpos;
				PaivitaNaytto(TRUE);	DispInfoGadgets();
				break;
			case CURSORRIGHT:
				ntrks = lohko[pb2]->numtracks;
				if(firstdisptrk == ntrks - 4)
					firstdisptrk = 0;
				else if(firstdisptrk + 4 > ntrks - 4)
					firstdisptrk = ntrks - 4;
				else firstdisptrk += 4;
				currtrk = firstdisptrk + currpos;
				PaivitaNaytto(TRUE);	DispInfoGadgets();
				break;
			case 0x3E: Handle3(0x30C); break;
			case 0x1E: Handle3(0x30D); break;
			case 0x3D: Handle3(0x30E); break;
			case 0x1D: Handle3(0x30F); break;
			case 0x2D: Handle3(0x311); break;
			case 0x2F: Handle3(0x310); break;
			case 0x0F: Handle3(0x312); break;
			case 0x3C: Handle3(0x313); break;
			case 0x2E: Handle3(0x314); break;
			case 0x20: Handle6(0x619); break;
			case 0x23: DspFreeMem(); break;
			case 0x40: ResetMIDI(); break;
			case 0x13: RetFileName(); break;
			case 0x37: SetMark(); break;
			case 0x32: case 0x33: case 0x34:
				HandleMark((UBYTE)code); break;
			default: if((qual & SHIFT) && code >= 0x01 &&
				   code <= 0x0A) EditHandler((UWORD)(code+0x100));
				 else if(code >= 0x50 && code <= 0x59)
				 	OsionValinta(&gadget1[code - 0x50]);
				 else HandlePlainKey(code,qual);
		}
	}
	else if(qual & AMIGAKEYS) {
		if(code == 0x28) Handle2(0x214);
		else if(code == 0x17) {
			OsionValinta(&gadget1[2]);
			if(qual & SHIFT) {
				UWORD pos = RemoveGadget(window,&gadget4[7]);
				song.sample[samplenum].sname[0] = 0;
				AddGadget(window,&gadget4[7],pos);
				RefreshGList(&gadget4[7],window,NULL,1);
			}
			ActivateGadget(&gadget4[7],window,NULL);
		}
		else if(code == 0x23) Handle3(0x305);
		else if(code == 0x26) Handle4(0x406);
		else if(code == 0x33) Handle5((UWORD)(qual&SHIFT?0x504:0x500));
		else if(code == 0x32) Handle5((UWORD)(qual&SHIFT?0x505:0x501));
		else if(code == 0x34) Handle5((UWORD)(qual&SHIFT?0x506:0x502));
		else if(code == 0x14) DoSlide((UBYTE)(qual & SHIFT ? 1:0));
		else if(code == 0x19) Handle3(0x300);
		else if(code == 0x13 && nykyinenosio == 4)
			ActivateGadget(&gadget4[8],window,NULL);
		else HandlePlainKey(code,qual);
	}
	else if((qual & SHIFT) && (qual & ALT)) {
		if(code >= 0x50 && code <= 0x59) Ilmoita(abouttxt[code-0x50]);
		else if(code == 0x40) Handle3(0x300);
		else HandlePlainKey(code,qual);
	}
	else if(qual & SHIFT) {
		switch(code) {
			case 0x40: Handle3(0x303); break;
			case 0x1D: case 0x1E: case 0x1F:
				Handle6((UWORD)(0x5ED+code));	break;
			case 0x2D: case 0x2E: case 0x2F:
				Handle6((UWORD)(0x5E0+code));	break;
			case 0x3D: case 0x3E: case 0x3F:
				Handle6((UWORD)(0x5D3+code));	break;
			default:
				if((code >= 0x01 && code <= 0x0A) ||
					code == 0x46)
					EditHandler(code);
				else HandlePlainKey(code,qual);
		}
	}
	else if(qual & ALT) {
		BYTE slsteps[] = { -1,1,5 };
		switch(code) {
			case 0x40: Handle3(0x304); break;
			case 0x1D: case 0x1E: case 0x1F:
				ScrollSLDown(slsteps[code - 0x1D]); break;
			case 0x3D: case 0x3E: case 0x3F:
				ScrollSLUp(slsteps[code - 0x3D]); break;
			case 0x2D: HandleB(0xB03); break;
			case 0x2E: LoadSelectedSample(); break;
			case 0x2F: HandleB(0xB04); break;
			default:	HandlePlainKey(code,qual);
		}
	}
	else if(code == 0x40) Handle3(0x302); /* Stop playing */
	else HandlePlainKey(code,qual);
}

static void __regargs HandlePlainKey(UWORD code,UWORD qual)
{
	switch(code) {
		case CURSORUP:
			if(qual & SHIFT) { if(pb2) pblock = pb2 - 1; }
			else if(qual & ALT) pblock = 0;
			else {
				Disable(); /* bulletproof (or is it??) */
				if((gadget6[1].GadgetID & 0x1000) &&
					!(pline & 0x01) && pline-- <= 0)
						pline = lohko[pblock]->lines;
				if(pline-- <= 0) pline = lohko[pblock]->lines;
				actplayline = pline - 1;
				Enable();
			}
			if(qual & (SHIFT|ALT)) {
				pline = 0;
				actplayline = -1;
			}
			PaivitaNaytto(FALSE);
			break;
		case CURSORDOWN:
			if(qual & SHIFT) { if(pb2 < blocks - 1) pblock = pb2 + 1; }
			else if(qual & ALT) pblock = blocks - 1;
			else {
				Disable();
				if((gadget6[1].GadgetID & 0x1000) &&
					!(pline & 0x01)) pline++;
				if(++pline > lohko[pblock]->lines)
					pline -= lohko[pblock]->lines + 1;
				actplayline = pline - 1;
				Enable();
			}
			if(qual & (SHIFT|ALT)) {
				pline = 0;
				actplayline = -1;
			}
			PaivitaNaytto(FALSE);
			break;
		case CURSORLEFT:
			if(qual & SHIFT) {
				if(qual & ALT) {
					if(samplenum >= 16) samplenum -= 16;
					else samplenum = 0;
					PaivitaSoittimennimi();
				} else EdSoitin();
			} else MoveCursor((BYTE)-1,qual);
			break;
		case CURSORRIGHT:
			if(qual & SHIFT) {
				if(qual & ALT) {
					if(samplenum <= 46) samplenum += 16;
					else samplenum = 62;
					PaivitaSoittimennimi();
				} else SeurSoitin();
			} else MoveCursor(1,qual);
			break;
		case 0x50: case 0x51: case 0x52: case 0x53:
			Handle6((UWORD)(0x5C2+code));	break;
		case 0x55: case 0x56: case 0x57: case 0x58: case 0x59:
			F6_10(code,pb2); break;
		case 0x45: /* Esc */ Handle6(0x600);	break;
		case 0x1D: case 0x1E: case 0x1F:
			Handle6((UWORD)(0x5E5+code));	break;
		case 0x2D: case 0x2E: case 0x2F:
			Handle6((UWORD)(0x5D8+code));	break;
		case 0x3D: case 0x3E: case 0x3F:
			Handle6((UWORD)(0x5CB+code));	break;
		case 0x5F: Ilmoita("Try Shift+Alt+F1-10!!!"); break;
		case 0:	Handle6(0x601); break; /* 2×space */
		case 0x42: HLLine(pb2,(UBYTE)pl2); PaivitaNaytto(TRUE); break;
		default:
			SoitaNappain(code,TRUE,qual);
	}
}

void OsionValinta(struct Gadget *gd)
{
	UWORD edno = nykyinenosio;
	struct Gadget *scangptr;
	if((gd->GadgetID & 0xff) == nykyinenosio) return; /* ei nykyistä */
	Forbid(); /* this may be not necessary, but for to be sure... */
	if(gadget1[12].NextGadget) RemoveGList(window,gadget1[12].NextGadget,-1);
	nykyinenosio = 1;	/* Korosta() tarkistaa nykyisen osion */
	if(edno) Korosta(&gadget1[edno - 2],FALSE);
	edno = gd->GadgetID & 0xff;
	Korosta(&gadget1[edno-2],TRUE);
	nykyinenosio = edno;
	kuviot.ImageData = imgdataptr[nykyinenosio];
	DrawImage(&(screen->RastPort),&kuviot,5,18);
	if(nykyinenosio == 2) {
		if(gadget2[10].GadgetID & 0x1000)
			DrawImage(&(screen->RastPort),&loadgadgimg,162,19);
		else	DrawImage(&(screen->RastPort),&savegadgimg,162,19);
	}
	for(scangptr = glists[nykyinenosio];scangptr;scangptr = scangptr->NextGadget)
		if(scangptr->GadgetID & 0x1000) { /* on korostettu */
			scangptr->GadgetID &= ~0x1000; /* korostus pois */
			Korosta(scangptr,TRUE); /* ja korostetaan taas */
		}
	AddGList(window,glists[nykyinenosio],-1,-1,NULL);
	RefreshGList(glists[nykyinenosio],window,NULL,-1);
	Permit();
	switch(nykyinenosio) { /* osiokohtainen näytönpäivitys */
		case 0x2:
			UpdateFReqDsp();	break;
		case 0x5: ShowLineNum();
		case 0x4: case 0x9:	/* soitin, lohko, midi */
			PaivitaSoittimennimi();	break;
		case 0x3:  /* soitto */
			TulostaSoittoLohkot(); ShowTempo();	break;
		case 0x6: DispPrgData(); break;
		case 0x7:  /* muut - lootien värit kohdalleen */
			SetAPen(wrp,4);		RectFill(wrp,55,52,62,59);
			SetAPen(wrp,5);		RectFill(wrp,65,52,72,59);
			SetAPen(wrp,6);		RectFill(wrp,75,52,82,59);
			SetAPen(wrp,7);		RectFill(wrp,85,52,92,59);
			SetAPen(wrp,0);		DrawColorGadgets((BYTE)-1);
			GetUndoColors();	break;
		case 0x8:	ShowVols(); break;
		case 0xA:	PlayTransp(song.playtransp); break;
		case 0xB:	DisplayPathList(); DisplayDirName();
	}
}

static void __regargs Handle2(UWORD gid) /* tiedostot */
{
	char *fres;
	switch(gid) {
		case 0x20A:
			Korosta(&gadget2[10],TRUE);
			Korosta(&gadget2[11],FALSE);
			DrawImage(&(screen->RastPort),&loadgadgimg,162,19);
			RemoveGList(window,gadget2[16].NextGadget,-1);
			AddGList(window,&gadget2[17],-1,-1,NULL);
			break;
		case 0x20B:
			Korosta(&gadget2[10],FALSE);
			Korosta(&gadget2[11],TRUE);
			DrawImage(&(screen->RastPort),&savegadgimg,162,19);
			RemoveGList(window,gadget2[16].NextGadget,-1);
			AddGList(window,&gadget2[20],-1,-1,NULL);
			break;
		case 0x214: case 0x215: case 0x216: case 0x217: case 0x218:
			Handle3(0x302); /* Stop playing!!! */
			StartLoad();
			switch(gid) {
				case 0x214: fres = LoadSong(kappaleennimi);
						break;
				case 0x215: strcpy(song.sample[samplenum].sname,kappaleennimi);
					    lastrep = lastreplen = 0;
					    lastmidic = lastmidip = 0;
					    fres = LoadInstrument(kappaleennimi,FALSE);
					    if(fres == NOERR) SampleLoaded();
						break;
				case 0x216: fres = STModLoader(kappaleennimi);
						break;
				case 0x217: fres = DoSave(); break;
				case 0x218: fres = SaveRawSample(kappaleennimi);
						break;
			}
			ClrFileName();
			StopLoad();
			diskerr(fres);
			break;
		case 0x219: fres = DelFile();
			    diskerr(fres);
		case 0x209: break;
		default:
			FReqHandler(gid);	
	}
}

static void __regargs Handle3(UWORD gid) /* soitto */
{
	UWORD edpstate = pstate;
	switch(gid) {
		case 0x300:  /* Soita kappale */
			pline = psn2 = pseqnum = 0;
			actplayline = -1;
		case 0x303:  /* Jatka kappaletta */
			pstate = SOITAKAPPALE;
			pblock = song.playseq[psn2];
			Korosta(&gadget3[0],TRUE);
			Korosta(&gadget3[1],FALSE);
			if(edpstate == ALASOITA) {
				actplayline = pline - 1;
				ciaa.ciacra |= CIACRAF_START;
			}
			break;
		case 0x301:  /* Soita lohkoa */
			pline = 0;
			actplayline = -1;
		case 0x304:  /* Jatka lohkoa */
			pstate = SOITALOHKO;
			Korosta(&gadget3[0],FALSE);
			Korosta(&gadget3[1],TRUE);
			if(edpstate == ALASOITA) {
				actplayline = pline - 1;
				ciaa.ciacra |= CIACRAF_START;
			}
			break;
		case 0x302:  /* Soitto seis!! */
			pstate = ALASOITA;
			Korosta(&gadget3[0],FALSE);
			Korosta(&gadget3[1],FALSE);
			SammutaAanet(999);
			SetPointer(window,&mouse1[0],23,16,-1,0);
			if(qual & SHIFT) {
				SetCmd(pb2,pl2,currtrk,0xFFE);
				PaivitaNaytto(TRUE);
			}
			break;
		case 0x305:  /* Suodatin */
			if(qual & SHIFT) {
				SetCmd(pb2,pl2,currtrk,(UWORD)(song.flags
					& FLAG_FILTERON ? 0xFF9 : 0xFF8));
				PaivitaNaytto(TRUE);
			} else {
				song.flags ^= FLAG_FILTERON;
				AsetaSuodatin();
			}
			break;
		case 0x306:
			Toggle(&gadget3[6]);
			if(updscrflag) {
				if(gadget3[6].GadgetID & 0x1000) {
					if(screen->Height >= 256) eq1strt0 =
					  (LONG)(screen->BitMap.Planes[0]+8484);
					else if(pw = OpenWindow(&pnw)) {
					  DrawImage(pw->RPort,&eq1image,0,0);
					  eq1strt0=(LONG)(screen->BitMap.Planes[0]+1124);
					  waitsomething = 1; }
				} else if(screen->Height >= 256) eq1strt0 = 0L;
			}
			break;
		case 0x307:
			song.flags |= FLAG_STSLIDE;
			DispVolAndSldType();
			break;
		case 0x308:
			song.flags &= ~FLAG_STSLIDE;
			DispVolAndSldType();
			break;
		case 0x309: ChgTempo((UWORD)((propinfo[1].HorizPot + 137) /
				274 + 1)); break;
		case 0x30A: if(tempo > 1) ChgTempo((UWORD)(tempo - 1)); break;
		case 0x30B: if(tempo < 240) ChgTempo((UWORD)(tempo + 1)); break;
		case 0x30C: if(psn2) pseqnum = psn2 - 1; break;
		case 0x30D: if(psn2 < song.songlen) pseqnum = psn2 + 1; break;
		case 0x30E: pseqnum = 0; break;
		case 0x30F: pseqnum = song.songlen - 1; break;
		case 0x310: if(psn2 == song.songlen) { /* + */
				if(song.songlen < 100)
				  song.playseq[(++song.songlen) - 1] = 0;
				else DisplayBeep(screen);
			}
			else if(song.playseq[psn2] < blocks - 1)
				song.playseq[psn2]++;
			break;
		case 0x311: if(psn2 == song.songlen) {	/* - */
				if(song.songlen > 1) {
					song.songlen--;
					pseqnum = psn2 - 1;
				}
			}
			else if(song.playseq[psn2] > 0)
				song.playseq[psn2]--;
			break;
		case 0x312: InsertSeq(0); break;
		case 0x313: DelSeq(); break;
		case 0x314: InsertSeq((UBYTE)pb2); break;
		case 0x315: Toggle(&gadget3[21]);
			    if(updscrflag) {
				if(gadget3[21].GadgetID & 0x1000)
					InitEqualizer();
				else { RemEqualizer(); RemCopperList(); }
			    }
			    break;
		case 0x316: Toggle(&gadget3[22]);
			    if(updscrflag) InitDisp();
			    break;
		case 0x317: song.flags |= FLAG_VOLHEX;
			    DispVolAndSldType();
			    break;
		case 0x318: song.flags &= ~FLAG_VOLHEX;
			    DispVolAndSldType();
			    break;
	}
	if(gid >= 0x30C && gid <= 0x311) {
		TulostaLohkoJaSoitin();
		TulostaSoittoLohkot();
	}
}

static void __regargs Handle5(UWORD gid) /* lohko 1 */
{
	BOOL doit = 0;
	switch(gid) {
		case 0x50F:
			SetMark();
			break;
		case 0x510: case 0x511: case 0x512:
			HandleMark((UBYTE)(gid - 0x510 + 0x32));
			break;
		case 0x508:  /* Uusi */
			if(blocks < 100 && !AllocBlock((UWORD)blocks,4,64)) blocks++;
			TulostaLohkoJaSoitin();
			break;
		case 0x50A:  /* Tuhoa viim. */
			if(blocks > 1) {
				Disable();
				if(pblock < blocks - 1) { blocks--; doit = 1; }
				Enable();
				if(doit) FreeBlock((UWORD)blocks);
			}
			TulostaLohkoJaSoitin();
			break;
		case 0x509:  /* Uusi tähän */
			NewBlockHere(pb2,4,64);
			break;
		case 0x50B:  /* Tuhoa tämä */
			DelBlockHere(pb2);
			break;
		case 0x500: case 0x501: case 0x502: case 0x503:
			CutCopyPaste((UBYTE)pb2,0,(UWORD)((UWORD)(lohko[pb2]->lines) + 1),
				(UBYTE)currtrk,1,(UBYTE)(gid-0x500));
			PaivitaNaytto(TRUE);	break;
		case 0x504: case 0x505: case 0x506: case 0x507:
			CutCopyPaste((UBYTE)pb2,0,(UWORD)((UWORD)(lohko[pb2]->lines) + 1),
				0,lohko[pb2]->numtracks,(UBYTE)(gid-0x504));
			PaivitaNaytto(TRUE);	break;
		case 0x513: case 0x514: case 0x515: case 0x516:
			if(ChangeBlockSize(pb2,(UWORD)(gid - 0x512),
				(UWORD)((UWORD)(lohko[pb2]->lines) + 1)))
				Ilmoita(nomem);
			TulostaLohkoJaSoitin();
			break;
		case 0x50C: FreeBuffer(); break;
		case 0x50D: SplitBlock(pb2,pl2); break;
		case 0x50E: JoinBlocks(pb2); break;
	}
	if(gid >= 0x517 && gid <= 0x51D) HighLightLines(pb2,(UWORD)(gid - 0x517));
	else if(gid >= 0x51E && gid <= 0x522) HandleLines(pb2,gid);
}

static void __regargs Handle4(UWORD gid) /* soitin */
{
	char *lres;
	switch(gid) {
		case 0x401:
			samplenum = 0;
			PaivitaSoittimennimi();
			break;
		case 0x402:
			samplenum = 62;
			PaivitaSoittimennimi();
			break;
		case 0x403:
			EdSoitin();
			break;
		case 0x404:
			SeurSoitin();
			break;
		case 0x405:	case 0x400:
			StartLoad();
			lastrep = lastreplen = 0;
			lastmidic = lastmidip = 0;
			lres = LoadInstrument(song.sample[samplenum].sname,
				TRUE);
			PaivitaSoittimennimi();
			StopLoad();
			if(lres == NOERR) SampleLoaded();
			diskerr(lres);
			break;
		case 0x406:  /* hyppääkö ukko?????????? */
			if(samplenum < 32) {
				song.jumpmask ^= 1 << samplenum;
				if(song.jumpmask & (1 << samplenum))
					Korosta(&gadget4[6],TRUE);
				else	Korosta(&gadget4[6],FALSE);
			}
			break;
		case 0x407:	RemoveInstrument();	break;
		case 0x408:	GetRepeat();		break;
		case 0x409:	GetRepLen();		break;
		case 0x40A:
			if(song.sample[samplenum].svol)
				song.sample[samplenum].svol--;
			DispVolGadget();
			break;
		case 0x40C:
			if(song.sample[samplenum].svol < 64)
			  song.sample[samplenum].svol++;
			DispVolGadget();
			break;
		case 0x40B:
			song.sample[samplenum].svol =
				(propinfo[2].HorizPot + 512) / 1024;
			DispVolGadget();
			break;
		case 0x40D:
			if(song.sample[samplenum].strans > -24)
				song.sample[samplenum].strans--;
			PaivitaSoittimennimi(); break;
		case 0x40E:
			if(strinfo[8].LongInt >= -24 && strinfo[8].LongInt <= 24)
				song.sample[samplenum].strans = (BYTE)(strinfo[8].LongInt);
			PaivitaSoittimennimi(); break;
		case 0x40F:
			if(song.sample[samplenum].strans < 24)
				song.sample[samplenum].strans++;
			PaivitaSoittimennimi();
	}
}

static void __regargs Handle6(UWORD gid) /* eli editointi */
{
	if(gid >= 0x612 && gid <= 0x615) {
		Korosta(&gadget6[nappokt + 18],FALSE);
		nappokt = gid - 0x612;
		Korosta(&gadget6[nappokt + 18],TRUE);
	} else if(gid >= 0x602 && gid <= 0x611) {
		Korosta(&gadget6[gid - 0x600],(BOOL)(trackon[gid -
			0x602] = !trackon[gid - 0x602]));
		if(!trackon[gid - 0x602]) SammutaAanet((UWORD)(gid - 0x602));
	} else if(gid == 0x600) Toggle(&gadget6[0]);
	else if(gid == 0x601) Toggle(&gadget6[1]);
	else if(gid == 0x619) Toggle(&gadget6[25]);
	else if(gid == 0x616) DoSlide(0);
	else if(gid == 0x61E) DoSlide(1);
	else EditHandler(gid);	/* jump to local handler routine */
	DispInfoGadgets();
}

static void __regargs Handle9(UWORD gid)
{
	switch(gid) {
		case 0x900: /* activate/deactivate MIDI */
			if(gadget9[0].GadgetID & 0x1000) {
				Korosta(&gadget9[0],FALSE);
				Korosta(&gadget9[22],FALSE);
				FreeSerial();
				midiactive = 0;
			} else if(!GetSerial()) {
				Korosta(&gadget9[0],TRUE);
				midiactive = 1;
			} else Ilmoita("Can't allocate serial port.");
			break;
		case 0x913:
			if(song.sample[samplenum].midipreset)
				song.sample[samplenum].midipreset--;
			DispPresetGadget();
			break;
		case 0x914:
			song.sample[samplenum].midipreset =
				(propinfo[3].HorizPot + 254) / 510;
			DispPresetGadget();
			break;
		case 0x915:
			if(song.sample[samplenum].midipreset < 128)
				song.sample[samplenum].midipreset++;
			DispPresetGadget();
			break;
		case 0x912:
			if(strinfo[5].LongInt < 0 || strinfo[5].LongInt
				> 128) {
					DisplayBeep(screen);
			} else	song.sample[samplenum].midipreset =
					(UBYTE)(strinfo[5].LongInt);
			DispPresetGadget();
			break;
		case 0x916:
			if(midiactive)	{
				Toggle(&gadget9[22]);
				if(gadget9[22].GadgetID & 0x1000)
					custom.intena = 0x8800; /*RBF on*/
				else	custom.intena = 0x0800; /*RBF off*/
			}
			break;
		case 0x917:
			Toggle(&gadget9[23]);
			break;
		default:
			if(gid >= 0x901 && gid <= 0x911) {
				song.sample[samplenum].midich =	gid-0x901;
				PaivitaSoittimennimi();
			}
	}
}	

static BOOL __regargs Handle7(UWORD gid)
{
	switch(gid) {
		case 0x70D: case 0x70E: case 0x70F:
			if(gid == 0x70D) song.flags &= ~FLAG_JUMPINGON;
			else if(gid == 0x70E) song.flags |=
				(FLAG_JUMPINGON|FLAG_JUMP8TH);
			else {	song.flags |= FLAG_JUMPINGON;
				song.flags &= ~FLAG_JUMP8TH;
			}
			UpdateJumpGadgets();
			break;
		case 0x711: case 0x712: case 0x713:
			if(gadget7[gid - 0x701].GadgetID & 0x1000)
				Korosta(&gadget7[gid - 0x701],FALSE);
			else {
				Korosta(&gadget7[16],(BOOL)(gid == 0x711));
				Korosta(&gadget7[17],(BOOL)(gid == 0x712));
				Korosta(&gadget7[18],(BOOL)(gid == 0x713));
			}
			break;
		case 0x714:
			Handle3(0x302);
			if(gadget7[16].GadgetID & 0x1000) {
				Korosta(&gadget7[16],FALSE);
				AlustaKappale(TRUE); PaivitaNaytto(TRUE);
			} else if(gadget7[17].GadgetID & 0x1000) {
				Korosta(&gadget7[17],FALSE);
				AlustaKappale(FALSE); PaivitaNaytto(FALSE);
			} else if(gadget7[18].GadgetID & 0x1000) {
				Korosta(&gadget7[18],FALSE);
				return(1); /* QUIT !!!!!! */
			}
			break;
		case 0x715: case 0x716:
			Toggle(&gadget7[gid - 0x715 + 20]);
			break;
		default:
			if(gid >= 0x700 && gid <=0x70C) ColorHandler(gid);
	}
	return(0);
}

static void __regargs HandleA(UWORD gid)
{
	static BYTE trtb[4] = { 12,1,-1,-12 };
	switch(gid) {
		case 0xA0C: PlayTransp((BYTE)(song.playtransp - 1)); break;
		case 0xA0D: PlayTransp((BYTE)((propinfo[4].HorizPot + 1311) / 2622 - 13)); break;
		case 0xA0E: PlayTransp((BYTE)(song.playtransp + 1)); break;
		case 0xA11: case 0xA12:
			Korosta(&gadgetA[17],(BOOL)(gid == 0xA11));
			Korosta(&gadgetA[18],(BOOL)(gid == 0xA12));
			break;
		case 0xA0F: ExpandBlock(pb2); break;
		case 0xA10: ShrinkBlock(pb2); break;
		default:
			if(gid >= 0xA00 && gid <= 0xA0B)
				Transpose(trtb[gid & 0x0003],(UBYTE)((gid -
					0xA00) / 4));
			break;
	}
}

void MIDIon() /* called by Load200Song if there are any MIDI instruments */
{
	if(!midiactive) Handle9(0x900);
}
