/* (c) Copyright 1988-1994 Microsoft Corporation. Microsoft Bars&Pipes Professional Source Code License This License governs use of the accompanying Software. Microsoft hopes you find this Software useful. You are licensed to do anything you want with the Software. In return, we simply require that you agree: 1. Not to remove any copyright notices from the Software. 2. That the Software comes "as is", with no warranties. None whatsoever. This means no implied warranty of merchantability or fitness for a particular purpose or any warranty of non-infringement. Also, you must pass this disclaimer on whenever you distribute the Software. 3. That we will not be liable for any of those types of damages known as indirect, special, consequential, or incidental related to the Software or this License, to the maximum extent the law permits. Also, you must pass this limitation of liability on whenever you distribute the Software. 4. That if you sue anyone over patents that you think may apply to the Software for that person’s use of the Software, your license to the Software ends automatically. 5. That the patent rights Microsoft is licensing only apply to the Software, not to any derivatives you make. 6. That your rights under the License end automatically if you breach this in any way. */ #include "/CompilerSpecific.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "/v.h" #include "display.h" #include "windows.h" #include "environ.h" #include "tools.h" #include "all.h" #include "menuenums.h" extern char filechanged; extern short closedown; extern struct Functions functions; FARCALL extern struct Menu vMenu1; extern struct Track *topdisplaytrack; extern struct Tool *selectedtool; extern char alignclips; extern char filename[]; extern struct Track *mixtrack; extern unsigned short toolid; extern char mixwait; short windowtofront = 0; extern struct Window *loopwindow; extern unsigned short toolcommand; static short preparetoreplace() { short i; long file; #ifdef DEMO return(0); #else if (!filechanged) return(0); i = yesnocancel(); if (i == 1) { if (!filename[0]) { simplefilename(filename,"song",FILES_SAVE|FILES_DELETE); if (!filename[0]) return(1); } if (filename[0]) { file = fastopen(filename,MODE_NEWFILE); if (file) { openwait(); savesong(file,(struct Environment *)&functions); fastclose(file); if (functions.flags & FLAGS_SAVEICONS) saveicon(filename); closewait(); } } return(0); } return((short)(i != 2)); #endif } #ifdef GERMAN unsigned char windowids[] = { WINDOW_ACCESS, WINDOW_CLIP, 0,0, WINDOW_ICONS, WINDOW_INFO, 0, WINDOW_METRO, WINDOW_MINI, WINDOW_MIX, WINDOW_FILTER, WINDOW_MARKERS, WINDOW_MEDIA, WINDOW_SONG, WINDOW_TP, WINDOW_TEMPO, WINDOW_TRACKS, WINDOW_TOOL, WINDOW_TRANS, WINDOW_TIMELINE, }; #endif #ifdef FRENCH unsigned char windowids[] = { WINDOW_SONG, WINDOW_ACCESS, WINDOW_TOOL, WINDOW_TEMPO, 0, WINDOW_MARKERS, 0, WINDOW_MINI, WINDOW_ICONS, WINDOW_INFO, WINDOW_MEDIA, WINDOW_METRO, WINDOW_MIX, WINDOW_TP, 0, WINDOW_TRACKS, WINDOW_TIMELINE, WINDOW_CLIP, WINDOW_TRANS, WINDOW_FILTER }; #endif #ifdef ENGLISH unsigned char windowids[] = { WINDOW_ACCESS, WINDOW_CLIP,0,0, WINDOW_ICONS, WINDOW_INFO, WINDOW_MASTER, WINDOW_MEDIA, WINDOW_METRO, WINDOW_MINI, WINDOW_MIX, WINDOW_FILTER, WINDOW_MARKERS, WINDOW_SONG, WINDOW_TEMPO, WINDOW_TP, WINDOW_TIMELINE, WINDOW_TOOL, WINDOW_TRACKS, WINDOW_TRANS }; #endif void loadthesong() { long file; struct Environment *environ; if (filename[0]) { file = fastopen(filename,MODE_OLDFILE); if (file) { environ = (struct Environment *) AllocMem(sizeof(struct Environment),MEMF_CLEAR); if (environ) { closeallwindows(0); openwait(); clearenvironment((struct Environment *)&functions,1); if (loadsong(file,environ)) { installenvironment(environ); } FreeMem((char *)environ,sizeof(struct Environment)); closewait(); filechanged = 0; } fastclose(file); } } } void mainmenu(window,class,code) struct Window *window; long class, code; { struct MenuItem *item; long menunum, itemnum, subnum; char buff[120]; long file; long refresh = 0; struct Track *track; long shift; long toppos; // long outercut = functions.songlength + 2304; short pattern; struct Window *twindow = (struct Window *) currentwindow(WINDOW_TRACKS); while (code != MENUNULL) { menunum = MENUNUM(code); itemnum = ITEMNUM(code); subnum = SUBNUM(code); item = (struct MenuItem *) ItemAddress(&vMenu1,code); code = item->NextSelect; switch (menunum) { case SONG_MENU : transportcommand(TC_STOP,functions.timenow); switch (itemnum) { case SMI_NEW : if (preparetoreplace()) break; #ifdef GERMAN strcpy(filename,"Neu.song"); #endif #ifdef ENGLISH strcpy(filename,"New.song"); #endif #ifdef FRENCH strcpy(filename,"Nou.song"); #endif file = Open(filename,MODE_OLDFILE); if (file) { Close(file); loadthesong(); displayalltools(); } else { closeallwindows(0); clearenvironment((struct Environment *)&functions,1); initenvironment(); } filename[0] = 0; refresh = DRAW_ALLNEW | DRAW_ALL; filechanged = 0; break; case SMI_OPEN : if (preparetoreplace()) break; simplefilename(buff,"song",FILES_OPEN|FILES_DELETE); if (buff[0]) strcpy(filename,buff); else break; case SMI_REVERT : #ifdef GERMAN if ((itemnum == 2) && !areyousure("Alte Version?")) break; #endif #ifdef ENGLISH if ((itemnum == 2) && !areyousure("revert?")) break; #endif #ifdef FRENCH if ((itemnum == 2) && !areyousure("restaurer?")) break; #endif loadthesong(); displayalltools(); refresh = DRAW_ALLNEW | DRAW_ALL; filechanged = 0; break; case SMI_SAVE : simplefilename(buff,"song",FILES_SAVE|FILES_DELETE); if (buff[0]) strcpy(filename,buff); else break; refresh |= DRAW_MENUS; case SMI_SAVEAS : #ifndef DEMO if (!filename[0]) { simplefilename(filename,"song",FILES_SAVE|FILES_DELETE); } if (filename[0]) { updateobject(&functions.filename,0); file = fastopen(filename,MODE_NEWFILE); if (file) { openwait(); freelist(functions.coordlist); functions.coordlist = (struct Event *) getwindowcoords(); savesong(file,(struct Environment *)&functions); fastclose(file); if (functions.flags & FLAGS_SAVEICONS) saveicon(filename); closewait(); filechanged = 0; } } #endif break; case SMI_SAVEASDEFAULT : #ifndef DEMO if (!areyousure("save this as the default Song?")) break; #ifdef GERMAN file = fastopen("Neu.song",MODE_NEWFILE); #endif #ifdef ENGLISH file = fastopen("New.song",MODE_NEWFILE); #endif #ifdef FRENCH file = fastopen("Nou.song",MODE_NEWFILE); #endif if (file) { openwait(); freelist(functions.coordlist); functions.coordlist = (struct Event *) getwindowcoords(); savesong(file,(struct Environment *)&functions); fastclose(file); if (functions.flags & FLAGS_SAVEICONS) saveicon("new.song"); closewait(); filechanged = 0; } #endif break; case SMI_PRINT : /* Print */ print(0,2); break; case SMI_TITLE : editauthor(); break; case SMI_LENGTH : editlength(); refresh = DRAW_ALL; break; case SMI_MIDI : if (functions.releasemidi) { (*functions.releasemidi)(); } else if (functions.stealmidi) { (*functions.stealmidi)(); } refresh |= DRAW_MENUS; break; case SMI_PROPAGATE : if (functions.sectionlist) { openwait(); dotracks(); abatracks(); closewait(); refresh = DRAW_ALL; } break; case SMI_GOTO : if (functions.running) break; class = measuretotime(&functions.masterclip, getgoto()); transportcommand(TC_POSITION,class); functions.starttime = class; updateobject(&functions.starttime,0); break; case SMI_ABOUT : openopener(functions.screen); openerwait(); closeopener(); break; case SMI_QUIT : if (preparetoreplace()) break; closedown = 1; return; } break; case TRACK_MENU : pattern = 1 << (functions.groupid - 1); if (!legaltrack(functions.selectedtrack)) functions.selectedtrack = 0; switch (itemnum) { case 0: // TMI_NEW : /* new */ track = (struct Track *) createtrack(1,1); if (track) { insertnewtrack(track); refresh |= DRAW_ALL; } if (functions.groupid) { markgroups(); updateobject(&functions.groupid,0); refresh |= (DRAW_MENUS|DRAW_NAMES|DRAW_SEQUENCE); } break; case 1: //TMI_COPY : /* copy */ if (functions.selectedtrack) { if (copytrack(functions.selectedtrack)) refresh |= DRAW_ALL; } break; case 2: //TMI_MERGE : /* Mix */ if (functions.selectedtrack && twindow) { mixtrack = functions.selectedtrack; #ifdef GERMAN EmbossedWindowText(twindow, "Spur fÜr Fusion wählen:",0); #endif #ifdef ENGLISH EmbossedWindowText(twindow, "Select the Merge Track:",0); #endif #ifdef FRENCH EmbossedWindowText(twindow, "Choisir la Piste à fusionner:",0); #endif mixwait = 1; } break; case 3: //TMI_SPLIT : if (functions.selectedtrack) { if (splittrack(functions.selectedtrack)) refresh |= DRAW_ALL; } break; case 4: //TMI_REMOVE : /* Delete */ if (functions.groupid) { #ifdef GERMAN if (!areyousure("diese Gruppe entfernen?")) break; #endif #ifdef ENGLISH if (!areyousure("remove this Group?")) break; #endif #ifdef FRENCH if (!areyousure("enlever ce Groupe?")) break; #endif track = functions.tracklist; for (;track;) { functions.selectedtrack = track->next; if (track->group & pattern) { functions.tracklist = (struct Track *) List_Remove( (struct ListItem *)functions.tracklist, (struct ListItem *)track); deletetrack(track); } track = functions.selectedtrack; } // functions.selectedtrack = 0; } else if (functions.selectedtrack) { #ifdef GERMAN if (!areyousure("diese Spur entfernen?")) break; #endif #ifdef ENGLISH if (!areyousure("remove this Track?")) break; #endif #ifdef FRENCH if (!areyousure("enlever cette Piste?")) break; #endif functions.tracklist = (struct Track *) List_Remove( (struct ListItem *)functions.tracklist, (struct ListItem *)functions.selectedtrack); deletetrack(functions.selectedtrack); } functions.selectedtrack = 0; // track = 0; cleanupmemory(); validtracks(); updateobject(&functions.tracklist,0); break; case 5: //TMI_LOADTRACK : /* load track. */ simplefilename(buff,"track",FILES_OPEN|FILES_DELETE); if (!buff[0]) break; file = fastopen(buff,MODE_OLDFILE); if (file) { track = (struct Track *) loadtrack(file); fastclose(file); if (track) { if (functions.selectedtrack) { track->next = functions.selectedtrack->next; functions.selectedtrack->next = track; functions.selectedtrack->selected = 0; } else functions.tracklist = (struct Track *) List_Cat( (struct ListItem *) functions.tracklist, (struct ListItem *)track); functions.selectedtrack = track; if (functions.groupid) { track->group &= 0xFFFF0000; track->group |= pattern; } refresh |= DRAW_ALL; track->selected = 1; } } if (functions.groupid) { markgroups(); updateobject(&functions.groupid,0); refresh |= (DRAW_MENUS|DRAW_NAMES|DRAW_SEQUENCE); } break; case 6: //TMI_LOADGROUP : /* Load group. */ if (functions.groupid) { simplefilename(buff,"group",FILES_OPEN|FILES_DELETE); if (!buff[0]) break; file = fastopen(buff,MODE_OLDFILE); if (!file) break; openwait(); track = (struct Track *) loadgroup(file,pattern); fastclose(file); closewait(); if (track) { functions.tracklist = (struct Track *) List_Cat((struct ListItem *)track, (struct ListItem *)functions.tracklist); refresh |= DRAW_ALL; markgroups(); } topdisplaytrack = functions.tracklist; } break; case 7: //TMI_SAVETRACK : /* save track or group. */ if (functions.groupid) { simplefilename(buff,"group", FILES_SAVE|FILES_DELETE); if (buff[0]) { file = fastopen(buff,MODE_NEWFILE); if (file) { openwait(); savegroup(file); fastclose(file); closewait(); } } } else if (functions.selectedtrack) { simplefilename(buff,"track", FILES_SAVE|FILES_DELETE); if (buff[0]) { file = fastopen(buff,MODE_NEWFILE); if (file) { openwait(); savetrack(file,functions.selectedtrack); fastclose(file); closewait(); } } } break; case 8: //TMI_SAVEDEFAULT : /* save track as default. */ if (!functions.groupid && functions.selectedtrack) { if (areyousure("save this as the default Track?")) { file = fastopen("new.track",MODE_NEWFILE); if (file) { openwait(); savetrack(file,functions.selectedtrack); fastclose(file); closewait(); } } } break; case 9: //TMI_ERASE : /* Erase. */ if (functions.groupid) { dotracks(); track = functions.tracklist; for (;track;track = track->next) { if (track->group & pattern) { clearcliplists(&track->clip); } calctrack(track); } // track = 0; updateobject(&functions.displayflags->change,0); refresh = DRAW_ALL; } else if (functions.selectedtrack) { dotracks(); clearcliplists(&functions.selectedtrack->clip); calctrack(functions.selectedtrack); updateobject(&functions.displayflags->change,0); refresh = DRAW_ALL; } cleanupmemory(); validtracks(); break; case 10: //TMI_TOOLIZE : /* Tool */ if (functions.edittools[toolid]) { openwait(); dotracks(); if (functions.groupid) { track = functions.tracklist; for (;track;track = track->next) { if (track->group & pattern) { toolclip(&track->clip, functions.edittools[toolid], 0,-1); computetrackhighandlow(track); } } // track = 0; } else if (functions.selectedtrack) { toolclip(&functions.selectedtrack->clip, functions.edittools[toolid],0,-1); computetrackhighandlow(functions.selectedtrack); } closewait(); refresh |= DRAW_SEQUENCE | DRAW_MARKERS | DRAW_SSEQUENCE; } break; case 11: //TMI_TIMESHIFT : /* Shift */ shift = getshift(); if (shift) { openwait(); dotracks(); if (functions.groupid) { track = functions.tracklist; for (;track;track = track->next) { if (track->group & pattern) { shiftclip(&track->clip,shift); } } // track = 0; } else if (functions.selectedtrack) { shiftclip(&functions.selectedtrack->clip,shift); } refresh |= DRAW_SEQUENCE | DRAW_MARKERS | DRAW_SSEQUENCE; createallmeasures(); closewait(); } break; case 12: //TMI_PROPAGATE : if (functions.sectionlist) { openwait(); dotracks(); if (functions.groupid) { track = functions.tracklist; for (;track;track = track->next) { if (track->group & pattern) { abatrack(track); } } // track = 0; } else if (functions.selectedtrack) { abatrack(functions.selectedtrack); } refresh |= DRAW_SEQUENCE | DRAW_MARKERS | DRAW_SSEQUENCE; cleanupmemory(); validtracks(); closewait(); } break; case 13: //TMI_SHAREINPUT : if (functions.groupid) { connectgroup(); refresh = DRAW_ALL; } break; case 14: //TMI_GATHERGROUP : // shift = 0; toppos = List_Position((struct ListItem *)functions.tracklist, (struct ListItem *)topdisplaytrack); marktracks(); shift = 0; if (functions.groupid) { track = functions.tracklist; for (;track;track = track->next) { if (track->group & pattern) { if (!shift) shift = track->height; else track->height = shift++; } } // track = 0; sorttracklist(); refresh = DRAW_ALL; topdisplaytrack = (struct Track *) List_Index((struct ListItem *)functions.tracklist, toppos); } break; case 15: //TMI_PRINT : if (functions.groupid) print(0,1); else if (functions.selectedtrack) print(functions.selectedtrack,1); break; } break; case EDIT_MENU : if (functions.running) break; switch (itemnum) { case 0 : // if (functions.cutout <= outercut){ openwait(); dotracks(); cuttracks(); closewait(); // } break; case 1 : // if (functions.cutout <= outercut){ openwait(); copytracks(); closewait(); // } break; case 2 : openwait(); dotracks(); pastetracks(); closewait(); break; case 3 : openwait(); dotracks(); if (subnum) mixtracks(); else { unsigned long cutout = functions.cutout; functions.cutout = ~0; mixtracks(); functions.cutout = cutout; } closewait(); break; case 4 : openwait(); dotracks(); erasetracks(); closewait(); break; case 5 : // if (functions.cutout <= outercut){ openwait(); dotracks(); spacetracks(); closewait(); // } break; case 6 : // if (functions.cutout <= outercut){ openwait(); dotracks(); choptracks(); closewait(); // } break; case 7 : // if (functions.cutout <= outercut){ if (functions.edittools[toolid]) { openwait(); dotracks(); tooltracks(functions.edittools[toolid]); closewait(); } // } break; case 8 : /* Loop */ // if (functions.cutout <= outercut){ class = getrepeat(); if (class) { openwait(); dotracks(); looptracks(class); closewait(); } // } break; case 9 : /* Propogate */ if (functions.sectionlist) { openwait(); dotracks(); abasection(); closewait(); } break; case 10 : if (functions.flags & FLAGS_UNDOBUFF) { openwait(); undotracks(); cleanupmemory(); validtracks(); closewait(); } break; } /* refresh |= DRAW_SEQUENCE | DRAW_MARKERS | DRAW_SSEQUENCE;*/ /* if (solomode() && (itemnum != 8)) { unsolotracks(); updateobject(&functions.displayflags->solo,0); updateobject(&functions.displayflags->valves,0); } */ updateobject(&functions.tracklist,0); break; case TOOL_MENU : switch (itemnum) { case 0 : /* Replicate Tool command */ if (subnum) toolcommand = TOOLCOMMAND_REPGROUP; else toolcommand = TOOLCOMMAND_REPALL; break; case 1 : toolcommand = TOOLCOMMAND_LEFT; break; case 2 : toolcommand = TOOLCOMMAND_RIGHT; break; case 3 : toolcommand = TOOLCOMMAND_EDIT; break; case 4 : if (subnum == 1) toolcommand=TOOLCOMMAND_DELGROUP; else if (subnum) toolcommand=TOOLCOMMAND_DELALL; else toolcommand = TOOLCOMMAND_DELETE; break; case 5 : if (selectedtool && (selectedtool->tooltype & (TOOL_BRANCHOUT | TOOL_BRANCHIN))) { toolcommand = TOOLCOMMAND_CONNECT; } break; case 6 : case 7 : case 8 : case 9 : case 10 : case 11 : case 12 : case 13 : openwindow(WINDOW_TRAY1 + itemnum - 6); break; } break; case TIMING_MENU : switch (itemnum) { case 0 : if (functions.running) break; functions.midiclock = !functions.midiclock; functions.smpteclock = 0; functions.sendmidiclock = 0; refresh |= DRAW_MENUS; break; case 1 : functions.sendmidiclock = !functions.sendmidiclock; if (!functions.midiouttool) functions.sendmidiclock = 0; refresh |= DRAW_MENUS; break; case 2 : setupmidiclocktool(); break; case 3 : if (functions.running) break; functions.smptetype = subnum; updateobject(&functions.startoffset,0); refresh |= DRAW_MENUS; break; case 4 : smpterequest(); break; case 5 : functions.saveflags ^= SFLAG_SMPTEOFFSET; updateobject(&functions.saveflags,0); updateobject(&functions.timenow,0); break; case 6 : functions.saveflags ^= SFLAG_LOCKTOMAP; updateobject(&functions.saveflags,0); break; } break; case WINDOWS_MENU : switch (itemnum) { #ifdef FRENCH case 4 : #else case 2 : #endif switch (subnum) { case 0 : openwindow(WINDOW_SCALE); break; case 1 : openwindow(WINDOW_CHORD); break; case 2 : openwindow(WINDOW_RHYTHM); break; case 3 : openwindow(WINDOW_PATCH); break; } break; #ifdef FRENCH case 6 : #else case 3 : #endif if (functions.edittools[toolid]) calledit(functions.edittools[toolid]); break; /*#ifdef FRENCH case 12 : #else case 6 : #endif edittrack(0,functions.starttime,0); break;*/ default : openwindow(windowids[itemnum]); break; } break; case PREFERENCE_MENU : refresh |= DRAW_MENUS; switch (itemnum) { case 0 : preferences(); break; case 1 : { static char convert[5] = { RES_MEASURE,RES_BEAT, RES_SECOND,RES_FRAME,RES_ANYWHERE }; functions.measureres = convert[subnum]; updateobject(&functions.measureres,0); refresh = 0; } break; case 2 : functions.multiin = !functions.multiin; refresh |= DRAW_CHANNELSIN; break; case 3 : functions.chop = !functions.chop; break; case 4 : remotecontrol(); break; case 5 : alignclips = !subnum; break; case 6 : switch (subnum) { case 0 : /* Combine song params. */ functions.flags ^= FLAGS_COMBINEPARAMS; break; case 1 : /* Combine tempo maps. */ functions.flags ^= FLAGS_COMBINETEMPO; break; case 2 : /* Combine sections. */ functions.flags ^= FLAGS_COMBINESECTIONS; break; } case 7 : functions.saveflags ^= SFLAG_MIDIDEFAULTS; break; case 8 : setprintopt(); //new by A.Faust //print(0,2); //set_printbuffersize(NULL); } break; } } if (toolcommand) refresh |= dotools(NULL); displayall(0,refresh); }