home *** CD-ROM | disk | FTP | other *** search
- /********************************************************************
- * *
- * This program can convert Protracker modules to a Fast/Taketracker *
- * module. *
- * *
- ********************************************************************/
-
- #include <string.h>
-
- #include <exec/libraries.h>
- #include <exec/memory.h>
- #include <dos/dos.h>
- #include <intuition/intuition.h>
- #include <intuition/gadgetclass.h>
- #include <libraries/gadtools.h>
- #include <libraries/reqtools.h>
- #include <libraries/xpk.h>
-
- #include <proto/exec.h>
- #include <proto/dos.h>
- #include <proto/intuition.h>
- #include <proto/gadtools.h>
- #include <proto/utility.h>
- #include <proto/reqtools.h>
-
- #include "Pro2Fast.h"
-
- // Define global variables
-
- char Version[] = "$VER: Pro2Fast version 1.1";
- char ProgramName[] = "Pro2Fast";
-
- char CLIString[] = "C=CALCULATE/S,M1=MODULE1/K,C11/K,C12/K,C13/K,C14/K,L1=LOOP1/S,M2=MODULE2/K,C21/K,C22/K,C23/K,C24/K,L2=LOOP2/S,M3=MODULE3/K,C31/K,C32/K,C33/K,C34/K,L3=LOOP3/S,M4=MODULE4/K,C41/K,C42/K,C43/K,C44/K,L4=LOOP4/S,M5=MODULE5/K,C51/K,C52/K,C53/K,C54/K,L5=LOOP5/S,M6=MODULE6/K,C61/K,C62/K,C63/K,C64/K,L6=LOOP6/S,M7=MODULE7/K,C71/K,C72/K,C73/K,C74/K,L7=LOOP7/S,M8=MODULE8/K,C81/K,C82/K,C83/K,C84/K,L8=LOOP8/S,DM=DESTMODULE/K";
-
- ULONG ArgList[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0};
-
- char outbuf[80];
-
- struct Library *GadToolsBase;
- struct ReqToolsBase *ReqToolsBase;
- struct Library *XpkBase;
- struct Gadget *glist = NULL;
- struct Gadget *our_gadgets[MaxGadgets];
- void *vi = NULL;
- struct TextAttr Topaz80 = {"topaz.font",8,0,0};
- struct Image DiskNorm = {0,0,DISKWIDTH,DISKHEIGHT,2,Disk_Norm,3,0,NULL};
- struct Image DiskPres = {0,0,DISKWIDTH,DISKHEIGHT,2,Disk_Pres,3,0,NULL};
- struct Image AboutPic = {5,3,195,149,2,AboutImage,3,0,NULL};
-
- BYTE Activated[8] = {TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE};
- UBYTE Chan[4][8] = {0, 0, 0, 0, 0, 0, 0, 0,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 0, 0, 0, 0, 0, 0, 0, 0};
- UBYTE Loop[8] = {0, 0, 0, 0, 0, 0, 0, 0};
-
- UBYTE chantab[64];
-
- char File1[216], File2[216], File3[216], File4[216];
- char File5[216], File6[216], File7[216], File8[216];
- char DestFile[216];
-
- APTR filereq;
- int lpoi, rpoi;
-
- // Cycle Labels
-
- char LeftTxt[] = {"L"};
- char RightTxt[] = {"R"};
- char OffTxt[] = {"O"};
-
- char EndTxt[] = {"End"};
- char LoopTxt[] = {"Loop"};
-
- char *ChanLab[] = {(char *)&LeftTxt, (char *)&RightTxt, (char *)&OffTxt, NULL};
- char *LoopLab[] = {(char *)&EndTxt, (char *)&LoopTxt, NULL};
-
- struct NewMenu ourmenu[] =
- {
- { NM_TITLE, "Project", NULL, 0, 0, NULL},
- { NM_ITEM, "Calculate", "a", 0, 0, NULL},
- { NM_ITEM, "Convert", "c", 0, 0, NULL},
- { NM_ITEM, NM_BARLABEL, 0, 0, 0, NULL},
- { NM_ITEM, "About", "?", 0, 0, NULL},
- { NM_ITEM, NM_BARLABEL, NULL, 0, 0, NULL},
- { NM_ITEM, "Quit", "q", 0, 0, NULL},
- { NM_END, NULL, 0, 0, NULL}
- };
-
-
- // Define Structures
-
- struct BorderSize
- {
- WORD Top;
- WORD Left;
- WORD Bottom;
- WORD Right;
- };
-
- struct ModInfo
- {
- LONG Size;
- LONG CalcSize;
- MODULE *Module;
- UBYTE MaxPatt;
- };
-
- struct CalcInfo
- {
- LONG Size;
- UBYTE Channels;
- UBYTE SongLen;
- UBYTE MaxPatt;
- };
-
-
- // Prototypes
-
- BOOL TestArgs(void);
- void WriteErr(char *errmsg);
- void FormatText(char *dest, char *text, ...);
- struct BorderSize GetOffsets(struct Screen *scr);
- int CreateGadgets(struct Screen *scr);
- void FixDisk(struct Gadget *gad);
- void RemoveGadgets(void);
- void DrawBevelBoxes(struct Window *win, struct Screen *scr);
- void DoWindow(void);
- void HandleEvents(struct Window *win, struct Screen *scr, struct Menu *menu);
- void FixGadgets(UWORD num, struct Window *win);
- void GetFile(struct Gadget *strgad, struct Window *win);
- void ShowRequest(char *text, ...);
- void CreateMod(struct Window *win);
- int CopySample(struct CalcInfo *cinfo, struct ModInfo *minfo, MODULE *dmod, UBYTE *UsedSamp, APTR *SampPoi);
- void FreeSamples(APTR *SampPoi, MODULE *dmod);
- void CopyChannels(int num, struct CalcInfo *cinfo, MODULE *smod, MODULE *dmod);
- struct CalcInfo CalculateIt(struct Window *win);
- int OneActive(void);
- struct ModInfo LoadModule(int num, struct Window *win);
- BPTR OpenFile(char *name);
- void CloseFile(BPTR fh);
- void About(struct Screen *pubscr);
-
- /********************************************************************
- * *
- * Main program *
- * *
- ********************************************************************/
-
- void main(void)
- {
- int i;
-
- if (!(GadToolsBase = OpenLibrary("gadtools.library",37)))
- WriteErr("Ehhhh, can't open gadtools.library.");
- else
- {
- if (!(ReqToolsBase = (struct ReqToolsBase *)OpenLibrary("reqtools.library",37)))
- WriteErr("You need reqtools.library version 37 or higher.");
- else
- {
- if (!(filereq = rtAllocRequestA(RT_FILEREQ, TAG_END)))
- WriteErr("Can't allocate file requester.");
- else
- {
- // Clear filename Variables
- for (i=0; i<216; i++)
- {
- File1[i] = 0;
- File2[i] = 0;
- File3[i] = 0;
- File4[i] = 0;
- File5[i] = 0;
- File6[i] = 0;
- File7[i] = 0;
- File8[i] = 0;
- DestFile[i] = 0;
- }
-
- if (!(TestArgs()))
- DoWindow();
-
- rtFreeReqBuffer(filereq);
- }
- CloseLibrary((struct Library *)ReqToolsBase);
- }
- CloseLibrary(GadToolsBase);
- }
- }
-
- /********************************************************************
- * *
- * This function will test the CLI arguments and return true or *
- * false to indicate if there was some. *
- * *
- ********************************************************************/
-
- BOOL TestArgs(void)
- {
- int i,j,k,c;
- UBYTE num;
-
- for (i=0; i<50; i++)
- if (ArgList[i] != NULL)
- {
- for (j=0; j<8; j++)
- {
- k = j*6+1;
- if (ArgList[k] == NULL)
- Activated[j] = FALSE;
- else
- {
- Activated[j] = TRUE;
-
- for (c=1; c<5; c++)
- {
- if (ArgList[k+c] != NULL)
- {
- switch (ToUpper(((char *)ArgList[k+c])[0]))
- {
- case 'L': num = 0;
- break;
- case 'R': num = 1;
- break;
- case 'O': num = 2;
- break;
- default: num = Chan[c-1][j];
- break;
- }
- Chan[c-1][j] = num;
- }
- }
-
- if (ArgList[k+5] == NULL)
- num = 0;
- else
- num = 1;
-
- Loop[j] = num;
- }
- }
-
- if (ArgList[0])
- CalculateIt(NULL);
- else
- CreateMod(NULL);
-
- Write(Output(),outbuf,strlen(outbuf));
- Write(Output(),"\n",1);
- return(TRUE);
- }
-
- return(FALSE);
- }
-
- /********************************************************************
- * *
- * This function will show an error message in an auto requester. *
- * *
- ********************************************************************/
-
- void WriteErr(char *errmsg)
- {
- struct IntuiText bodytxt;
- struct IntuiText negtxt;
-
- bodytxt.FrontPen = 255;
- bodytxt.BackPen = 255;
- bodytxt.DrawMode = 0;
- bodytxt.LeftEdge = 14;
- bodytxt.TopEdge = 14;
- bodytxt.ITextFont = NULL;
- bodytxt.IText = errmsg;
- bodytxt.NextText = NULL;
-
- negtxt.FrontPen = 255;
- negtxt.BackPen = 255;
- negtxt.DrawMode = 0;
- negtxt.LeftEdge = 4;
- negtxt.TopEdge = 4;
- negtxt.ITextFont = NULL;
- negtxt.IText = "ABORT";
- negtxt.NextText = NULL;
-
- AutoRequest(NULL,&bodytxt,NULL,&negtxt,0,0,320,60);
- }
-
- /********************************************************************
- * *
- * Format a text string via RawDoFmt() *
- * *
- ********************************************************************/
-
- void FormatText(char *dest, char *text, ...)
- {
- #define RAWDOFMT_COPY (void *)"\x16\xc0\x4e\x75" // MOVE.B D0,(A3)+
- // RTS
-
- RawDoFmt(text, &text+1, RAWDOFMT_COPY, dest);
- }
-
- /********************************************************************
- * *
- * Return the window border sizes. *
- * *
- ********************************************************************/
-
- struct BorderSize GetBorder(struct Screen *scr)
- {
- struct BorderSize borsiz;
-
- borsiz.Left = scr->WBorLeft;
- borsiz.Top = scr->Font->ta_YSize+scr->WBorTop+1;
- borsiz.Right = scr->WBorRight;
- borsiz.Bottom = scr->WBorBottom;
- return(borsiz);
- }
-
- /********************************************************************
- * *
- * Create gadtools gadgets. *
- * *
- ********************************************************************/
-
- int CreateGadgets(struct Screen *scr)
- {
- struct Gadget *gad;
- struct NewGadget ng;
- int success = FALSE;
- struct BorderSize bs;
-
- if ((vi = GetVisualInfo(scr, TAG_END)))
- {
- if ((gad = CreateContext(&glist)))
- {
- ng.ng_TextAttr = &Topaz80;
- ng.ng_VisualInfo = vi;
-
- bs = GetBorder(scr);
-
- // **** Create Info Gadget
- ng.ng_LeftEdge = 2+bs.Left;
- ng.ng_TopEdge = 1+bs.Top;
- ng.ng_Width = 535;
- ng.ng_Height = 12;
- ng.ng_GadgetText = NULL;
- ng.ng_GadgetID = InfoGad;
- ng.ng_Flags = PLACETEXT_IN;
-
- our_gadgets[InfoGad-1] = gad = CreateGadget(TEXT_KIND, gad, &ng,
- GTTX_Border,TRUE,
- GTTX_Text," Welcome to Pro -> Fast",
- TAG_END);
-
- // **** Create Module 1 CheckBox
- ng.ng_LeftEdge += 4;
- ng.ng_TopEdge += 16;
- ng.ng_Width = CHECKBOXWIDTH;
- ng.ng_Height = CHECKBOXHEIGHT;
- ng.ng_GadgetID = Check1Gad;
-
- our_gadgets[Check1Gad-1] = gad = CreateGadget(CHECKBOX_KIND, gad, &ng,
- GTCB_Checked,TRUE, TAG_END);
-
- // Create Module 2 CheckBox
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Check2Gad;
-
- our_gadgets[Check2Gad-1] = gad = CreateGadget(CHECKBOX_KIND, gad, &ng,
- TAG_END);
-
- // Create Module 3 CheckBox
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Check3Gad;
-
- our_gadgets[Check3Gad-1] = gad = CreateGadget(CHECKBOX_KIND, gad, &ng,
- TAG_END);
-
- // Create Module 4 CheckBox
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Check4Gad;
-
- our_gadgets[Check4Gad-1] = gad = CreateGadget(CHECKBOX_KIND, gad, &ng,
- TAG_END);
-
- // Create Module 5 CheckBox
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Check5Gad;
-
- our_gadgets[Check5Gad-1] = gad = CreateGadget(CHECKBOX_KIND, gad, &ng,
- TAG_END);
-
- // Create Module 6 CheckBox
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Check6Gad;
-
- our_gadgets[Check6Gad-1] = gad = CreateGadget(CHECKBOX_KIND, gad, &ng,
- TAG_END);
-
- // Create Module 7 CheckBox
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Check7Gad;
-
- our_gadgets[Check7Gad-1] = gad = CreateGadget(CHECKBOX_KIND, gad, &ng,
- TAG_END);
-
- // Create Module 8 CheckBox
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Check8Gad;
-
- our_gadgets[Check8Gad-1] = gad = CreateGadget(CHECKBOX_KIND, gad, &ng,
- TAG_END);
-
- // **** Create Module 1 File
- ng.ng_LeftEdge += CHECKBOXWIDTH+4;
- ng.ng_TopEdge = 16+bs.Top;
- ng.ng_Width = 236;
- ng.ng_Height = 14;
- ng.ng_GadgetID = File1Gad;
-
- our_gadgets[File1Gad-1] = gad = CreateGadget(STRING_KIND, gad, &ng,
- GA_TabCycle,TRUE, GTST_String,&File1,
- GTST_MaxChars,215, TAG_END);
-
- // Create Module 2 File
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = File2Gad;
-
- our_gadgets[File2Gad-1] = gad = CreateGadget(STRING_KIND, gad, &ng,
- GA_TabCycle,TRUE, GTST_String,&File2,
- GTST_MaxChars,215, GA_Disabled,TRUE,
- TAG_END);
-
- // Create Module 3 File
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = File3Gad;
-
- our_gadgets[File3Gad-1] = gad = CreateGadget(STRING_KIND, gad, &ng,
- GA_TabCycle,TRUE, GTST_String,&File3,
- GTST_MaxChars,215, GA_Disabled,TRUE,
- TAG_END);
-
- // Create Module 4 File
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = File4Gad;
-
- our_gadgets[File4Gad-1] = gad = CreateGadget(STRING_KIND, gad, &ng,
- GA_TabCycle,TRUE, GTST_String,&File4,
- GTST_MaxChars,215, GA_Disabled,TRUE,
- TAG_END);
-
- // Create Module 5 File
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = File5Gad;
-
- our_gadgets[File5Gad-1] = gad = CreateGadget(STRING_KIND, gad, &ng,
- GA_TabCycle,TRUE, GTST_String,&File5,
- GTST_MaxChars,215, GA_Disabled,TRUE,
- TAG_END);
-
- // Create Module 6 File
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = File6Gad;
-
- our_gadgets[File6Gad-1] = gad = CreateGadget(STRING_KIND, gad, &ng,
- GA_TabCycle,TRUE, GTST_String,&File6,
- GTST_MaxChars,215, GA_Disabled,TRUE,
- TAG_END);
-
- // Create Module 7 File
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = File7Gad;
-
- our_gadgets[File7Gad-1] = gad = CreateGadget(STRING_KIND, gad, &ng,
- GA_TabCycle,TRUE, GTST_String,&File7,
- GTST_MaxChars,215, GA_Disabled,TRUE,
- TAG_END);
-
- // Create Module 8 File
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = File8Gad;
-
- our_gadgets[File8Gad-1] = gad = CreateGadget(STRING_KIND, gad, &ng,
- GA_TabCycle,TRUE, GTST_String,&File8,
- GTST_MaxChars,215, GA_Disabled,TRUE,
- TAG_END);
-
- // **** Create Module 1 Disk
- ng.ng_LeftEdge += 240;
- ng.ng_TopEdge = 16+bs.Top;
- ng.ng_Width = DISKWIDTH;
- ng.ng_Height = DISKHEIGHT;
- ng.ng_GadgetID = Disk1Gad;
-
- our_gadgets[Disk1Gad-1] = gad = CreateGadget(GENERIC_KIND, gad, &ng,
- TAG_END);
- FixDisk(gad);
- gad->Flags &= ~(GFLG_DISABLED);
-
- // Create Module 2 Disk
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Disk2Gad;
-
- our_gadgets[Disk2Gad-1] = gad = CreateGadget(GENERIC_KIND, gad, &ng,
- TAG_END);
- FixDisk(gad);
-
- // Create Module 3 Disk
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Disk3Gad;
-
- our_gadgets[Disk3Gad-1] = gad = CreateGadget(GENERIC_KIND, gad, &ng,
- TAG_END);
- FixDisk(gad);
-
- // Create Module 4 Disk
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Disk4Gad;
-
- our_gadgets[Disk4Gad-1] = gad = CreateGadget(GENERIC_KIND, gad, &ng,
- TAG_END);
- FixDisk(gad);
-
- // Create Module 5 Disk
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Disk5Gad;
-
- our_gadgets[Disk5Gad-1] = gad = CreateGadget(GENERIC_KIND, gad, &ng,
- TAG_END);
- FixDisk(gad);
-
- // Create Module 6 Disk
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Disk6Gad;
-
- our_gadgets[Disk6Gad-1] = gad = CreateGadget(GENERIC_KIND, gad, &ng,
- TAG_END);
- FixDisk(gad);
-
- // Create Module 7 Disk
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Disk7Gad;
-
- our_gadgets[Disk7Gad-1] = gad = CreateGadget(GENERIC_KIND, gad, &ng,
- TAG_END);
- FixDisk(gad);
-
- // Create Module 8 Disk
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Disk8Gad;
-
- our_gadgets[Disk8Gad-1] = gad = CreateGadget(GENERIC_KIND, gad, &ng,
- TAG_END);
- FixDisk(gad);
-
- // **** Create Module 1 Channel 1
- ng.ng_LeftEdge += DISKWIDTH+4;
- ng.ng_TopEdge = 16+bs.Top;
- ng.ng_Width = 38;
- ng.ng_Height = 13;
- ng.ng_GadgetID = Chan11Gad;
-
- our_gadgets[Chan11Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab, TAG_END);
-
- // Create Module 2 Channel 1
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan12Gad;
-
- our_gadgets[Chan12Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 3 Channel 1
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan13Gad;
-
- our_gadgets[Chan13Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 4 Channel 1
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan14Gad;
-
- our_gadgets[Chan14Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 5 Channel 1
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan15Gad;
-
- our_gadgets[Chan15Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 6 Channel 1
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan16Gad;
-
- our_gadgets[Chan16Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 7 Channel 1
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan17Gad;
-
- our_gadgets[Chan17Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 8 Channel 1
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan18Gad;
-
- our_gadgets[Chan18Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab,
- GA_Disabled,TRUE, TAG_END);
-
- // **** Create Module 1 Channel 2
- ng.ng_LeftEdge += 42;
- ng.ng_TopEdge = 16+bs.Top;
- ng.ng_GadgetID = Chan21Gad;
-
- our_gadgets[Chan21Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab, GTCY_Active, 1,
- TAG_END);
-
- // Create Module 2 Channel 2
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan22Gad;
-
- our_gadgets[Chan22Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab, GTCY_Active, 1,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 3 Channel 2
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan23Gad;
-
- our_gadgets[Chan23Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab, GTCY_Active, 1,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 4 Channel 2
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan24Gad;
-
- our_gadgets[Chan24Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab, GTCY_Active, 1,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 5 Channel 2
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan25Gad;
-
- our_gadgets[Chan25Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab, GTCY_Active, 1,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 6 Channel 2
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan26Gad;
-
- our_gadgets[Chan26Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab, GTCY_Active, 1,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 7 Channel 2
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan27Gad;
-
- our_gadgets[Chan27Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab, GTCY_Active, 1,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 8 Channel 2
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan28Gad;
-
- our_gadgets[Chan28Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab, GTCY_Active, 1,
- GA_Disabled,TRUE, TAG_END);
-
- // **** Create Module 1 Channel 3
- ng.ng_LeftEdge += 42;
- ng.ng_TopEdge = 16+bs.Top;
- ng.ng_GadgetID = Chan31Gad;
-
- our_gadgets[Chan31Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab, GTCY_Active, 1,
- TAG_END);
-
- // Create Module 2 Channel 3
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan32Gad;
-
- our_gadgets[Chan32Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab, GTCY_Active, 1,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 3 Channel 3
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan33Gad;
-
- our_gadgets[Chan33Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab, GTCY_Active, 1,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 4 Channel 3
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan34Gad;
-
- our_gadgets[Chan34Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab, GTCY_Active, 1,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 5 Channel 3
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan35Gad;
-
- our_gadgets[Chan35Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab, GTCY_Active, 1,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 6 Channel 3
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan36Gad;
-
- our_gadgets[Chan36Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab, GTCY_Active, 1,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 7 Channel 3
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan37Gad;
-
- our_gadgets[Chan37Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab, GTCY_Active, 1,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 8 Channel 3
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan38Gad;
-
- our_gadgets[Chan38Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab, GTCY_Active, 1,
- GA_Disabled,TRUE, TAG_END);
-
- // **** Create Module 1 Channel 4
- ng.ng_LeftEdge += 42;
- ng.ng_TopEdge = 16+bs.Top;
- ng.ng_GadgetID = Chan41Gad;
-
- our_gadgets[Chan41Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab, TAG_END);
-
- // Create Module 2 Channel 4
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan42Gad;
-
- our_gadgets[Chan42Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 3 Channel 4
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan43Gad;
-
- our_gadgets[Chan43Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 4 Channel 4
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan44Gad;
-
- our_gadgets[Chan44Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 5 Channel 4
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan45Gad;
-
- our_gadgets[Chan45Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 6 Channel 4
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan46Gad;
-
- our_gadgets[Chan46Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 7 Channel 4
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan47Gad;
-
- our_gadgets[Chan47Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 8 Channel 4
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Chan48Gad;
-
- our_gadgets[Chan48Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&ChanLab,
- GA_Disabled,TRUE, TAG_END);
-
- // **** Create Module 1 Loop
- ng.ng_LeftEdge += 42;
- ng.ng_TopEdge = 16+bs.Top;
- ng.ng_Width = 62;
- ng.ng_GadgetID = Loop1Gad;
-
- our_gadgets[Loop1Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&LoopLab, TAG_END);
-
- // Create Module 2 Loop
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Loop2Gad;
-
- our_gadgets[Loop2Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&LoopLab,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 3 Loop
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Loop3Gad;
-
- our_gadgets[Loop3Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&LoopLab,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 4 Loop
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Loop4Gad;
-
- our_gadgets[Loop4Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&LoopLab,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 5 Loop
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Loop5Gad;
-
- our_gadgets[Loop5Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&LoopLab,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 6 Loop
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Loop6Gad;
-
- our_gadgets[Loop6Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&LoopLab,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 7 Loop
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Loop7Gad;
-
- our_gadgets[Loop7Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&LoopLab,
- GA_Disabled,TRUE, TAG_END);
-
- // Create Module 8 Loop
- ng.ng_TopEdge += 16;
- ng.ng_GadgetID = Loop8Gad;
-
- our_gadgets[Loop8Gad-1] = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels,&LoopLab,
- GA_Disabled,TRUE, TAG_END);
-
- // **** Create Destination File
- ng.ng_LeftEdge = 114+bs.Left;
- ng.ng_TopEdge += 18;
- ng.ng_Width = 391;
- ng.ng_Height = 14;
- ng.ng_GadgetText = "Destination:";
- ng.ng_GadgetID = DestFileGad;
- ng.ng_Flags = PLACETEXT_LEFT;
-
- our_gadgets[DestFileGad-1] = gad = CreateGadget(STRING_KIND, gad, &ng,
- GA_TabCycle,TRUE, GTST_String,&DestFile,
- GTST_MaxChars,215, TAG_END);
-
- // Create Destination Disk
- ng.ng_LeftEdge += 395;
- ng.ng_GadgetText = NULL;
- ng.ng_GadgetID = DestDiskGad;
-
- our_gadgets[DestDiskGad-1] = gad = CreateGadget(GENERIC_KIND, gad, &ng,
- TAG_END);
- FixDisk(gad);
- gad->Flags &= ~(GFLG_DISABLED);
-
- // **** Create Convert Button
- ng.ng_LeftEdge = 6+bs.Left;
- ng.ng_TopEdge += 19;
- ng.ng_Width = 261;
- ng.ng_Height = 12;
- ng.ng_GadgetText = "Convert";
- ng.ng_GadgetID = ConvertGad;
- ng.ng_Flags = PLACETEXT_IN;
-
- our_gadgets[ConvertGad-1] = gad = CreateGadget(BUTTON_KIND, gad, &ng,
- TAG_END);
-
- // Create Calculate Button
- ng.ng_LeftEdge += 265;
- ng.ng_GadgetText = "Calculate";
- ng.ng_GadgetID = CalculateGad;
-
- our_gadgets[CalculateGad-1] = gad = CreateGadget(BUTTON_KIND, gad, &ng,
- TAG_END);
-
- // Check For An Error
- if (gad != NULL)
- success = TRUE;
- }
- }
- return(success);
- }
-
- /********************************************************************
- * *
- * Will fix the gadget to a disk gadget. *
- * *
- ********************************************************************/
-
- void FixDisk (struct Gadget *gad)
- {
- if (gad != NULL)
- {
- gad->Flags = GFLG_GADGIMAGE | GFLG_GADGHIMAGE | GFLG_DISABLED;
- gad->Activation |= GACT_RELVERIFY | GACT_IMMEDIATE;
- gad->GadgetRender = &DiskNorm;
- gad->SelectRender = &DiskPres;
- }
- }
-
- /********************************************************************
- * *
- * Remove all our gadgets from memory. *
- * *
- ********************************************************************/
-
- void RemoveGadgets(void)
- {
- FreeGadgets(glist);
- FreeVisualInfo(vi);
- }
-
- /********************************************************************
- * *
- * Draw bevel boxes. *
- * *
- ********************************************************************/
-
- void DrawBevelBoxes(struct Window *win, struct Screen *scr)
- {
- struct RastPort *rp;
- struct BorderSize borsiz;
-
- rp=win->RPort;
- borsiz = GetBorder(scr);
-
- DrawBevelBox(rp,2+borsiz.Left,14+borsiz.Top,535,148,
- GT_VisualInfo,vi,GTBB_Recessed,TRUE,TAG_END);
-
- DrawBevelBox(rp,2+borsiz.Left,163+borsiz.Top,535,16,
- GT_VisualInfo,vi,GTBB_Recessed,TRUE,TAG_END);
- }
-
- /********************************************************************
- * *
- * Open window and handle IDCMPs. *
- * *
- ********************************************************************/
-
- void DoWindow(void)
- {
- #define width 539
- #define height 180
-
- int left, top;
- struct BorderSize bs;
- struct Screen *pub_screen;
- struct Window *our_window;
- struct Menu *our_menu;
-
- // Get a lock on the default public screen
- if (!(pub_screen = LockPubScreen(NULL)))
- WriteErr("Can't lock a public screen.");
- else
- {
-
- // Create Our gadgets
- if (!CreateGadgets(pub_screen))
- WriteErr("Can't create gadgets.");
- else
- {
- // Open our window
- bs = GetBorder(pub_screen);
-
- left = (pub_screen->Width - (bs.Left + bs.Right + width)) / 2;
- top = (pub_screen->Height - (bs.Top + bs.Bottom + height)) / 2;
-
- if (!(our_window = OpenWindowTags(NULL,WA_Left,left,WA_Top,top,
- WA_InnerWidth,width,WA_InnerHeight,height,
- WA_IDCMP,our_idcmp,WA_AutoAdjust,TRUE,
- WA_Title,"Protracker -> Fast/Taketracker Version 1.1",
- WA_PubScreen,pub_screen,WA_PubScreenFallBack,TRUE,
- WA_Gadgets,glist,
- WA_CloseGadget,TRUE,WA_DragBar,TRUE,WA_DepthGadget,TRUE,
- WA_Activate,TRUE,WA_SmartRefresh,TRUE,
- WA_NewLookMenus,TRUE,
- TAG_END)))
- WriteErr("Can't open window.");
- else
- {
- DrawBevelBoxes(our_window,pub_screen);
- if (!(our_menu = CreateMenus(ourmenu, TAG_END)))
- WriteErr("Can't create menus.");
- else
- {
- if (!(LayoutMenus(our_menu, vi, GTMN_NewLookMenus,TRUE, TAG_END)))
- WriteErr("Can't layout menus.");
- else
- {
- if (!(SetMenuStrip(our_window, our_menu)))
- WriteErr("Can't attach menu to window.");
- else
- {
- GT_RefreshWindow(our_window,NULL);
-
- About(pub_screen);
-
- HandleEvents(our_window, pub_screen, our_menu);
- ClearMenuStrip(our_window);
- }
- }
- FreeMenus(our_menu);
- }
- CloseWindow(our_window);
- }
- }
- RemoveGadgets();
- UnlockPubScreen(NULL,pub_screen);
- }
- }
-
- /********************************************************************
- * *
- * Handle window IDCMPs. *
- * *
- ********************************************************************/
-
- void HandleEvents(struct Window *win, struct Screen *scr, struct Menu *menu)
- {
- struct IntuiMessage *msg;
- struct MenuItem *item;
- LONG sigrcvd;
- BOOL done = FALSE;
- UWORD gadid, menunumber;
- UWORD menunum, itemnum; //, subnum;
-
- while (!done)
- {
- sigrcvd = Wait((1L << win->UserPort->mp_SigBit) | SIGBREAKF_CTRL_C);
-
- while ((!done) && (msg = GT_GetIMsg(win->UserPort)))
- {
- switch (msg->Class)
- {
- case IDCMP_REFRESHWINDOW:
- GT_BeginRefresh(win);
- GT_EndRefresh(win,TRUE);
- break;
-
- case IDCMP_CLOSEWINDOW:
- done = TRUE;
- break;
-
- case IDCMP_MENUPICK:
- menunumber = msg->Code;
- while ((menunumber != MENUNULL) && (!done))
- {
- item = ItemAddress(menu, menunumber);
-
- // Process the item here
- menunum = MENUNUM(menunumber);
- itemnum = ITEMNUM(menunumber);
- //subnum = SUBNUM(menunumber);
-
- // stop if quit is selected
- switch (menunum)
- {
- case 0:
- switch (itemnum)
- {
- case 0: CalculateIt(win);
- break;
-
- case 1: CreateMod(win);
- break;
-
- case 3: About(scr);
- break;
-
- case 5: done = TRUE;
- break;
- }
- break;
- }
-
- menunumber = item->NextSelect;
- }
- break;
-
- case IDCMP_GADGETUP:
- if ((gadid = ((struct Gadget *)msg->IAddress)->GadgetID))
- {
- switch (gadid)
- {
- case Check1Gad:
- case Check2Gad:
- case Check3Gad:
- case Check4Gad:
- case Check5Gad:
- case Check6Gad:
- case Check7Gad:
- case Check8Gad:
- Activated[gadid-Check1Gad] = msg->Code;
- FixGadgets(gadid-Check1Gad, win);
- break;
-
- case Chan11Gad:
- case Chan12Gad:
- case Chan13Gad:
- case Chan14Gad:
- case Chan15Gad:
- case Chan16Gad:
- case Chan17Gad:
- case Chan18Gad:
- Chan[0][gadid-Chan11Gad] = msg->Code;
- break;
-
- case Chan21Gad:
- case Chan22Gad:
- case Chan23Gad:
- case Chan24Gad:
- case Chan25Gad:
- case Chan26Gad:
- case Chan27Gad:
- case Chan28Gad:
- Chan[1][gadid-Chan21Gad] = msg->Code;
- break;
-
- case Chan31Gad:
- case Chan32Gad:
- case Chan33Gad:
- case Chan34Gad:
- case Chan35Gad:
- case Chan36Gad:
- case Chan37Gad:
- case Chan38Gad:
- Chan[2][gadid-Chan31Gad] = msg->Code;
- break;
-
- case Chan41Gad:
- case Chan42Gad:
- case Chan43Gad:
- case Chan44Gad:
- case Chan45Gad:
- case Chan46Gad:
- case Chan47Gad:
- case Chan48Gad:
- Chan[3][gadid-Chan41Gad] = msg->Code;
- break;
-
- case Loop1Gad:
- case Loop2Gad:
- case Loop3Gad:
- case Loop4Gad:
- case Loop5Gad:
- case Loop6Gad:
- case Loop7Gad:
- case Loop8Gad:
- Loop[gadid-Loop1Gad] = msg->Code;
- break;
-
- case Disk1Gad:
- case Disk2Gad:
- case Disk3Gad:
- case Disk4Gad:
- case Disk5Gad:
- case Disk6Gad:
- case Disk7Gad:
- case Disk8Gad:
- GetFile(our_gadgets[gadid-8-1], win);
- break;
-
- case DestDiskGad:
- GetFile(our_gadgets[DestFileGad-1], win);
- break;
-
- case ConvertGad:
- CreateMod(win);
- break;
-
- case CalculateGad:
- CalculateIt(win);
- break;
- }
- }
- break;
- }
-
- GT_ReplyIMsg(msg);
- }
-
- // Test to see if we got a CTRL-C signal
- if (sigrcvd & SIGBREAKF_CTRL_C)
- done = TRUE;
- }
- }
-
- /********************************************************************
- * *
- * Ghost or unghost one line of gadgets. *
- * *
- ********************************************************************/
-
- void FixGadgets(UWORD num, struct Window *win)
- {
- int ghostflag = TRUE;
- UWORD ghostflag1 = GFLG_DISABLED;
-
- if (Activated[num])
- {
- ghostflag = FALSE;
- ghostflag1 = 0;
- }
-
- GT_SetGadgetAttrs(our_gadgets[File1Gad+num-1], win, NULL,
- GA_Disabled,ghostflag, TAG_END);
-
- GT_SetGadgetAttrs(our_gadgets[Chan11Gad+num-1], win, NULL,
- GA_Disabled,ghostflag, TAG_END);
-
- GT_SetGadgetAttrs(our_gadgets[Chan21Gad+num-1], win, NULL,
- GA_Disabled,ghostflag, TAG_END);
-
- GT_SetGadgetAttrs(our_gadgets[Chan31Gad+num-1], win, NULL,
- GA_Disabled,ghostflag, TAG_END);
-
- GT_SetGadgetAttrs(our_gadgets[Chan41Gad+num-1], win, NULL,
- GA_Disabled,ghostflag, TAG_END);
-
- GT_SetGadgetAttrs(our_gadgets[Loop1Gad+num-1], win, NULL,
- GA_Disabled,ghostflag, TAG_END);
-
- our_gadgets[Disk1Gad+num-1]->Flags = (our_gadgets[Disk1Gad+num-1]->Flags & ~(GFLG_DISABLED)) | ghostflag1;
- RefreshGList(our_gadgets[Disk1Gad+num-1],win,NULL,1);
- }
-
- /********************************************************************
- * *
- * Popup a reqtools filerequester. *
- * *
- ********************************************************************/
-
- void GetFile(struct Gadget *strgad, struct Window *win)
- {
- char file[108];
- char dir[108];
- char wholefile[216];
- char *gstrpoi;
- char *strpoi;
-
- // Copy old context of string gadget
- gstrpoi = ((struct StringInfo *)(strgad->SpecialInfo))->Buffer;
- if (gstrpoi[0] != '\0')
- {
- strpoi = FilePart(gstrpoi);
- stccpy((char *)&dir, gstrpoi, strpoi-gstrpoi+1); // Copy Path
- strcpy((char *)&file, strpoi); // Copy File
-
- rtChangeReqAttr(filereq, RTFI_Dir,dir, TAG_END);
- }
- else
- file[0] = '\0';
-
- if ((rtFileRequest(filereq, (char *)&file, "Select a module/song",
- RT_ReqPos,REQPOS_CENTERSCR, RT_LockWindow,TRUE,
- RTFI_Flags,FREQF_PATGAD, TAG_END)))
- {
- strcpy((char *)&wholefile, ((struct rtFileRequester *)filereq)->Dir);
- AddPart((STRPTR)&wholefile, (STRPTR)&file, 216);
- GT_SetGadgetAttrs(strgad, win, NULL, GTST_String,wholefile, TAG_END);
- }
- }
-
- /********************************************************************
- * *
- * Show a reqtools requester. *
- * *
- ********************************************************************/
-
- void ShowRequest(char *text, ...)
- {
- rtEZRequestTags(text, "Okay", NULL, &text+1, // 1 Argument on the stack
- RT_LockWindow,TRUE, RTEZ_Flags,EZREQF_CENTERTEXT,
- TAG_END);
- }
-
- /********************************************************************
- * *
- * Create final module and save it. *
- * *
- ********************************************************************/
-
- void CreateMod (struct Window *win)
- {
- UBYTE UsedSamp[31] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- APTR SampPoi[31] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- char *destname;
- MODULE *destmod;
- UBYTE *destadr;
- struct CalcInfo cinfo;
- struct ModInfo minfo;
- APTR sleep;
- BPTR fh;
- BOOL err;
- int i;
-
- if (win != NULL)
- destname = ((struct StringInfo *)(our_gadgets[DestFileGad-1]->SpecialInfo))->Buffer;
- else
- destname = (char *)ArgList[49];
-
- err = TRUE;
- if (destname != NULL)
- if (destname[0] != '\0')
- err = FALSE;
-
- if (err)
- ShowRequest("You have to specify a destination filename");
- else
- {
- cinfo = CalculateIt(win);
- if (cinfo.Size != 0)
- {
- if (!(destmod = AllocMem(cinfo.Size, MEMF_PUBLIC|MEMF_CLEAR)))
- ShowRequest("Can't allocate %ld bytes of memory to the destination module",cinfo.Size);
- else
- {
- // Make songname out from destination filename
- if (win != NULL)
- sleep = rtLockWindow(win);
-
- stccpy(destmod->SongName, FilePart(destname), 20);
-
- // Create mark
- if (cinfo.Channels < 10)
- destmod->Mark = ((cinfo.Channels+48) << 24) | xchn;
- else
- destmod->Mark = ((((cinfo.Channels/10)+48) << 24) | (((cinfo.Channels%10)+48) << 16)) | xxch;
-
- // Create song positions
- for (i=0; i<cinfo.SongLen; i++)
- destmod->Positions[i] = i;
-
- // Fill other fields
- destmod->Pad = 127;
- destmod->SongLength = cinfo.SongLen;
-
- lpoi = 0;
- rpoi = 1;
-
- // Start to scan all the modules
- err = FALSE;
- for (i=0; i<8; i++)
- {
- if (Activated[i])
- {
- minfo = LoadModule(i, win);
- if (minfo.Module == NULL)
- {
- err = TRUE;
- break;
- }
- else
- {
- if (minfo.Size != minfo.CalcSize)
- if ((CopySample(&cinfo, &minfo, destmod, UsedSamp, SampPoi)) == FALSE)
- {
- err = TRUE;
- break;
- }
-
- CopyChannels(i, &cinfo, minfo.Module, destmod);
- FreeMem(minfo.Module, minfo.Size);
- }
- }
- }
-
- if (!err)
- {
- // Copy the samples into the destination module
- destadr = ((UBYTE *)destmod) + sizeof(MODULE) + ((cinfo.SongLen)*(cinfo.Channels*sizeof(CHANNEL)*64));
- for (i=0; i<31; i++)
- {
- if (destmod->Samples[i].Length != 0)
- {
- CopyMem(SampPoi[i], destadr, destmod->Samples[i].Length*2);
- destadr += destmod->Samples[i].Length*2;
- }
- if (i >= 29)
- CopyMem("#Register APlayer now\0",destmod->Samples[i].Name,22);
- }
-
- if (!(fh = Open(destname, MODE_NEWFILE)))
- ShowRequest("Can't open destination file");
- else
- {
- if (Write(fh, destmod, cinfo.Size) == -1)
- ShowRequest("Write error while saving module");
- Close(fh);
- }
- }
-
- FreeSamples(SampPoi, destmod);
- FreeMem(destmod, cinfo.Size);
- if (win != NULL)
- rtUnlockWindow(win, sleep);
- }
- }
- }
- }
-
- /********************************************************************
- * *
- * Copy sample names and data to destination module *
- * *
- ********************************************************************/
-
- int CopySample(struct CalcInfo *cinfo, struct ModInfo *minfo, MODULE *dmod, UBYTE *UsedSamp, APTR *SampPoi)
- {
- int i;
- int ssamstr = 0;
- SAMPLE *ssamp, *dsamp;
- MODULE *smod = minfo->Module;
-
- // Copy sample data
- ssamp = smod->Samples;
- dsamp = dmod->Samples;
- for (i=0 ; i<31 ; i++)
- {
- if (UsedSamp[i] == 0)
- if (ssamp[i].Length != 0)
- {
- UsedSamp[i] = TRUE;
- CopyMem(((UBYTE *)(ssamp+i)), ((UBYTE *)(dsamp+i)), sizeof(SAMPLE));
-
- if ((SampPoi[i] = AllocMem(ssamp[i].Length*2, MEMF_PUBLIC)) == NULL)
- {
- ShowRequest("Can't allocate %ld bytes of memory for a sample",ssamp[i].Length*2);
- return(FALSE);
- }
-
- CopyMem((((UBYTE *)smod) + sizeof(MODULE) + ((minfo->MaxPatt)*1024) + ssamstr),
- SampPoi[i], dsamp[i].Length*2);
- }
- ssamstr += ssamp[i].Length*2;
- }
- return(TRUE);
- }
-
- /********************************************************************
- * *
- * Free all the samples again. *
- * *
- ********************************************************************/
-
- void FreeSamples(APTR *SampPoi, MODULE *dmod)
- {
- int i;
-
- for (i=0; i<31; i++)
- if (SampPoi[i] != NULL)
- FreeMem(SampPoi[i], dmod->Samples[i].Length*2);
- }
-
- /********************************************************************
- * *
- * Copy pattern data. *
- * *
- ********************************************************************/
-
- void CopyChannels(int num, struct CalcInfo *cinfo, MODULE *smod, MODULE *dmod)
- {
- int cpoi;
- int c,i,j,k;
- CHANNEL *schan, *dchan;
-
- for (c=0; c<4; c++)
- {
- if (Chan[c][num] != 2)
- {
- if (Chan[c][num] == 0)
- {
- cpoi = lpoi;
- lpoi++;
- if ((lpoi%4) == 1)
- lpoi += 2;
- }
- else
- {
- cpoi = rpoi;
- rpoi++;
- if ((rpoi%4) == 3)
- rpoi += 2;
- }
-
- k = 0;
- do
- for (i=0; i<smod->SongLength; i++)
- {
- schan = ((CHANNEL *)(((UBYTE *)smod)+(((smod->Positions[i])*1024+sizeof(MODULE))))+c);
- dchan = ((CHANNEL *)(((UBYTE *)dmod)+((k*(cinfo->Channels*256)+sizeof(MODULE))))+cpoi);
-
- for (j=0; j<64; j++)
- dchan[j*cinfo->Channels] = schan[j*4];
-
- k++;
- }
- while ((k<cinfo->SongLen) && (Loop[num] == 1));
- }
- }
- }
-
- /********************************************************************
- * *
- * Calculate size etc. of the final module. *
- * *
- ********************************************************************/
-
- struct CalcInfo CalculateIt(struct Window *win)
- {
- struct ModInfo minfo;
- struct CalcInfo cinfo = {0,0,0,0};
- UBYTE UsedSamp[31] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- int i,j,c;
- BOOL song = FALSE, err = TRUE;
- UBYTE maxsonglen = 0;
- UBYTE maxpatt = 0;
- UBYTE lchan = 0;
- UBYTE rchan = 1;
- BYTE maxchan;
- int filesize = sizeof(MODULE);
- SAMPLE *samp;
- APTR sleep;
- char trktype[] = "Take";
- char infotxt[80];
-
- if (win != NULL)
- {
- sleep = rtLockWindow(win);
- GT_SetGadgetAttrs(our_gadgets[InfoGad-1], win, NULL, GTTX_Text,NULL, TAG_END);
- }
-
- for (i=0 ; i<64 ; i++)
- chantab[i] = 0;
-
- if (OneActive())
- {
- err = FALSE;
- i = 0;
- do
- {
- if (Activated[i])
- {
- minfo = LoadModule(i, win);
- if (minfo.Module == NULL)
- {
- err = TRUE;
- break;
- }
- else
- {
- if (minfo.Size != minfo.CalcSize)
- {
- // Add sample sizes to filesize
- song = TRUE;
- samp = minfo.Module->Samples;
- for (j=0; j<31; j++)
- {
- if (samp[j].Length != 0)
- if (UsedSamp[j] == 0)
- {
- UsedSamp[j] = TRUE;
- filesize += samp[j].Length*2;
- }
- }
- }
-
- if ((minfo.Module->SongLength) > maxsonglen)
- maxsonglen = minfo.Module->SongLength;
-
- if (minfo.MaxPatt > maxpatt)
- maxpatt = minfo.MaxPatt;
-
- FreeMem(minfo.Module, minfo.Size);
-
- for (c=0; c<4; c++)
- {
- if (Chan[c][i] == 0) // Left Channel
- {
- chantab[lchan] = 1;
- lchan++;
- if ((lchan%4) == 1)
- lchan += 2;
- }
- else
- if (Chan[c][i] == 1) // Right Channel
- {
- chantab[rchan] = 1;
- rchan++;
- if ((rchan%4) == 3)
- rchan += 2;
- }
- }
- }
- }
- i++;
- }
- while ((i<8) && (err == FALSE));
-
-
- for (maxchan=63; maxchan>=0; maxchan--)
- if (chantab[maxchan] == 1)
- break;
-
- maxchan++;
- filesize += (maxchan*sizeof(CHANNEL)*64)*maxsonglen;
-
- if (!(err))
- {
- if (!(song))
- {
- err = TRUE;
- ShowRequest("You have to select minimum one module");
- }
- else
- if (maxchan == 0)
- {
- err = TRUE;
- ShowRequest("You don't have any channels turned on");
- }
- else
- if (maxchan > 32)
- {
- err = TRUE;
- ShowRequest("You have selected %ld channels.\nYou can max use 32 channels",maxchan);
- }
- {
- if ((maxchan == 6) || (maxchan == 8))
- strcpy((char *)&trktype,"Fast");
-
- if (win != NULL)
- {
- FormatText((char *)&infotxt,"%2ld Channels %stracker %6ld bytes Patterns: %2ld SongLen: %3ld",maxchan,trktype,filesize,maxpatt,maxsonglen);
- GT_SetGadgetAttrs(our_gadgets[InfoGad-1], win, NULL, GTTX_Text,infotxt, TAG_END);
- }
- }
- }
- }
-
- if (win != NULL)
- rtUnlockWindow(win,sleep);
-
- if (!err)
- {
- cinfo.Size = filesize;
- cinfo.Channels = maxchan;
- cinfo.SongLen = maxsonglen;
- cinfo.MaxPatt = maxpatt;
-
- FormatText(outbuf,"%ld %ld %ld %ld",maxchan,filesize,maxpatt,maxsonglen);
- }
-
- return(cinfo);
- }
-
- /********************************************************************
- * *
- * Test to see if minimum one "file" is active. *
- * *
- ********************************************************************/
-
- int OneActive(void)
- {
- int num = 0;
- int i;
-
- for (i=0; i<8; i++)
- if (Activated[i])
- num++;
-
- if (num == 0)
- ShowRequest("You have to activate at least one module");
-
- return(num);
- }
-
- /********************************************************************
- * *
- * Load module into memory and calculate it's size. *
- * *
- ********************************************************************/
-
- struct ModInfo LoadModule(int num, struct Window *win)
- {
- struct ModInfo mi = {0, 0, NULL, 0};
- char *fname;
- BPTR fh;
- ULONG mark;
- UBYTE maxpos = 0;
- int i;
-
- if (win != NULL)
- fname = ((struct StringInfo *)(our_gadgets[File1Gad+num-1]->SpecialInfo))->Buffer;
- else
- fname = (char *)ArgList[num*6+1];
-
- if (fname[0] == '\0')
- ShowRequest("You have to specify a filename in row %ld\nor deactivate the row",num+1);
- else
- {
- if (!(fh = OpenFile(fname)))
- ShowRequest("Can't open file\n%s",fname);
- else
- {
- Seek(fh, 0, OFFSET_END);
- mi.Size = Seek(fh, 0, OFFSET_BEGINNING);
-
- if (mi.Size < sizeof(MODULE)+1024)
- ShowRequest("File %s is too small to be a Protracker module",fname);
- else
- {
- if (!(mi.Module = AllocMem(mi.Size, MEMF_PUBLIC|MEMF_CLEAR)))
- ShowRequest("Can't allocate %ld bytes of memory to the module",mi.Size);
- else
- {
- if ((Read(fh, mi.Module, mi.Size) == -1))
- {
- FreeMem(mi.Module, mi.Size);
- mi.Module = NULL;
- ShowRequest("Read error while reading file\n%s",fname);
- }
- else
- {
- // Test Mark to see if it's a Protracker module
- mark = (mi.Module->Mark);
- if (mark != m_k_)
- if (mark != M_K_)
- if (mark != m_K_)
- {
- FreeMem(mi.Module, mi.Size);
- mi.Module = NULL;
- ShowRequest("File %s isn't a Protracker module",fname);
- CloseFile(fh);
- return(mi);
- }
-
- // Begin to calculate module size
- for (i=0; i<sizeof(mi.Module->Positions); i++)
- if (mi.Module->Positions[i] > maxpos)
- maxpos = mi.Module->Positions[i];
-
- mi.MaxPatt = maxpos+1;
- mi.CalcSize = sizeof(MODULE)+mi.MaxPatt*1024;
- }
- }
- }
- CloseFile(fh);
- }
- }
-
- return(mi);
- }
-
- /********************************************************************
- * *
- * Open a file for reading and depack it if nessary. *
- * *
- ********************************************************************/
-
- BPTR OpenFile(char *name)
- {
- LONG err;
-
- if ((XpkBase = OpenLibrary("xpkmaster.library",0)))
- {
- err = XpkUnpackTags(XPK_InName,name, XPK_OutName,"T:Pro2Fast.depack",
- TAG_END);
-
- CloseLibrary(XpkBase);
-
- if (err != XPKERR_NOTPACKED)
- if (err)
- return(0);
- else
- return(Open("T:Pro2Fast.depack",MODE_OLDFILE));
- }
- return(Open(name,MODE_OLDFILE));
- }
-
- /********************************************************************
- * *
- * Close the file again and clean up. *
- * *
- ********************************************************************/
-
- void CloseFile(BPTR fh)
- {
- Close(fh);
- DeleteFile("T:Pro2Fast.depack");
- }
-
- /********************************************************************
- * *
- * Show about information. *
- * *
- ********************************************************************/
-
- void About(struct Screen *pubscr)
- {
- #define awidth 205
- #define aheight 155
-
- int left, top;
- struct BorderSize bs;
- struct Window *aboutwin;
- struct IntuiMessage *msg;
- BOOL done = FALSE;
-
- // Open the window
- bs = GetBorder(pubscr);
-
- left = (pubscr->Width - (bs.Left + bs.Right + awidth)) / 2;
- top = (pubscr->Height - (bs.Top + bs.Bottom + aheight)) / 2;
-
- if ((aboutwin = OpenWindowTags(NULL,WA_Left,left,WA_Top,top,
- WA_InnerWidth,awidth,WA_InnerHeight,aheight,
- WA_IDCMP,abo_idcmp,WA_AutoAdjust,TRUE,
- WA_Title,"About...",
- WA_PubScreen,pubscr,WA_PubScreenFallBack,TRUE,
- WA_DragBar,TRUE,WA_DepthGadget,TRUE,
- WA_RMBTrap,TRUE,
- WA_Activate,TRUE,WA_SmartRefresh,TRUE,
- TAG_END)))
-
- {
- DrawImage(aboutwin->RPort,&AboutPic,bs.Left,bs.Top);
-
- while (!done)
- {
- WaitPort(aboutwin->UserPort);
-
- while ((!done) && (msg = (struct IntuiMessage *)GetMsg(aboutwin->UserPort)))
- {
- switch (msg->Class)
- {
- case IDCMP_MOUSEBUTTONS:
- if (msg->Code == SELECTDOWN)
- done = TRUE;
- break;
-
- case IDCMP_VANILLAKEY:
- if (msg->Code == 13)
- done = TRUE;
- break;
- }
- }
- }
- CloseWindow(aboutwin);
- }
- }
-