/* MED-newmsgh.c --- viestien käsittely (V2.00:sta alkaen) */
/* Uuden msghandlerin kirjoittamisen urakka aloitettu 12.10.1989 */
#include <hardware/custom.h>
#include "med.h"
#define	SHIFT	(IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT)
#define ALT	(ALTLEFT|ALTRIGHT)
extern struct CIA far ciaa;
extern struct Custom far custom;
extern struct Image pylvasimage;
extern struct RastPort *wrp;
extern struct Kappale far tamakappale;
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[];
extern BOOL naytonpaivitys,aanipaalla[];
extern LONG pylvasalku0;
extern void __asm PaivitaNaytto(register __d0 BOOL);
extern void __asm Korosta(register __a0 struct Gadget *,register __d0 BOOL);
extern char kappaleennimi[];
extern UBYTE firstdisptrk,thiscol;
UWORD nykyinenosio;
UBYTE far klevx[] = { 0,0,0,0,24,0,0,0,8,8,8,8,0,24,0,0,0,8,8,8,8,0,24,0,0,0,
		      8,8,8,8,0,24,0,0,0,8,8,8,8,0 };
UBYTE far midiactive = 0;
UWORD lohkoja,soittimennum = 1,kursorix = 4,currtrk = 0,currpos = 0;
BOOL ilmoitusnakyy = FALSE;
UWORD volatile tempo = 60,soittorivi,soittolohko,soittolohkonnum,soittotila;
struct Lohko far *lohko[100];
BOOL KasitteleGadget();
static BOOL KasitteleOsio7();
void OsionValinta(),KasitteleNappain();
static void KasitteleOsio2(),KasitteleOsio3(),KasitteleOsio4();
static void KasitteleOsio5(),KasitteleOsio6(),HandlePlainKey();
static void KasitteleOsio9(),KasitteleOsioA();
static UBYTE f5_10line[5] = { 0,16,32,48,63 },waitsomething;
static char *abouttxt[] = {	"MED2.00 by Teijo Kinnunen, 1990",
	"Address: Oksantie 19...","SF-86300  OULAINEN, FINLAND",
	"IFF 8SVX loader by S. Hayes","Then some greetings:",
	"Greetings to Topi & Osku","and of course, to Erkki Hannila",
	"MED is in Public Domain","Copy me!!!",
	"The End." };
BOOL __asm KasitteleViesti(register __d0 ULONG luokka,
			register __d1 UWORD koodi,register __d2 UWORD qual,
			register __a0 APTR osoite)
{
	if(waitsomething) {
		if(waitsomething == 1 && pw) {
			if(luokka == MOUSEBUTTONS && koodi == SELECTUP) return(0);
			pylvasalku0 = 0L; CloseWindow(pw); pw = NULL;
			Korosta(&gadget3[6],(BOOL)pylvasalku0); }
		waitsomething = 0;
	}
	if(ilmoitusnakyy && (!(luokka == MOUSEBUTTONS && koodi ==
		SELECTUP) && (luokka != RAWKEY || (luokka == RAWKEY &&
		!(koodi & 0x80)))))	Ilmoita(NULL);
	switch(luokka) {
		case RAWKEY:
			KasitteleNappain(koodi,qual);
			break;
		case GADGETDOWN:
		case GADGETUP:
			return(KasitteleGadget(osoite));
		case MOUSEBUTTONS:
			if(koodi == MENUDOWN) {
				ShowTitle(screen,naytonpaivitys);
				if(!(naytonpaivitys = !naytonpaivitys)) {
					RemEqualizer();
					RemCopperList();
				} else if(gadget3[21].GadgetID & 0x1000)
					InitEqualizer();
			}
	}
	return(0);	/* ei lopu */
}

BOOL KasitteleGadget(APTR addr)
{
	UWORD gid = (((struct Gadget *)addr)->GadgetID) & 0xfff;
	switch(gid & 0xf00) {
		case 0x100:	OsionValinta((struct Gadget *)addr); break;
		case 0x200:	KasitteleOsio2(gid);	break;
		case 0x300:	KasitteleOsio3(gid);	break;
		case 0x400:	KasitteleOsio4(gid);	break;
		case 0x500:	KasitteleOsio5(gid);	break;
		case 0x600:	KasitteleOsio6(gid);	break;
		case 0x700:	return(KasitteleOsio7(gid));	break;
		case 0x900:	KasitteleOsio9(gid);	break;
		case 0xA00:	KasitteleOsioA(gid);	break;
		case 0xF00:
			if(gid == 0xF00) KasitteleOsio6(0x600);
			else if(gid == 0xF01) KasitteleOsio6(0x601);
			else if(gid == 0xF02) {
				if(nappokt < 3) KasitteleOsio6(nappokt + 0x613);
				else KasitteleOsio6(0x612);
			}
	}
	return(0);
}

void KasitteleNappain(UWORD koodi,UWORD qual)
{
	if(qual & IEQUALIFIER_CONTROL) {
		switch(koodi) {
			case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55:
				OsionValinta(&gadget1[koodi - 0x50]);
				return;
			case 0x57: OsionValinta(&gadget1[6]); return;
			case 0x58: OsionValinta(&gadget1[7]); return;
			case 0x05: case 0x06:
				if(qual & SHIFT) EditHandler(koodi+0x100);
				else KasitteleOsio3(0x302 + koodi);
				break;
			case CURSORLEFT:
				if(firstdisptrk)	firstdisptrk -= 4;
				else	firstdisptrk = lohko[soittolohko]->numtracks - 4;
				currtrk = firstdisptrk + currpos;
				PaivitaNaytto(TRUE);	DispInfoGadgets();
				break;
			case CURSORRIGHT:
				firstdisptrk += 4;
				if(firstdisptrk >= lohko[soittolohko]->numtracks)
					firstdisptrk = 0;
				currtrk = firstdisptrk + currpos;
				PaivitaNaytto(TRUE);	DispInfoGadgets();
				break;
			case 0x3E: KasitteleOsio3(0x30C); break;
			case 0x1E: KasitteleOsio3(0x30D); break;
			case 0x3D: KasitteleOsio3(0x30E); break;
			case 0x1D: KasitteleOsio3(0x30F); break;
			case 0x2D: KasitteleOsio3(0x311); break;
			case 0x2F: KasitteleOsio3(0x310); break;
			case 0x0F: KasitteleOsio3(0x312); break;
			case 0x3C: KasitteleOsio3(0x313); break;
			case 0x2E: KasitteleOsio3(0x314); break;
			case 0x20: KasitteleOsio6(0x619); break;
			case 0x13: RetFileName(); break;
			case 0x37: SetMark(); break;
			case 0x32: case 0x33: case 0x34:
				HandleMark(koodi); break;
			default: if((qual & SHIFT) && koodi >= 0x01 &&
				   koodi <= 0x0A) EditHandler(koodi+0x100);
				 else HandlePlainKey(koodi,qual);
		}
	}
	else if(qual & AMIGAKEYS) {
		if(koodi == 0x28) KasitteleOsio2(0x214);
		else if(koodi == 0x17) {
			OsionValinta(&gadget1[2]);
			if(qual & SHIFT) {
				tamakappale.soitin[soittimennum][0] = 0;
				RefreshGList(&gadget4[0],window,NULL,1);
			}
			ActivateGadget(&gadget4[0],window,NULL);
		}
		else if(koodi == 0x23) KasitteleOsio3(0x305);
		else if(koodi == 0x26) KasitteleOsio4(0x406);
		else if(koodi == 0x33) KasitteleOsio5(qual&SHIFT?0x50D:0x50A);
		else if(koodi == 0x32) KasitteleOsio5(qual&SHIFT?0x50E:0x50B);
		else if(koodi == 0x34) KasitteleOsio5(qual&SHIFT?0x50F:0x50C);
		else if(koodi == 0x19) KasitteleOsio3(0x300);
		else if(koodi == 0x13 && nykyinenosio == 4)
			ActivateGadget(&gadget4[8],window,NULL);
		else HandlePlainKey(koodi,qual);
	}
	else if((qual & SHIFT) && (qual & ALT)) {
		if(koodi >= 0x50 && koodi <= 0x59) Ilmoita(abouttxt[koodi-0x50]);
		else if(koodi == 0x40) KasitteleOsio3(0x300);
		else HandlePlainKey(koodi,qual);
	}
	else if(qual & SHIFT) {
		switch(koodi) {
			case 0x40: KasitteleOsio3(0x303); break;
			case 0x1D: case 0x1E: case 0x1F:
				KasitteleOsio6(0x5ED+koodi);	break;
			case 0x2D: case 0x2E: case 0x2F:
				KasitteleOsio6(0x5E0+koodi);	break;
			case 0x3D: case 0x3E: case 0x3F:
				KasitteleOsio6(0x5D3+koodi);	break;
			default:
				if((koodi >= 0x01 && koodi <= 0x0A) ||
					koodi == 0x46)
					EditHandler(koodi);
				else HandlePlainKey(koodi,qual);
		}
	}
	else if(qual & ALT) {
		if(koodi == 0x40) KasitteleOsio3(0x304);
		else HandlePlainKey(koodi,qual);
	}
	else if(koodi == 0x40) KasitteleOsio3(0x302); /* Stop playing */
	else HandlePlainKey(koodi,qual);
}

static void HandlePlainKey(UWORD koodi,UWORD qual)
{
	switch(koodi) {
		case CURSORUP:
			if(qual & SHIFT) KasitteleOsio5(0x509);
			else if(qual & ALT) KasitteleOsio5(0x506);
			else {
				if((gadget6[1].GadgetID & 0x1000) &&
					!(soittorivi & 0x01) && soittorivi-- == 0)
						soittorivi = 63;
				if(soittorivi-- == 0) { soittorivi = 63; PaivitaNaytto(FALSE); }
				else PaivitaNaytto(FALSE);
			}
			break;
		case CURSORDOWN:
			if(qual & SHIFT) KasitteleOsio5(0x508);
			else if(qual & ALT) KasitteleOsio5(0x507);
			else {
				if((gadget6[1].GadgetID & 0x1000) &&
					!(soittorivi & 0x01)) soittorivi++;
				if(++soittorivi > 63) { soittorivi -= 64; PaivitaNaytto(FALSE); }
				else PaivitaNaytto(FALSE);
			}
			break;
		case CURSORLEFT:
			if(qual & SHIFT) {
				if(qual & ALT) {
					soittimennum = (soittimennum > 16 ?
						16 : 1);
					PaivitaSoittimennimi();
				} else EdSoitin();
			} else {
				NaytaKursori();
				if(qual & ALT) {
					if(kursorix == currpos * 9 + 4)
						if(!currpos--) currpos = 3;
					kursorix = currpos * 9 + 4;
				}
				else if(kursorix == 4) kursorix = 38;
				else {
					kursorix--;
					if(!klevx[kursorix])
						while(!klevx[--kursorix]);
				}
				currpos = (kursorix<12?0:(kursorix<21?1:(kursorix<30?2:3)));
				currtrk = firstdisptrk + currpos;
				NaytaKursori();
			}
			break;
		case CURSORRIGHT:
			if(qual & SHIFT) {
				if(qual & ALT) {
					soittimennum = (soittimennum < 15 ?
						15 : 31);
					PaivitaSoittimennimi();
				} else SeurSoitin();
			} else {
				NaytaKursori();
				if(qual & ALT) {
					if(++currpos > 3) currpos = 0;
					kursorix = currpos * 9 + 4;
				}
				else if(kursorix == 38) kursorix = 4;
				else {
					kursorix++;
					if(!klevx[kursorix])
						while(!klevx[++kursorix]);
				}
				currpos = (kursorix<12?0:(kursorix<21?1:(kursorix<30?2:3)));
				currtrk = firstdisptrk + currpos;
				NaytaKursori();
			}
			break;
		case 0x50: case 0x51: case 0x52: case 0x53: case 0x54:
			KasitteleOsio6(0x5C2+koodi);	break;
		case 0x55: case 0x56: case 0x57: case 0x58: case 0x59:
			soittorivi = (UWORD)(f5_10line[koodi - 0x55]);
			PaivitaNaytto(FALSE);		break;
		case 0x45: /* Esc */ KasitteleOsio6(0x600);	break;
		case 0x1D: case 0x1E: case 0x1F:
			KasitteleOsio6(0x5E5+koodi);	break;
		case 0x2D: case 0x2E: case 0x2F:
			KasitteleOsio6(0x5D8+koodi);	break;
		case 0x3D: case 0x3E: case 0x3F:
			KasitteleOsio6(0x5CB+koodi);	break;
		case 0x5F: Ilmoita("Try Shift+Alt+F1-10!!!"); break;
		case 0:	KasitteleOsio6(0x601); break; /* 2×space */
		default:
			SoitaNappain(koodi,TRUE,qual);
	}
}

void OsionValinta(struct Gadget *gd)
{
	UWORD edno = nykyinenosio;
	struct Gadget *scangptr;
	if((gd->GadgetID & 0xff) == nykyinenosio) return; /* ei nykyistä */
	RemoveGList(window,gadget1[10].NextGadget,-1);
	nykyinenosio = 1;	/* Korosta() tarkistaa nykyisen osion */
	if(edno) Korosta(&gadget1[edno >= 0x09 ? edno-3 : edno - 2],FALSE);
	edno = gd->GadgetID & 0xff;
	Korosta(&gadget1[edno >= 0x09 ? edno-3 : 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);
	switch(nykyinenosio) { /* osiokohtainen näytönpäivitys */
		case 0x2:
			UpdateFReqDsp();	break;
		case 0x4: case 0x5: case 0x9:	/* soitin, lohko, midi */
			PaivitaSoittimennimi();	break;
		case 0x3:  /* soitto */
			TulostaSoittoLohkot(); ShowTempo();	break;
		case 0x6: DispFNnum(); 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(-1);
			GetUndoColors();	break;
		case 0xA:	PlayTransp(tamakappale.playtransp);
	}
}

static void KasitteleOsio2(UWORD gid) /* tiedostot */
{
	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);
			if(gadget2[25].GadgetID & 0x1000) {
				gadget2[25].GadgetID &= ~0x1000;
				Korosta(&gadget2[25],TRUE);
			}
			break;
		case 0x214: case 0x215: case 0x216: case 0x217: case 0x218:
		case 0x219: case 0x21A: case 0x21B:
			KasitteleOsio3(0x302); /* Stop playing!!! */
			SetPointer(window,&mouse0[0],23,16,-1,0);
			switch(gid) {
				case 0x214: LoadSong(kappaleennimi);
						break;
				case 0x215: LoadInstrument(kappaleennimi,FALSE);
						break;
				case 0x216: STModLoader(kappaleennimi);
						break;
				case 0x217: SaveSong(kappaleennimi,FALSE);
						break;
				case 0x218: SaveRawSample(kappaleennimi);
						break;
				case 0x219: STSongSaver(kappaleennimi);
						break;
				case 0x21A: SaveSong(kappaleennimi,TRUE);
						break;
				case 0x21B: WriteObj(kappaleennimi);
						break;
			}
			SetPointer(window,&mouse1[0],23,16,-1,0);
			if(gid != 0x218) ClrFileName();
			break;
		case 0x209:
			break;
		case 0x21C:
			Korosta(&gadget2[25],(BOOL)(gadget2[25].GadgetID &
				0x1000 ? FALSE : TRUE));
			break;
		default:
			FReqHandler(gid);	
	}
}

static void KasitteleOsio3(UWORD gid) /* soitto */
{
	UWORD edsoittotila = soittotila;
	switch(gid) {
		case 0x300:  /* Soita kappale */
			soittorivi = soittolohkonnum = 0;
		case 0x303:  /* Jatka kappaletta */
			soittotila = SOITAKAPPALE;
			soittolohko = tamakappale.soittojarjestys[soittolohkonnum];
			Korosta(&gadget3[0],TRUE);
			Korosta(&gadget3[1],FALSE);
			if(edsoittotila == ALASOITA) ciaa.ciacra |= CIACRAF_START;
			break;
		case 0x301:  /* Soita lohkoa */
			soittorivi = 0;
		case 0x304:  /* Jatka lohkoa */
			soittotila = SOITALOHKO;
			Korosta(&gadget3[0],FALSE);
			Korosta(&gadget3[1],TRUE);
			if(edsoittotila == ALASOITA) ciaa.ciacra |= CIACRAF_START;
			break;
		case 0x302:  /* Soitto seis!! */
			soittotila = ALASOITA;
			Korosta(&gadget3[0],FALSE);
			Korosta(&gadget3[1],FALSE);
			SammutaAanet(999);
			SetPointer(window,&mouse1[0],23,16,-1,0);
			break;
		case 0x305:  /* Suodatin */
			tamakappale.liput ^= LIPPU_SUODATINPAALLA;
			AsetaSuodatin();
			break;
		case 0x306:
			if(!pylvasalku0) {
				if(screen->Height >= 256) pylvasalku0 =
				  (LONG)(screen->BitMap.Planes[0]+8484);
				else if(pw = OpenWindow(&pnw)) {
				  DrawImage(pw->RPort,&pylvasimage,0,0);
				  pylvasalku0=(LONG)(screen->BitMap.Planes[0]+1124);
				  waitsomething = 1; }
			}
			else if(screen->Height >= 256) pylvasalku0 = 0L;
			Korosta(&gadget3[6],(BOOL)pylvasalku0);
			break;
		case 0x307: case 0x308:  /* Liu'utus: 5 / 6 */
			tamakappale.vaihtoja = gid - 0x302;
			Korosta(&gadget3[7],(BOOL)(tamakappale.vaihtoja ==
				6 ? FALSE : TRUE));
			Korosta(&gadget3[8],(BOOL)(tamakappale.vaihtoja ==
				6 ? TRUE : FALSE));
			break;
		case 0x309: ChgTempo((propinfo[1].HorizPot + 137) / 274 + 1);
			    break;
		case 0x30A: if(tempo > 1) ChgTempo(tempo - 1); break;
		case 0x30B: if(tempo < 240) ChgTempo(tempo + 1); break;
		case 0x30C: if(soittolohkonnum) soittolohkonnum--; break;
		case 0x30D: if(soittolohkonnum <
		  tamakappale.kappaleen_pituus) soittolohkonnum++; break;
		case 0x30E: soittolohkonnum = 0; break;
		case 0x30F: soittolohkonnum =
			tamakappale.kappaleen_pituus - 1; break;
		case 0x310: if(soittolohkonnum ==	/* + */
			tamakappale.kappaleen_pituus) {
				if(tamakappale.kappaleen_pituus < 100) {
				  tamakappale.soittojarjestys[
				  (++tamakappale.kappaleen_pituus)-1] =0;
				}
				else DisplayBeep(screen);
			}
			else if(tamakappale.soittojarjestys[
				soittolohkonnum] < lohkoja-1)
			  tamakappale.soittojarjestys[soittolohkonnum]++;
			break;
		case 0x311: if(soittolohkonnum ==	/* - */
			tamakappale.kappaleen_pituus) {
				if(tamakappale.kappaleen_pituus > 1) {
					tamakappale.kappaleen_pituus--;
					soittolohkonnum--;
				}
			}
			else if(tamakappale.soittojarjestys[soittolohkonnum] > 0)
			  tamakappale.soittojarjestys[soittolohkonnum]--;
			break;
		case 0x312: InsertSeq(0); break;
		case 0x313: DelSeq(); break;
		case 0x314: InsertSeq(soittolohko); break;
		case 0x315: Korosta(&gadget3[21],(BOOL)(!(gadget3[21].
				GadgetID & 0x1000)));
			    if(naytonpaivitys) {
				if(gadget3[21].GadgetID & 0x1000)
					InitEqualizer();
				else { RemEqualizer(); RemCopperList(); }
			    }
			    break;
	}
	if(gid >= 0x30C && gid <= 0x311) {
		TulostaLohkoJaSoitin();
		TulostaSoittoLohkot();
	}
}

static void KasitteleOsio5(UWORD gid) /* lohko 1 */
{
	UWORD chgblock;
	switch(gid) {
		case 0x508:  /* seur.lohko */
			if(soittolohko < lohkoja-1) soittolohko++;
			break;
		case 0x506:  /* ens. */
			soittolohko = 1; /* ovelasti tehty, eikö vain */
		case 0x509:  /* ed.lohko */
			if(soittolohko) soittolohko--;
			break;
		case 0x507:  /* viim. */
			soittolohko = lohkoja - 1;
			break;
		case 0x504:  /* Uusi */
			if(lohkoja < 100 && !AllocBlock(lohkoja,4)) lohkoja++;
			TulostaLohkoJaSoitin();
			break;
		case 0x505:  /* Tuhoa viim. */
			if(lohkoja > 1 && soittolohko < lohkoja - 1)
				FreeBlock(--lohkoja);
			TulostaLohkoJaSoitin();
			break;
		case 0x500:  /* Uusi tähän */
			NewBlockHere(soittolohko,4);
			break;
		case 0x501:  /* Tuhoa tämä */
			DelBlockHere(soittolohko);
			break;
		case 0x50A: case 0x50B: case 0x50C: case 0x50D:
			CutCopyPaste(soittolohko,0,64,currtrk,1,gid-0x50A);
			PaivitaNaytto(TRUE);
			break;
		case 0x50E: case 0x50F: case 0x510: case 0x511:
			CutCopyPaste(soittolohko,0,64,0,lohko[soittolohko]->
				numtracks,gid - 0x50E);
			PaivitaNaytto(TRUE);
			break;
		case 0x512: case 0x513: case 0x514: case 0x515:
			chgblock = soittolohko;
			if(ChangeBlockSize(chgblock,gid - 0x511))
				Ilmoita("Probably out of memory!!");
			TulostaLohkoJaSoitin();
			break;
	}
	if(gid >= 0x506 && gid <= 0x509) { /* vaihdettiin lohkoa */
		soittorivi = 0;
		PaivitaNaytto(FALSE);
	}
}

static void KasitteleOsio4(UWORD gid) /* soitin */
{
	switch(gid) {
		case 0x401:
			soittimennum = 1;
			PaivitaSoittimennimi();
			break;
		case 0x402:
			soittimennum = 31;
			PaivitaSoittimennimi();
			break;
		case 0x403:
			EdSoitin();
			break;
		case 0x404:
			SeurSoitin();
			break;
		case 0x405:	case 0x400:
			SetPointer(window,&mouse0[0],23,16,-1,0);
			tamakappale.stoisto[soittimennum] =
				tamakappale.stoistonpit[soittimennum] = 0;
			if(!LoadInstrument(tamakappale.soitin[soittimennum],
				TRUE)) Ilmoita("Sample is now loaded.");
			PaivitaSoittimennimi();
			SetPointer(window,&mouse1[0],23,16,-1,0);
			break;
		case 0x406:  /* hyppääkö ukko?????????? */
			tamakappale.hyppysoitin ^= 1<<soittimennum;
			if(tamakappale.hyppysoitin & (1<<soittimennum))
				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(tamakappale.soittimenvoimakkuus[soittimennum])
			  tamakappale.soittimenvoimakkuus[soittimennum]--;
			DispVolGadget();
			break;
		case 0x40C:
			if(tamakappale.soittimenvoimakkuus[soittimennum] < 64)
			  tamakappale.soittimenvoimakkuus[soittimennum]++;
			DispVolGadget();
			break;
		case 0x40B:
			tamakappale.soittimenvoimakkuus[soittimennum] =
				(propinfo[2].HorizPot + 512) / 1024;
			DispVolGadget();
			break;
	}
}

static void KasitteleOsio6(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)(aanipaalla[gid -
			0x602] = !aanipaalla[gid - 0x602]));
		if(!aanipaalla[gid - 0x602])	SammutaAanet(gid - 0x602);
	} else if(gid == 0x600)
		Korosta(&gadget6[0],(BOOL)(!(gadget6[0].GadgetID & 0x1000)));
	else if(gid == 0x601) Korosta(&gadget6[1],(BOOL)(!(gadget6[1].GadgetID & 0x1000)));
	else if(gid == 0x619) Korosta(&gadget6[25],(BOOL)(!(gadget6[25].GadgetID & 0x1000)));
	else if(gid >= 0x617 && gid <= 0x61C) EditHandler(gid);
	DispInfoGadgets();	/* ^^ jump to local handler routine ^^ */
}

static void KasitteleOsio9(UWORD gid)
{
	switch(gid) {
		case 0x900:
			if(gadget9[0].GadgetID & 0x1000) {
				Korosta(&gadget9[0],FALSE);
				Korosta(&gadget9[23],FALSE);
				FreeSerial();
				midiactive = 0;
			} else if(!GetSerial()) {
				Korosta(&gadget9[0],TRUE);
				midiactive = 1;
			}
			break;
		case 0x901:
			if(!tamakappale.midikanava[soittimennum])
				tamakappale.midikanava[soittimennum] = 1;
			PaivitaSoittimennimi();
			break;
		case 0x902:
			tamakappale.midikanava[soittimennum] = 0;
			PaivitaSoittimennimi();
			break;
		case 0x914:
			if(tamakappale.midipreset[soittimennum])
				tamakappale.midipreset[soittimennum]--;
			DispPresetGadget();
			break;
		case 0x915:
			tamakappale.midipreset[soittimennum] =
				(propinfo[3].HorizPot + 254) / 508;
			DispPresetGadget();
			break;
		case 0x916:
			if(tamakappale.midipreset[soittimennum] < 128)
				tamakappale.midipreset[soittimennum]++;
			DispPresetGadget();
			break;
		case 0x913:
			if(strinfo[5].LongInt < 0 || strinfo[5].LongInt
				> 128) {
					DisplayBeep(screen);
			} else	tamakappale.midipreset[soittimennum] =
					(UBYTE)(strinfo[5].LongInt);
			DispPresetGadget();
			break;
		case 0x917:
			if(midiactive)	{ Korosta(&gadget9[23],
				(BOOL)(!(gadget9[23].GadgetID & 0x1000)));
				if(gadget9[23].GadgetID & 0x1000)
					custom.intena = 0x8800; /*RBF on*/
				else	custom.intena = 0x0800; /*RBF off*/
			}
			break;
		default:
			if(gid >= 0x903 && gid <= 0x912) {
				tamakappale.midikanava[soittimennum] =
					gid - 0x902;
				PaivitaSoittimennimi();
			}
	}
}	

static BOOL KasitteleOsio7(UWORD gid)
{
	switch(gid) {
		case 0x70D: case 0x70E: case 0x70F:
			if(gid == 0x70D) tamakappale.liput &= ~LIPPU_HYPPELYPAALLA;
			else if(gid == 0x70E) tamakappale.liput |=
				(LIPPU_HYPPELYPAALLA|LIPPU_HYPPELYTAHTIIN);
			else {	tamakappale.liput |= LIPPU_HYPPELYPAALLA;
				tamakappale.liput &= ~LIPPU_HYPPELYTAHTIIN;
			}
			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:
			KasitteleOsio3(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;
		default:
			if(gid >= 0x700 && gid <=0x70C) ColorHandler(gid);
	}
	return(0);
}

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

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