4 ** Copyright (C) 1994,95,96 Bernardo Innocenti
6 ** Instruments editor handling functions.
9 #include <exec/nodes.h>
10 #include <intuition/intuition.h>
11 #include <intuition/gadgetclass.h>
12 #include <libraries/gadtools.h>
13 #include <libraries/asl.h>
14 #include <workbench/workbench.h>
16 #include <proto/exec.h>
17 #include <proto/dos.h>
18 #include <proto/intuition.h>
19 #include <proto/gadtools.h>
20 #include <proto/xmodule.h>
22 #include "XModulePriv.h"
54 /*****************************/
55 /* Local function prototypes */
56 /*****************************/
58 static void InstrumentsDropIcon (struct AppMessage *msg);
59 static void InstrumentsPostOpen (void);
60 static void InstrumentsPostClose (void);
61 void UpdateInstrInfo (void);
62 void UpdateInstrList (void);
64 static void InstrNewClicked (void);
65 static void InstrOpenClicked (void);
66 static void InstrDelClicked (void);
67 static void InstrUpClicked (void);
68 // TODO static void InstrSwapClicked (void);
69 static void InstrDownClicked (void);
70 static void InstrNameClicked (struct WinUserData *wud);
71 static void InstrListClicked (void);
72 static void InstrVolumeClicked (void);
73 static void InstrFineTuneClicked (void);
74 static void InstrEditClicked (void);
75 static void InstrKindClicked (void);
77 static void InstrumentsMiLoad (void);
78 static void InstrumentsMiSave (void);
79 static void InstrumentsMiSaveAs (void);
80 static void InstrumentsMiRemap (void);
81 static void InstrumentsMiSaveIcons (void);
82 static void InstrumentsMiSaveCompressed (void);
83 static void InstrumentsMiSaveRaw (void);
86 XDEF struct List InstrList;
87 static ULONG InstrSecs = 0, InstrMicros = 0;
90 static struct NewMenu InstrumentsNewMenu[] = {
91 NM_TITLE, (STRPTR)MSG_INSTRUMENTS_MEN, NULL, 0, NULL, NULL,
92 NM_ITEM, (STRPTR)MSG_LOAD_MEN, (STRPTR)"L", 0, 0L, (APTR)InstrumentsMiLoad,
93 NM_ITEM, (STRPTR)MSG_SAVE_MEN, (STRPTR)"S", 0, 0L, (APTR)InstrumentsMiSave,
94 NM_ITEM, (STRPTR)MSG_SAVE_AS_MEN, (STRPTR)"A", 0, 0L, (APTR)InstrumentsMiSaveAs,
95 NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
96 NM_ITEM, (STRPTR)MSG_REMAP_MEN, (STRPTR)"R", 0, 0L, (APTR)InstrumentsMiRemap,
97 NM_TITLE, (STRPTR)MSG_SETTINGS_MEN, NULL, 0, NULL, NULL,
98 NM_ITEM, (STRPTR)MSG_SAVE_ICONS_MEN, NULL, CHECKIT|MENUTOGGLE, 0L, (APTR)InstrumentsMiSaveIcons,
99 NM_ITEM, (STRPTR)MSG_SAVE_COMPRESSED_MEN, NULL, CHECKIT|MENUTOGGLE, 4L, (APTR)InstrumentsMiSaveCompressed,
100 NM_ITEM, (STRPTR)MSG_SAVE_RAW_MEN, NULL, CHECKIT|MENUTOGGLE, 2L, (APTR)InstrumentsMiSaveRaw,
101 NM_END, NULL, NULL, 0, 0L, NULL };
105 static STRPTR InstrKindLabels[] = {
106 (STRPTR)MSG_SAMPLE_GAD,
107 (STRPTR)MSG_SYNTH_GAD,
108 (STRPTR)MSG_HYBRID_GAD,
114 static ULONG InstrumentsArgs[] =
116 HGROUP_KIND, BBFT_RIDGE,
118 LISTVIEW_KIND, (ULONG)InstrListClicked, 0, (ULONG)&InstrList, TAG_DONE,
119 STRING_KIND, (ULONG)InstrNameClicked, 0, 64, TAG_DONE,
122 BUTTON_KIND, (ULONG)InstrNewClicked, MSG_UNDERSCORE_NEW_GAD, TAG_DONE,
123 BUTTON_KIND, (ULONG)InstrOpenClicked, MSG_OPEN_GAD, TAG_DONE,
124 BUTTON_KIND, (ULONG)InstrDelClicked, MSG_DEL_GAD, TAG_DONE,
125 BUTTON_KIND, (ULONG)InstrUpClicked, MSG_UNDERSCORE_UP_GAD, TAG_DONE,
126 BUTTON_KIND, (ULONG)InstrDownClicked, MSG_UNDERSCORE_DOWN_GAD, TAG_DONE,
129 VGROUP_KIND, BBFT_RIDGE,
130 SLIDER_KIND, (ULONG)InstrVolumeClicked, MSG_VOLUME_GAD, 0, 64, (ULONG)"%lu", 3, TAG_DONE,
131 SLIDER_KIND, (ULONG)InstrFineTuneClicked,MSG_FINETUNE_GAD, -8, +7, (ULONG)"%ld", 3, TAG_DONE,
132 NUMBER_KIND, MSG_LENGHT_GAD, 7, TAG_DONE,
133 CYCLE_KIND, (ULONG)InstrKindClicked, MSG_KIND_GAD, (ULONG)InstrKindLabels, TAG_DONE,
134 BUTTON_KIND, (ULONG)InstrEditClicked, MSG_EDIT_DOTS_GAD, TAG_DONE,
141 XDEF LONG InstrumentsWinTags[] =
143 XMWIN_NewMenu, (LONG)InstrumentsNewMenu,
144 XMWIN_LayoutArgs, (LONG)InstrumentsArgs,
145 XMWIN_GCount, Instruments_CNT,
146 XMWIN_Title, MSG_INSTRUMENTS_TITLE,
147 XMWIN_WindowFlags, WFLG_CLOSEGADGET,
148 XMWIN_IDCMPFlags, BUTTONIDCMP|STRINGIDCMP|LISTVIEWIDCMP|INTEGERIDCMP|NUMBERIDCMP|IDCMP_MENUPICK|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,
149 XMWIN_PostOpenFunc, (LONG)InstrumentsPostOpen,
150 XMWIN_PostCloseFunc,(LONG)InstrumentsPostClose,
151 XMWIN_DropIconFunc, (LONG)InstrumentsDropIcon,
152 XMWIN_HelpNode, (LONG)"Instruments",
158 static void InstrumentsPostOpen (void)
160 UpdateInstrSwitches();
164 static void InstrumentsPostClose (void)
166 while (!IsListEmpty(&InstrList))
167 RemListViewNode (InstrList.lh_Head);
172 static void InstrumentsDropIcon (struct AppMessage *msg)
178 if (si = xmLockActiveSong (SM_EXCLUSIVE))
180 struct WBArg *wba = msg->am_ArgList;
184 olddir = CurrentDir (wba->wa_Lock);
186 for (i = 0, j = si->CurrentInst;
187 (i < msg->am_NumArgs) && (j < MAXINSTRUMENTS);
190 CurrentDir (msg->am_ArgList->wa_Lock);
194 if (LastErr = LoadInstrument (si, j, wba->wa_Name))
200 ReleaseSemaphore (&si->Lock);
202 if (si->CurrentInst == 0)
215 /*************************/
216 /* Instruments Functions */
217 /*************************/
219 GLOBALCALL void UpdateInstrList (void)
222 struct WinUserData *wud = WDescr[WID_INSTRUMENTS].Wud;
227 GT_SetGadgetAttrs (wud->Gadgets[GD_InstrList], wud->Win, NULL,
231 /* Empty previous list */
232 while (!IsListEmpty (&InstrList))
233 RemListViewNode (InstrList.lh_Head);
235 if (si = xmLockActiveSong (SM_SHARED))
237 for (i = 1 ; i <= si->LastInstrument; i++)
239 AddListViewNode (&InstrList, "%02lx %s", i,
241 (si->Instr[i]->Name ? si->Instr[i]->Name : STR(MSG_UNNAMED))
245 curr = si->CurrentInst - 1;
247 ReleaseSemaphore (&si->Lock);
250 GT_SetGadgetAttrs (wud->Gadgets[GD_InstrList], wud->Win, NULL,
251 GTLV_Labels, &InstrList,
252 GTLV_MakeVisible, curr,
261 GLOBALCALL void UpdateInstrInfo (void)
264 struct WinUserData *wud;
266 if (!(wud = WDescr[WID_INSTRUMENTS].Wud)) return;
267 if (!(wud->Win)) return;
269 if (si = xmLockActiveSong (SM_SHARED))
271 struct Instrument *instr;
273 if (si->CurrentInst && (instr = si->Instr[si->CurrentInst]))
275 GD_InstrName, instr->Name,
276 GD_InstrVolume, instr->Volume,
277 GD_InstrFineTune, instr->FineTune,
278 GD_InstrLen, instr->Length,
279 GD_InstrList, si->CurrentInst - 1,
287 GD_InstrList, si->CurrentInst - 1,
291 ReleaseSemaphore (&si->Lock);
294 DB(kprintf("remember to uncomment updatesample!\n"));
301 GLOBALCALL void UpdateInstrSwitches (void)
303 struct MenuItem *item;
304 struct WinUserData *wud = WDescr[WID_INSTRUMENTS].Wud;
306 if (wud && wud->MenuStrip)
308 if (wud->Win) ClearMenuStrip (wud->Win);
310 item = ItemAddress (wud->MenuStrip, SHIFTMENU(1) | SHIFTITEM(0) );
313 if (GuiSwitches.InstrSaveIcons)
314 item->Flags |= CHECKED;
316 item->Flags &= ~CHECKED;
318 if (wud->Win) ResetMenuStrip (wud->Win, wud->MenuStrip);
324 static void InstrumentsLoad (STRPTR name, ULONG num, ULONG count)
330 if (si = xmLockActiveSong (SM_EXCLUSIVE))
334 if (si->CurrentInst == 0)
337 instnum = si->CurrentInst + num;
339 if (instnum < MAXINSTRUMENTS)
340 LoadInstrument (si, instnum, name);
342 if (si->CurrentInst == 0)
347 ReleaseSemaphore (&si->Lock);
355 /***********************/
356 /* Instruments Gadgets */
357 /***********************/
359 static void InstrNewClicked (void)
363 if (si = xmLockActiveSong (SM_EXCLUSIVE))
365 xmAddInstrumentA (si, -1, NULL);
368 SNGA_CurrentInst, si->LastInstrument,
371 ReleaseSemaphore (&si->Lock);
379 static void InstrOpenClicked (void)
381 StartFileRequest (FREQ_LOADINST, InstrumentsLoad);
386 static void InstrDelClicked (void)
390 if (si = xmLockActiveSong (SM_EXCLUSIVE))
392 xmRemInstrument (si, si->CurrentInst);
395 SNGA_CurrentInst, si->CurrentInst + 1,
398 ReleaseSemaphore (&si->Lock);
406 static void InstrUpClicked (void)
408 struct Instrument *tmp;
411 if (si = xmLockActiveSong (SM_EXCLUSIVE))
413 /* Swap actual instrument with the previous one */
414 if (si->CurrentInst <= 1) return;
416 tmp = si->Instr[si->CurrentInst];
417 si->Instr[si->CurrentInst] = si->Instr[si->CurrentInst-1];
418 si->Instr[si->CurrentInst-1] = tmp;
421 SNGA_CurrentInst, si->CurrentInst-1,
424 ReleaseSemaphore (&si->Lock);
432 static void InstrDownClicked (void)
435 struct Instrument *tmp;
437 if (si = xmLockActiveSong (SM_EXCLUSIVE))
439 /* Swap actual instrument with the next one */
440 if (si->CurrentInst >= MAXINSTRUMENTS-1) DisplayBeep (Scr);
443 /**/ /* Use some OO-legal way to do this!! :) */
444 tmp = si->Instr[si->CurrentInst];
445 si->Instr[si->CurrentInst] = si->Instr[si->CurrentInst+1];
446 si->Instr[si->CurrentInst+1] = tmp;
447 if (si->CurrentInst + 1 >= si->LastInstrument)
448 si->LastInstrument = si->CurrentInst + 1;
451 SNGA_CurrentInst, si->CurrentInst + 1,
455 ReleaseSemaphore (&si->Lock);
464 static void InstrSwapClicked (void)
471 static void InstrNameClicked (struct WinUserData *wud)
475 if (si = xmLockActiveSong (SM_EXCLUSIVE))
477 xmSetInstrument (si, si->CurrentInst,
478 INSTRA_Name, GetString (wud->Gadgets[GD_InstrName]),
481 ReleaseSemaphore (&si->Lock);
489 static void InstrListClicked (void)
493 if (si = xmLockActiveSong (SM_SHARED))
495 if (si->CurrentInst != IntuiMsg.Code + 1)
497 si->CurrentInst = IntuiMsg.Code + 1;
502 /* Check Double Click */
503 if (DoubleClick (InstrSecs, InstrMicros, IntuiMsg.Seconds, IntuiMsg.Micros))
504 NewWindow (WID_SAMPLE);
507 ReleaseSemaphore (&si->Lock);
510 InstrSecs = IntuiMsg.Seconds;
511 InstrMicros = IntuiMsg.Micros;
516 static void InstrVolumeClicked (void)
520 if (si = xmLockActiveSong (SM_EXCLUSIVE))
522 xmSetInstrument (si, si->CurrentInst,
523 INSTRA_Volume, IntuiMsg.Code,
526 ReleaseSemaphore (&si->Lock);
532 static void InstrFineTuneClicked (void)
536 if (si = xmLockActiveSong (SM_EXCLUSIVE))
538 xmSetInstrument (si, si->CurrentInst,
539 INSTRA_FineTune, IntuiMsg.Code,
541 ReleaseSemaphore (&si->Lock);
547 static void InstrKindClicked (void)
554 static void InstrEditClicked (void)
556 NewWindow (WID_SAMPLE);
565 static void InstrumentsMiLoad (void)
567 StartFileRequest (FREQ_LOADINST, InstrumentsLoad);
572 static void InstrumentsMiSave (void)
578 if (si = xmLockActiveSong (SM_SHARED))
580 if (si->Instr[si->CurrentInst])
581 LastErr = SaveInstrument (si->Instr[si->CurrentInst],
582 si->Instr[si->CurrentInst]->Name);
584 ReleaseSemaphore (&si->Lock);
592 static void InstrumentsMiSaveAs (void)
598 if (si = xmLockActiveSong (SM_EXCLUSIVE))
600 struct Instrument *instr;
601 UBYTE name[PATHNAME_MAX];
603 if (instr = si->Instr[si->CurrentInst])
605 strncpy (name, instr->Name, PATHNAME_MAX-1);
606 name[PATHNAME_MAX-1] = '\0';
608 if (FileRequest (FREQ_SAVEINST, name))
610 xmSetInstrument (si, si->CurrentInst,
611 INSTRA_Name, FilePart (name),
614 LastErr = SaveInstrument (instr, name);
618 ReleaseSemaphore (&si->Lock);
626 static void InstrumentsMiRemap (void)
630 if (si = xmLockActiveSong (SM_EXCLUSIVE))
632 RemapInstruments (si);
634 ReleaseSemaphore (&si->Lock);
640 static void InstrumentsMiSaveIcons (void)
642 GuiSwitches.InstrSaveIcons ^= 1;
647 static void InstrumentsMiSaveCompressed (void)
654 static void InstrumentsMiSaveRaw (void)