Initial commit. master
authorBernie Innocenti <bernie@codewiz.org>
Fri, 11 Mar 2011 04:45:00 +0000 (23:45 -0500)
committerBernie Innocenti <bernie@codewiz.org>
Fri, 11 Mar 2011 04:45:00 +0000 (23:45 -0500)
113 files changed:
App.c [new file with mode: 0644]
App.h [new file with mode: 0644]
Audio.c [new file with mode: 0644]
Autodocs/songclass [new file with mode: 0644]
Autodocs/songclass.doc [new file with mode: 0644]
Autodocs/xmodule [new file with mode: 0644]
Autodocs/xmodule.doc [new file with mode: 0644]
BoopsiStubs.h [new file with mode: 0644]
Catalogs/HowToTranslate.doc [new file with mode: 0644]
Catalogs/Makefile [new file with mode: 0644]
Catalogs/deutsch.ct [new file with mode: 0644]
Catalogs/empty.ct [new file with mode: 0644]
Catalogs/français.ct [new file with mode: 0644]
Catalogs/italiano.ct [new file with mode: 0644]
Catalogs/nederlands.ct [new file with mode: 0644]
Catalogs/xmodule.cd [new file with mode: 0644]
ClearWin.c [new file with mode: 0644]
CompilerSpecific.h [new file with mode: 0644]
Compress.c [new file with mode: 0644]
CustomClasses.c [new file with mode: 0644]
CustomClasses.h [new file with mode: 0644]
Cx.c [new file with mode: 0644]
Debug.h [new file with mode: 0644]
FFT.c [new file with mode: 0644]
FakePlayer.asm [new file with mode: 0644]
Gadgets/Makefile [new file with mode: 0644]
Gadgets/PattEditClass.c [new file with mode: 0644]
Gadgets/PattEditClassAsm.asm [new file with mode: 0644]
Gadgets/SCOPTIONS [new file with mode: 0644]
Gadgets/SampEditClass.c [new file with mode: 0644]
Gadgets/pattedit.gadget [new file with mode: 0644]
Gst.c [new file with mode: 0644]
Gui.c [new file with mode: 0644]
Gui.h [new file with mode: 0644]
Guru.i [new file with mode: 0644]
Help.c [new file with mode: 0644]
Hooks/FastTracker2.h [new file with mode: 0644]
Hooks/GetFT2.c [new file with mode: 0644]
Hooks/MMDHook.c [new file with mode: 0644]
Hooks/Makefile [new file with mode: 0644]
Hooks/OctaMed.h [new file with mode: 0644]
Hooks/OktalyzerHook.c [new file with mode: 0644]
Hooks/SCOPTIONS [new file with mode: 0644]
Hooks/SaveMIDI.c [new file with mode: 0644]
Hooks/ScreamTrackerHook.c [new file with mode: 0644]
Hooks/oktalyzer.xmhook [new file with mode: 0644]
Hooks/screamtracker.xmhook [new file with mode: 0644]
Instr.c [new file with mode: 0644]
InstrumentsWin.c [new file with mode: 0644]
Library.c [new file with mode: 0644]
ListMacros.h [new file with mode: 0644]
Locale.c [new file with mode: 0644]
LocaleStrings.h [new file with mode: 0644]
LocaleStrings_h.sd [new file with mode: 0644]
Locale_c.sd [new file with mode: 0644]
Main.c [new file with mode: 0644]
Makefile [new file with mode: 0644]
Misc.c [new file with mode: 0644]
Operators.c [new file with mode: 0644]
OptimizationWin.c [new file with mode: 0644]
OptimizationWin.s [new file with mode: 0644]
PattPrefsWin.c [new file with mode: 0644]
PatternWin.c [new file with mode: 0644]
PlayWin.c [new file with mode: 0644]
Player.asm [new file with mode: 0644]
Player.h [new file with mode: 0644]
Player.i [new file with mode: 0644]
Players/32Channels.player [new file with mode: 0644]
Prefs.c [new file with mode: 0644]
PrefsWin.c [new file with mode: 0644]
ProgressWin.c [new file with mode: 0644]
Requesters.c [new file with mode: 0644]
Requesters.h [new file with mode: 0644]
Rexx.c [new file with mode: 0644]
RomTag.asm [new file with mode: 0644]
SCOPTIONS [new file with mode: 0644]
SampleWin.c [new file with mode: 0644]
SaversWin.c [new file with mode: 0644]
SequenceWin.c [new file with mode: 0644]
SongClass.c [new file with mode: 0644]
SongClass.i [new file with mode: 0644]
SongInfoWin.c [new file with mode: 0644]
Startup.asm [new file with mode: 0644]
ToolBoxWin.c [new file with mode: 0644]
TrackerHook.c [new file with mode: 0644]
XModule [new file with mode: 0644]
XModule.i [new file with mode: 0644]
XModule.info [new file with mode: 0644]
XModule.prefs [new file with mode: 0644]
XModuleHook.c [new file with mode: 0644]
XModulePriv.h [new file with mode: 0644]
XModule_final.c [new file with mode: 0644]
XModule_rev.h [new file with mode: 0644]
XModule_rev.rev [new file with mode: 0644]
config.mk [new file with mode: 0644]
delta.asm [new file with mode: 0644]
include/clib/xmodule_protos.h [new file with mode: 0644]
include/libraries/patteditclass.h [new file with mode: 0644]
include/libraries/sampeditclass.h [new file with mode: 0644]
include/libraries/songclass.h [new file with mode: 0644]
include/libraries/songclass.i [new file with mode: 0644]
include/libraries/xmodule.h [new file with mode: 0644]
include/libraries/xmodule.i [new file with mode: 0644]
include/libraries/xmodule_lib.i [new file with mode: 0644]
include/libraries/xmoduleclass.h [new file with mode: 0644]
include/pragmas/xmodule_pragmas.h [new file with mode: 0644]
include/proto/xmodule.h [new file with mode: 0644]
manuals/HISTORY [new file with mode: 0644]
manuals/Makefile [new file with mode: 0644]
manuals/README [new file with mode: 0644]
manuals/TODO [new file with mode: 0644]
manuals/XModule.texi [new file with mode: 0644]
xmodule_lib.fd [new file with mode: 0644]

diff --git a/App.c b/App.c
new file mode 100644 (file)
index 0000000..bee18e7
--- /dev/null
+++ b/App.c
@@ -0,0 +1,184 @@
+/*
+**     App.c
+**
+**     Copyright (C) 1994,95,96 by Bernardo Innocenti
+**
+**     Handle AppIcons & AppWindows
+*/
+
+#include <exec/memory.h>
+#include <workbench/workbench.h>
+
+#include <proto/exec.h>
+#include <proto/dos.h>
+#include <proto/intuition.h>
+#include <proto/wb.h>
+#include <proto/icon.h>
+
+#include "XModulePriv.h"
+#include "Gui.h"
+
+
+XDEF ULONG     AppSig = 0;
+XDEF LONG      IconX = NO_ICON_POSITION;
+XDEF LONG      IconY = NO_ICON_POSITION;
+XDEF UBYTE     IconName[16];
+XDEF BOOL      Iconified = FALSE;
+
+
+static struct MsgPort          *AppPort        = NULL;
+static struct AppIcon          *MyAppIcon      = NULL;
+static struct DiskObject       *AppDObj        = NULL;
+
+
+
+GLOBALCALL void HandleAppMessage (void)
+
+/* App Window event handler.  Get Workbench message and call server */
+{
+       struct AppMessage *am;
+
+       while (am = (struct AppMessage *) GetMsg (AppPort))
+       {
+               switch (am->am_Type)
+               {
+                       case AMTYPE_APPWINDOW:
+                               (((struct WinUserData *) am->am_UserData)->DropIcon) (am);
+                               break;
+
+                       case AMTYPE_APPICON:
+                               if (am->am_NumArgs == 0)
+                                       DeIconify();
+                               else if (am->am_UserData)
+                                       ((void (*) (struct AppMessage *am))(am->am_UserData)) (am);
+
+                               break;
+
+                       default:
+                               break;
+               }
+
+               ReplyMsg ((struct Message *) am);
+       }
+}
+
+
+
+GLOBALCALL void AddAppWin (struct WinUserData *wud)
+{
+       wud->AppWin = AddAppWindowA (0, (ULONG)wud, wud->Win, AppPort, NULL);
+}
+
+
+
+GLOBALCALL void RemAppWin (struct WinUserData *wud)
+{
+       struct Node             *succ;
+       struct Message  *msg;
+
+       RemoveAppWindow (wud->AppWin);
+       wud->AppWin = NULL;
+
+       /* Reply all pending messages for this window */
+
+       Forbid();
+
+       msg = (struct Message *) AppPort->mp_MsgList.lh_Head;
+
+       while (succ = msg->mn_Node.ln_Succ)
+       {
+               if ((struct WinUserData *)(((struct AppMessage *)msg)->am_UserData) == wud)
+               {
+                       Remove ((struct Node *)msg);
+                       ReplyMsg (msg);
+               }
+               msg = (struct Message *) succ;
+       }
+
+       Permit();
+}
+
+
+
+GLOBALCALL LONG CreateAppIcon (void (*handler) (struct AppMessage *am))
+{
+       if (!AppPort) return RETURN_FAIL;
+
+       if (MyAppIcon) return RETURN_OK;
+
+       /* Get icon */
+       if ( !(AppDObj = GetProgramIcon() ))
+               AppDObj = GetDefDiskObject (WBTOOL);
+
+       if (!AppDObj) return RETURN_FAIL;
+
+       /* Initialize AppIcon */
+       AppDObj->do_CurrentX = IconX;
+       AppDObj->do_CurrentY = IconY;
+
+       if (MyAppIcon = AddAppIconA (0, (ULONG)handler, IconName, AppPort, NULL, AppDObj, NULL))
+               return RETURN_OK;
+
+       FreeDiskObject (AppDObj); AppDObj = NULL;
+       return RETURN_FAIL;
+}
+
+
+
+GLOBALCALL void DeleteAppIcon (void)
+{
+       if (MyAppIcon)
+       {
+               RemoveAppIcon (MyAppIcon); MyAppIcon = NULL;
+               FreeDiskObject (AppDObj); AppDObj = NULL;
+       }
+}
+
+
+
+GLOBALCALL void Iconify (void)
+{
+       if (!CreateAppIcon (ToolBoxDropIcon))
+       {
+               CloseDownScreen();
+               Iconified = TRUE;
+       }
+}
+
+
+
+GLOBALCALL void DeIconify (void)
+{
+       if (!SetupScreen())
+       {
+               Iconified = FALSE;
+               if (!GuiSwitches.ShowAppIcon) DeleteAppIcon();
+       }
+}
+
+
+GLOBALCALL LONG SetupApp (void)
+{
+       if (!(AppPort = CreateMsgPort()))
+               return ERROR_NO_FREE_STORE;
+       AppSig = 1 << AppPort->mp_SigBit;
+       Signals |= AppSig;
+
+       if (GuiSwitches.ShowAppIcon)
+               CreateAppIcon (ToolBoxDropIcon);
+
+       return RETURN_OK;
+}
+
+
+
+GLOBALCALL void CleanupApp (void)
+{
+       if (AppPort)
+       {
+               DeleteAppIcon();
+
+               KillMsgPort (AppPort); AppPort = NULL;
+               Signals &= ~AppSig; AppSig = 0;
+       }
+}
diff --git a/App.h b/App.h
new file mode 100644 (file)
index 0000000..f6c7409
--- /dev/null
+++ b/App.h
@@ -0,0 +1,17 @@
+/*
+**     $Id:$
+**
+**     Copyright (C) 1993,94,95,96,98,99 by Bernardo Innocenti
+**
+**     AppWindow support functions.
+*/
+
+GLOBALCALL void                HandleAppMessage                (void);
+GLOBALCALL void                AddAppWin                               (struct WinUserData *wud);
+GLOBALCALL void                RemAppWin                               (struct WinUserData *wud);
+GLOBALCALL LONG                CreateAppIcon                   (void (*handler) (struct AppMessage *am));
+GLOBALCALL void                DeleteAppIcon                   (void);
+GLOBALCALL void                Iconify                                 (void);
+GLOBALCALL void                DeIconify                               (void);
+GLOBALCALL LONG                SetupApp                                (void);
+GLOBALCALL void                CleanupApp                              (void);
diff --git a/Audio.c b/Audio.c
new file mode 100644 (file)
index 0000000..fc65a8b
--- /dev/null
+++ b/Audio.c
@@ -0,0 +1,532 @@
+/*
+**     Audio.c
+**
+**     Copyright (C) 1994,95 by Bernardo Innocenti
+**
+**     audio.device interface routines.
+**
+**
+**     A separate Process gets the AudioMsg messages from its pr_MsgPort
+**     and dialogues with audio.device.  Once executed, the AudioMsg's are
+**     replied to the AudioReply port, and the main program frees them.
+**     Each IOAudio request has a special USERDATA field which points back
+**     to the original AudioMsg structure.  This way it is possible to easly
+**     track the status of each command being executed.
+**
+**     +------------+                +-------------+               +------------+
+**     |Main Process|<-->AudioMsg<-->|Audio Process|<-->IOAudio<-->|audio.device|
+**     +------------+                +-------------+               +------------+
+*/
+
+#include <exec/memory.h>
+#include <devices/audio.h>
+#include <dos/dos.h>
+#include <dos/dostags.h>
+
+#include <proto/exec.h>
+#include <proto/dos.h>
+
+#include "XModulePriv.h"
+#include "Gui.h"
+
+
+
+/* This is the (maximum) size of sample chunks sent to the audio.device */
+
+#define SAMPBUFSIZE            16768
+#define MAXAUDIOSIZE   65534
+
+/* Get/store pointer to original AudioMsg into an extended IOAudio structure */
+
+#define AUDIOUSERDATA(ioa) (*((struct AudioMsg **)(((struct IOAudio *)ioa) + 1)))
+
+
+struct AudioMsg
+{
+       struct Message am_Message;
+       void *am_Data;
+       UBYTE am_Command;
+       UBYTE am_Error;
+       UWORD am_Status;
+       ULONG am_Len;
+       ULONG am_Actual;
+       UWORD am_Per;
+       UWORD am_Vol;
+       BYTE *am_TmpBuf[2];
+       struct IOAudio *am_IOA[2];
+};
+
+
+/* Values for AudioMsg->am_Command */
+#define ACMD_PLAY_SAMPLE       1       /* am_Data points to 8 bit sample data                  */
+#define ACMD_PLAY_INSTR                1       /* am_Data points to an Instrument structure    */
+
+
+
+/* Local functions prototypes */
+
+static void            ReplyAudioMsg   (struct AudioMsg *am);
+static void            _PlaySample             (struct AudioMsg *am);
+static UWORD   FindFreeChannel (void);
+static ULONG   AllocChannels   (void);
+static void            FreeChannels    (void);
+
+
+
+/* Local data */
+
+static struct Process *AudioTask = NULL;
+/* Audio IO requests.  Two for each channel (double buffer). */
+static struct IOAudio *AudioReq[4][2] = { 0 };
+static struct MsgPort *AudioReply = NULL;
+
+
+
+/* Global data */
+
+XDEF ULONG AudioSig = 0;
+
+
+
+HOOKCALL static void AudioProcess (void)
+{
+       ULONG audiosig, cmdsig, recsig, signals, err = 0;
+       LONG i, j;
+       struct IOAudio *ioa;
+       struct AudioMsg *am;
+       struct MsgPort *AudioPort;      /* Audio reply port */
+
+
+       struct Process *thistask = (struct Process *)FindTask (NULL);
+
+       if (AudioPort = CreateMsgPort())
+       {
+               /* Create IOAudio requests */
+
+               for (i = 0; i < 4 ; i++)
+                       for (j = 0; j < 2; j++)
+                               if (!(AudioReq[i][j] = (struct IOAudio *)CreateIORequest (AudioPort, sizeof (struct IOAudio) + 4)))
+                                       err = ERROR_NO_FREE_STORE;
+
+               if (!err)
+               {
+                       /* Open audio.device */
+                       if (!(err = OpenDevice ("audio.device", 0, (struct IORequest *)AudioReq[0][0], 0)))
+                               err = AllocChannels();
+               }
+       }
+       else err = ERROR_NO_FREE_STORE;
+
+
+       /* Wait for startup message */
+
+       WaitPort (&thistask->pr_MsgPort);
+       am = (struct AudioMsg *) GetMsg (&thistask->pr_MsgPort);
+
+       /* Reply startup message */
+       am->am_Error = err;
+       ReplyMsg ((struct Message *)am);
+
+       if (err)
+       {
+               Wait (SIGBREAKF_CTRL_C);
+               goto exit;
+       }
+
+       cmdsig = 1 << thistask->pr_MsgPort.mp_SigBit;
+       audiosig = 1 << AudioPort->mp_SigBit;
+
+       signals = cmdsig | audiosig | SIGBREAKF_CTRL_C;
+
+       do
+       {
+               recsig = Wait (signals);
+
+               if (recsig & audiosig)
+               {
+                       /* Collect previously sent requests */
+                       while (ioa = (struct IOAudio *) GetMsg (AudioPort))
+                       {
+                               if (am = AUDIOUSERDATA (ioa))
+                               {
+                                       if (am->am_Actual < am->am_Len)
+                                       {
+                                               BYTE *samp;
+                                               ULONG len;
+
+                                               if (am->am_TmpBuf[am->am_Status])
+                                               {
+                                                       len = min (SAMPBUFSIZE, am->am_Len - am->am_Actual);
+                                                       samp = am->am_TmpBuf[am->am_Status];
+                                                       CopyMem (((BYTE *)am->am_Data) + am->am_Actual, samp, len);
+                                               }
+                                               else
+                                               {
+                                                       samp = ((BYTE *)am->am_Data) + am->am_Actual;
+                                                       len = min (MAXAUDIOSIZE, am->am_Len - am->am_Actual);
+                                               }
+
+                                               /**/ioa->io_Command = CMD_WRITE;
+                                               /**/ioa->io_Flags = ADIOF_PERVOL;
+                                               ioa->ioa_Data = samp;
+                                               ioa->ioa_Length = len;
+                                               /**/ioa->ioa_Period = am->am_Per;
+                                               /**/ioa->ioa_Volume = am->am_Vol;
+                                               /**/ioa->ioa_Cycles = 1;
+
+                                               BeginIO ((struct IORequest *)ioa);
+                                               am->am_Actual += len;
+                                               am->am_Status ^= 1;
+                                       }
+                                       else
+                                       {
+                                               am = AUDIOUSERDATA(ioa);
+                                               AUDIOUSERDATA(am->am_IOA[0]) = NULL;
+                                               AUDIOUSERDATA(am->am_IOA[1]) = NULL;
+                                               ReplyAudioMsg (am);
+                                       }
+                               }
+                       }
+               }
+
+
+               if (recsig & cmdsig)
+               {
+                       /* Get Command and execute it */
+                       while (am = (struct AudioMsg *)GetMsg (&thistask->pr_MsgPort))
+                       {
+                               switch (am->am_Command)
+                               {
+                                       case ACMD_PLAY_SAMPLE:
+                                               _PlaySample (am);
+                                               break;
+
+                                       default:
+                                               break;
+                               }
+                       }
+               }
+       }
+       while (!(recsig & SIGBREAKF_CTRL_C));
+
+
+
+exit:
+
+       if (AudioPort)
+       {
+               FreeChannels();
+
+               for (i = 3; i >= 0 ; i--)
+                       for (j = 1; j >= 0; j--)
+                               if (AudioReq[i][j])
+                               {
+                                       if ((j == 0) && (AudioReq[i][j]->io_Device))
+                                       {
+                                               if (am = AUDIOUSERDATA(AudioReq[i][j]))
+                                                       ReplyAudioMsg (am);
+
+                                               if (i == 0)
+                                                       CloseDevice ((struct IORequest *)AudioReq[0][0]);
+                                       }
+                                       DeleteIORequest ((struct IORequest *)AudioReq[i][j]); AudioReq[i][j] = NULL;
+                               }
+
+               DeleteMsgPort (AudioPort);
+       }
+
+       /* Signal that we are done.
+        * We Forbid() here to avoid being unloaded until exit.
+        */
+       Forbid();
+       Signal ((struct Task *)ThisTask, SIGF_SINGLE);
+}
+
+
+
+static void ReplyAudioMsg (struct AudioMsg *am)
+{
+       FreeVec (am->am_TmpBuf[0]);
+       FreeVec (am->am_TmpBuf[1]);
+       AUDIOUSERDATA(am->am_IOA[0]) = NULL;
+       AUDIOUSERDATA(am->am_IOA[1]) = NULL;
+       ReplyMsg ((struct Message *)am);
+}
+
+
+
+static void _PlaySample (struct AudioMsg *am)
+{
+       BYTE *samp = am->am_Data;
+       ULONG len = am->am_Len;
+       ULONG ch = FindFreeChannel ();
+       BOOL multi = FALSE, transfer = FALSE;
+
+       am->am_TmpBuf[0] = NULL;
+       am->am_TmpBuf[1] = NULL;
+       am->am_Status = 0;
+       am->am_IOA[0] = AudioReq[ch][0];
+       am->am_IOA[1] = AudioReq[ch][1];
+
+       if (!(TypeOfMem (samp) & MEMF_CHIP))
+               transfer = TRUE;
+
+       if (am->am_Len > MAXAUDIOSIZE)
+       {
+               multi = TRUE;
+               if (transfer)
+                       len = SAMPBUFSIZE;
+               else
+                       len = MAXAUDIOSIZE;
+       }
+
+       if (transfer)
+               if (am->am_TmpBuf[0] = AllocVec (len, MEMF_CHIP))
+               {
+                       CopyMem (samp, am->am_TmpBuf[0], len);
+                       samp = am->am_TmpBuf[0];
+               }
+               else return;
+
+       am->am_IOA[0]->io_Command = CMD_WRITE;
+       am->am_IOA[0]->io_Flags = ADIOF_PERVOL;
+       am->am_IOA[0]->ioa_Data = samp;
+       am->am_IOA[0]->ioa_Length = len;
+       am->am_IOA[0]->ioa_Period = am->am_Per;
+       am->am_IOA[0]->ioa_Volume = am->am_Vol;
+       am->am_IOA[0]->ioa_Cycles = 1;
+       AUDIOUSERDATA(am->am_IOA[0]) = am;
+
+       BeginIO ((struct IORequest *)am->am_IOA[0]);
+       am->am_Actual = len;
+
+       if (multi)
+       {
+               samp += len;
+
+               if (transfer)
+               {
+                       len = min(SAMPBUFSIZE, am->am_Len - SAMPBUFSIZE);
+
+                       if (am->am_TmpBuf[1] = AllocVec (len, MEMF_CHIP))
+                       {
+                               CopyMem (samp, am->am_TmpBuf[1], len);
+                               samp = am->am_TmpBuf[1];
+                       }
+                       else return;
+               }
+               else len = min (MAXAUDIOSIZE, am->am_Len - MAXAUDIOSIZE);
+
+               am->am_IOA[1]->io_Command = CMD_WRITE;
+               am->am_IOA[1]->io_Flags = ADIOF_PERVOL;
+               am->am_IOA[1]->ioa_Data = samp;
+               am->am_IOA[1]->ioa_Length = len;
+               am->am_IOA[1]->ioa_Period = am->am_Per;
+               am->am_IOA[1]->ioa_Volume = am->am_Vol;
+               am->am_IOA[1]->ioa_Cycles = 1;
+               AUDIOUSERDATA(am->am_IOA[1]) = am;
+
+               BeginIO ((struct IORequest *)am->am_IOA[1]);
+               am->am_Actual += len;
+       }
+}
+
+
+
+GLOBALCALL void HandleAudio (void)
+{
+       struct Message *msg;
+
+       while (msg = GetMsg (AudioReply))
+               FreeMem (msg, sizeof (struct AudioMsg));
+}
+
+
+
+GLOBALCALL void PlaySample (BYTE *samp, ULONG len, UWORD vol, UWORD per)
+{
+       struct AudioMsg *am;
+
+       if (!samp) return;
+
+       if (!AudioTask)
+               if (SetupAudio()) return;
+
+       if (!(am = AllocMem (sizeof (struct AudioMsg), MEMF_PUBLIC)))
+               return;
+
+       am->am_Message.mn_ReplyPort = AudioReply;
+       am->am_Command = ACMD_PLAY_SAMPLE;
+
+       am->am_Data = samp;
+       am->am_Len = len;
+       am->am_Vol = vol;
+       am->am_Per = per;
+
+       PutMsg (&AudioTask->pr_MsgPort, (struct Message *)am);
+}
+
+
+
+static UWORD FindFreeChannel (void)
+{
+       UWORD ch;
+
+       for (ch = 0; ch < 4 ; ch++)
+               if (CheckIO ((struct IORequest *)AudioReq[ch][0]) &&
+                       CheckIO ((struct IORequest *)AudioReq[ch][1]))
+                       return ch;
+
+       {
+               struct AudioMsg *am;
+
+               AbortIO ((struct IORequest *)AudioReq[0][0]);
+               AbortIO ((struct IORequest *)AudioReq[0][1]);
+               WaitIO ((struct IORequest *)AudioReq[0][0]);
+               WaitIO ((struct IORequest *)AudioReq[0][1]);
+
+               if (am = AUDIOUSERDATA(AudioReq[0][0]))
+               {
+                       ReplyAudioMsg (am);
+                       AUDIOUSERDATA(AudioReq[0][0]) = NULL;
+                       AUDIOUSERDATA(AudioReq[0][1]) = NULL;
+               }
+       }
+
+       return 0;
+}
+
+
+static ULONG AllocChannels (void)
+{
+       struct IOAudio *ioa;
+       ULONG i;
+
+       /* Allocate channels */
+
+       for (i = 0 ; i < 4; i++)
+       {
+               static UBYTE channels[] = {1, 2, 4, 8};
+
+               ioa = AudioReq[i][0];
+
+               ioa->ioa_Request.ln_Pri = 1;
+               ioa->io_Device = AudioReq[0][0]->io_Device;
+               ioa->io_Command = ADCMD_ALLOCATE;
+               ioa->io_Flags = ADIOF_NOWAIT | IOF_QUICK;
+               ioa->ioa_AllocKey = AudioReq[0][0]->ioa_AllocKey;
+               ioa->ioa_Data = channels;
+               ioa->ioa_Length = 4;
+
+               /* Using DoIO() here is not possible because the
+                * io_Flags field would be cleared.
+                */
+               BeginIO ((struct IORequest *)ioa);
+               WaitIO ((struct IORequest *)ioa);
+
+               /* Initailize other request */
+               CopyMem (ioa, AudioReq[i][1], sizeof (struct IOAudio));
+
+               if (ioa->io_Error)
+                       return ioa->io_Error;
+       }
+
+       return RETURN_OK;
+}
+
+
+
+static void FreeChannels (void)
+{
+       LONG i;
+
+       for (i = 3; i >= 0; i--)
+       {
+               if (AudioReq[i][0])
+               {
+                       AbortIO ((struct IORequest *)AudioReq[i][0]);
+                       WaitIO ((struct IORequest *)AudioReq[i][0]);
+
+                       if (AudioReq[i][1])
+                       {
+                               AbortIO ((struct IORequest *)AudioReq[i][1]);
+                               WaitIO ((struct IORequest *)AudioReq[i][1]);
+                       }
+
+                       AudioReq[i][0]->io_Command = ADCMD_FREE;
+                       DoIO ((struct IORequest *)AudioReq[i][0]);
+               }
+       }
+}
+
+
+
+GLOBALCALL ULONG SetupAudio (void)
+{
+       struct AudioMsg audiomsg;
+
+       if (!(AudioReply = CreateMsgPort ()))
+               return ERROR_NO_FREE_STORE;
+
+       AudioSig = 1 << AudioReply->mp_SigBit;
+       Signals |= AudioSig;
+
+       /* Create Audio Process */
+       if (!(AudioTask = CreateNewProcTags (
+               NP_Entry,               AudioProcess,
+               NP_Name,                "XModule Audio Process",
+               NP_WindowPtr,   ThisTask->pr_WindowPtr,
+               NP_Priority,    15,
+               NP_CopyVars,    FALSE,
+               // NP_Input,    NULL,
+               // NP_Output,   NULL,
+               // NP_Error,    NULL,
+               TAG_DONE)))
+       {
+               CleanupAudio();
+               return ERROR_NO_FREE_STORE;
+       }
+
+
+       /* Send Startup Message */
+
+       audiomsg.am_Message.mn_ReplyPort = AudioReply;
+       PutMsg (&(AudioTask->pr_MsgPort), (struct Message *)&audiomsg);
+       WaitPort (AudioReply);
+       GetMsg (AudioReply);
+
+       if (audiomsg.am_Error)
+       {
+               CleanupAudio();
+               return (audiomsg.am_Error);
+       }
+
+       return RETURN_OK;
+}
+
+
+
+GLOBALCALL void CleanupAudio (void)
+{
+       if (AudioTask)
+       {
+               /* Tell audio task to give up */
+               SetSignal (0, SIGF_SINGLE);
+               Signal ((struct Task *)AudioTask, SIGBREAKF_CTRL_C);
+
+               /* Wait until the audio task quits */
+               Wait (SIGF_SINGLE);
+               AudioTask = NULL;
+       }
+
+       if (AudioReply)
+       {
+               struct Message *msg;
+
+               while (msg = GetMsg (AudioReply))
+                       FreeMem (msg, sizeof (struct AudioMsg));
+
+               DeleteMsgPort (AudioReply); AudioReply = NULL;
+               Signals &= ~AudioSig; AudioSig = 0;
+       }
+}
diff --git a/Autodocs/songclass b/Autodocs/songclass
new file mode 100644 (file)
index 0000000..8541f95
--- /dev/null
@@ -0,0 +1,57 @@
+@DATABASE "songclass"
+@MASTER   "Work:SC/XM/Autodocs/songclass.doc"
+@REMARK   This file was created by ADtoHT 2.1 on 08-Apr-97 12:17:15
+@REMARK   Do not edit
+@REMARK   ADtoHT is © 1993-1995 Christian Stieber
+
+@NODE MAIN "songclass.doc"
+
+                                  @{b}songclass@{ub}
+
+@{"background" LINK "background"}
+
+
+@ENDNODE
+@NODE "background" "songclass/background (information)"
+
+
+    NAME
+        songclass -- XModule 'boopsi'-oriented song implementation.
+
+    DESCRIPTION
+        The song class is an object oriented way to handle a song.  The song
+        class handles all data storing mechanisms for you and adds a layer
+        of abstraction between the song internal data structures and the
+        application.  The advantage is that the internal structures can be
+        changed while keeping compatibility with existing software.
+
+        Another great advantage of being a 'boopsi' class is that the song
+        can notify other boopsi objects whenever its attributes change.
+        This simplifies the task of keeping the user interface updated each
+        time the user (or an ARexx macro, or whatever) changes something.
+
+        For speed reasons, the song class does also allow 'white box'
+        istance access.  This means that you can also directly access
+        the internal data structures of the song, without using standard
+        boopsi methods.  You are ONLY allowed to READ public fields, but not
+        to write any of them.  The main reason to forbid direct writing is
+        that the song class must send notifications to its targets, but it
+        does also allow the song implementation to change in future version
+        without breaking existing applications.
+
+        When you create a new istance of the song class, the object handle
+        you get is actually a SongInfo structure.  This is only possible
+        because the song class is a subclass of the rootclass, whose istance
+        is placed at a negative offset in the object handle.
+        Future song class implementations could require to be subclasses
+        of other classes, such as the gadget class or even the datatypes
+        class.  This problem will be probably got around by keeping the
+        root class as the real superclass of the song and creating an
+        istance of the other superclass which will be passed all the
+        methods which are not recognized by the song its-self.  Call this
+        boopsi polymorphism, if you like to :-)
+
+    QUOTATION
+        Don't be a tuna head.
+
+@ENDNODE
diff --git a/Autodocs/songclass.doc b/Autodocs/songclass.doc
new file mode 100644 (file)
index 0000000..7259095
--- /dev/null
@@ -0,0 +1,45 @@
+TABLE OF CONTENTS
+
+songclass/--background--
+\fsongclass/--background--                             songclass/--background--
+
+    NAME
+        songclass -- XModule 'boopsi'-oriented song implementation.
+
+    DESCRIPTION
+        The song class is an object oriented way to handle a song.  The song
+        class handles all data storing mechanisms for you and adds a layer
+        of abstraction between the song internal data structures and the
+        application.  The advantage is that the internal structures can be
+        changed while keeping compatibility with existing software.
+
+        Another great advantage of being a 'boopsi' class is that the song
+        can notify other boopsi objects whenever its attributes change.
+        This simplifies the task of keeping the user interface updated each
+        time the user (or an ARexx macro, or whatever) changes something.
+
+        For speed reasons, the song class does also allow 'white box'
+        istance access.  This means that you can also directly access
+        the internal data structures of the song, without using standard
+        boopsi methods.  You are ONLY allowed to READ public fields, but not
+        to write any of them.  The main reason to forbid direct writing is
+        that the song class must send notifications to its targets, but it
+        does also allow the song implementation to change in future version
+        without breaking existing applications.
+
+        When you create a new istance of the song class, the object handle
+        you get is actually a SongInfo structure.  This is only possible
+        because the song class is a subclass of the rootclass, whose istance
+        is placed at a negative offset in the object handle.
+        Future song class implementations could require to be subclasses
+        of other classes, such as the gadget class or even the datatypes
+        class.  This problem will be probably got around by keeping the
+        root class as the real superclass of the song and creating an
+        istance of the other superclass which will be passed all the
+        methods which are not recognized by the song its-self.  Call this
+        boopsi polymorphism, if you like to :-)
+
+    QUOTATION
+        Don't be a tuna head.
+
+\f
\ No newline at end of file
diff --git a/Autodocs/xmodule b/Autodocs/xmodule
new file mode 100644 (file)
index 0000000..b9a3e4c
--- /dev/null
@@ -0,0 +1,1090 @@
+@DATABASE "xmodule"
+@MASTER   "Work:SC/XM/Autodocs/xmodule.doc"
+@REMARK   This file was created by ADtoHT 2.1 on 08-Apr-97 12:17:15
+@REMARK   Do not edit
+@REMARK   ADtoHT is © 1993-1995 Christian Stieber
+
+@NODE MAIN "xmodule.doc"
+
+                                   @{b}xmodule@{ub}
+
+@{"background" LINK "background"}
+
+@{"xmActivateSong()" LINK "xmActivateSong"}    @{"xmAddHook()" LINK "xmAddHook"}          @{"xmAddHookA()" LINK "xmAddHook"}
+@{"xmAddInstrument()" LINK "xmAddInstrumentA"}   @{"xmAddInstrumentA()" LINK "xmAddInstrumentA"}   @{"xmAddPattern()" LINK "xmAddPatternA"}
+@{"xmAddPatternA()" LINK "xmAddPatternA"}     @{"xmAddSong()" LINK "xmAddSongA"}          @{"xmAddSongA()" LINK "xmAddSongA"}
+@{"xmCreateSong()" LINK "xmCreateSong"}      @{"xmCreateSongA()" LINK "xmCreateSong"}      @{"xmDeleteSong()" LINK "xmDeleteSong"}
+@{"xmDisplayMessage()" LINK "xmDisplayMessage"}  @{"xmDisplayMessageA()" LINK "xmDisplayMessage"}  @{"xmDisplayProgress()" LINK "xmDisplayProgress"}
+@{"xmIdentifyModule()" LINK "xmIdentifyModule"}  @{"xmLoadModule()" LINK "xmLoadModuleA"}       @{"xmLoadModuleA()" LINK "xmLoadModuleA"}
+@{"xmLockActiveSong()" LINK "xmLockActiveSong"}  @{"xmProcessSong()" LINK "xmProcessSongA"}      @{"xmProcessSongA()" LINK "xmProcessSongA"}
+@{"xmRemHook()" LINK "xmRemHook"}         @{"xmRemHookA()" LINK "xmRemHook"}         @{"xmRemInstrument()" LINK "xmRemInstrument"}
+@{"xmRemPattern()" LINK "xmRemPattern"}      @{"xmRemSong()" LINK "xmRemSong"}          @{"xmSaveModule()" LINK "xmSaveModuleA"}
+@{"xmSaveModuleA()" LINK "xmSaveModuleA"}     @{"xmSetInstrument()" LINK "xmSetInstrumentA"}    @{"xmSetInstrumentA()" LINK "xmSetInstrumentA"}
+@{"xmSetPattern()" LINK "xmSetPatternA"}      @{"xmSetPatternA()" LINK "xmSetPatternA"}      @{"xmSetSongLen()" LINK "xmSetSongLen"}
+
+@ENDNODE
+@NODE "background" "xmodule/background (information)"
+
+
+    INTRODUCTION
+        The xmodule.library is an API that provides access to the XModule
+        song management engine, as well as other general pourpose
+        services.  Hooks and external applications can use this library
+        to create, load, save and modify songs.
+
+        The xmodule.library does not exist as a stand alone shared libray.
+        Instead, it's code is contained inside the main XModule executable
+        (altrough it's logically independant from the rest of the XModule
+        code).
+
+        XModule adds the xmodule.library to the exec libray list at
+        startup time, unless it finds one already in the list (this might
+        happen when multiple copies of XModule are running at the same
+        time).
+
+    PUBLIC SONGS
+        The xmodule.library maintains a list of public songs which can be
+        used by all applications which opened the library.  Each song in
+        the list is protected from multiple task access by a
+        SignalSemaphore, and whole list is also protected by another
+        semaphore.  The locking mechanism is very simple: before you can
+        access a song you must obtain its semaphore, and you must release
+        it as soon as you are done with it.  If you are locking a song to
+        just to read some information (i.e.: you don't want to modify
+        anything), you should obtain a shared lock instead of an exclusive
+        one.  The list must be locked whenever you want to add or remove
+        a song, or when you scan it in any way.
+
+        Since public songs could be modified or even deleted by other
+        tasks, do not make your songs public unless your code is smart
+        enough to handle all possible situations.
+
+
+    HOOKS
+        Actually, most modular programs call them `modules', but it would
+        have created a lot of confusion with a program like XModule :-).
+
+        Hooks are programs that add some kind of functionality
+        to XModule.  External hook files are standard shared libraries
+        which will open the xmodule.library when they are loaded and
+        call @{"xmAddHookA()" LINK "xmodule/xmAddHook"} to add themselves to a list of hooks maintained
+        by the library.
+
+        Currently, XModule supports two kinds of hooks: loaders and
+        savers.  Loader hooks can also provide a function which
+        identifies a particular module format.
+
+        An external hook libray may also contain several hooks.
+        Putting a loader and a saver for one particolar format together
+        in one libray is generally a good idea, while making a hook
+        with hundereds of loaders and savers isn't a good move because
+        it makes the whole concept of external hooks quite useless.
+        Grouping different versions or variants of one format together
+        in one external hook is acceptable.
+
+    SEE ALSO
+        songclass/--background--, exec/ObtainSemaphore()
+
+@ENDNODE
+@NODE "xmActivateSong" "xmodule/xmActivateSong()"
+@{b}
+
+    NAME@{ub}
+        xmActivateSong -- Makes a song the active one@{b}
+
+    SYNOPSIS@{ub}
+        success = xmActivateSong(songInfo);
+        D0                       A0
+
+        ULONG xmActivateSong(@{"struct SongInfo" LINK "songclass.h/File" 284} *);@{b}
+
+    FUNCTION@{ub}
+        Makes the passed song the currently active one.  It's pointer
+        will be stored in the public song list and most actions
+        will happen on this song by default.@{b}
+
+    INPUTS@{ub}
+        songInfo - song to be activated. If NULL, this function will
+            take no action.@{b}
+
+    RESULT@{ub}
+        success - Will be 0 for failure, in which case the song will
+            not be removed from the song list. Currently,
+            xmActivateSong() will never fail.@{b}
+
+    NOTE@{ub}
+        In order to activate a song, you must own a shared lock
+        on it.  Please do not hog this lock for a long time when
+        xmActivateSong() returns, because most internal routines
+        try to lock the current song before taking any action.@{b}
+
+    SEE ALSO@{ub}
+
+@ENDNODE
+@NODE "xmAddHook" "xmodule/xmAddHook()"
+@{b}
+
+    NAME@{ub}
+        xmAddHookA -- Creates a new XModule Hook
+        xmAddHook -- Varargs stub for xmAddHookA@{b}
+
+    SYNOPSIS@{ub}
+        hook = xmAddHookA(tagList)
+        D0                A0
+
+        @{"struct XMHook" LINK "xmodule.h/File" 92} *xmAddHookA(struct TagItem *);
+
+
+        hook = xmAddHook(Tag1,...)
+
+        @{"struct XMHook" LINK "xmodule.h/File" 92} *xmAddHook(ULONG,...);@{b}
+
+    FUNCTION@{ub}
+        Creates a new XMHook structure and fills it in with data supplied
+        with the TagList. Adds the newly created Hook to the appropriate
+        list.@{b}
+
+    INPUTS@{ub}
+        tagList - pointer to a tag list specifying how to initialize the
+            XMHook structure.@{b}
+
+    TAGS@{ub}
+        @{"XMHOOK_Type" LINK "xmodule.h/File" 235} - (ULONG) Defines the pourpose of this hook. Possible
+            values are currently @{"NT_XMLOADER" LINK "xmodule.h/File" 138} and @{"NT_XMSAVER" LINK "xmodule.h/File" 139}. (This
+            tag is REQUIRED).
+
+        @{"XMHOOK_Name" LINK "xmodule.h/File" 236} - (STRPTR) ti_Data contains a short name for the
+            hook (e.g: "SoundTracker").  This name will appear in the
+            Savers list if this hook is a saver and will be passed as an
+            argument for some ARexx commands, so please use a single
+            word name.  (This tag is REQUIRED).
+
+        @{"XMHOOK_Priority" LINK "xmodule.h/File" 237} - (BYTE) Priority to give to this hook.  Hooks
+            with higher priorities will be used before lower priority
+            ones and will come first in lists shown to the user. Valid
+            range is -128..+127, but please restrict to a -20..+20
+            interval for normal cases. (Defaults to 0).
+
+        @{"XMHOOK_Descr" LINK "xmodule.h/File" 238} - (STRPTR) Verbose description of the hook
+            (without newlines). (Defaults to NULL).
+
+        @{"XMHOOK_Author" LINK "xmodule.h/File" 239} - (STRPTR) Author's name.  Please, just put
+            your full name here; no greetings, copyright notices,
+            etc. (Defaults to NULL).
+
+        @{"XMHOOK_ID" LINK "xmodule.h/File" 240} - (ULONG) This is a unique, IFF-style identifier for
+            the format.  If the format is an IFF format, it must be the
+            same of the FORM ID. (Defaults to 0, this tag is required
+            for IFF loaders and savers).
+
+        @{"XMHOOK_Flags" LINK "xmodule.h/File" 241} - (ULONG) Sets miscellaneous flags for this hook.
+            See xmodule.h for possible flags.
+
+        @{"XMHOOK_LibraryBase" LINK "xmodule.h/File" 243} - (struct Library *) Pointer to the library
+            base for external hooks.  This pointer will be used to open
+            the library when the hook is created and to close it when
+            the hook is deleted.  If you do not pass this tag, you must
+            find some other way to keep your code in memory until one
+            or more of your hooks are active.  XModule will close your
+            library just after calling the SetupXMHook() function.
+            (Defaults to NULL).
+
+        @{"XMHOOK_UserData" LINK "xmodule.h/File" 242} - (APTR) ti_Data will be stored in the
+            xmh_UserData field of the XMHook structure. This field can
+            come andy to store private data. (Defaults to NULL).
+
+        XMHOOK_RemoveHookFunc - (APTR) Pointer to a function which will be
+            called upon removing the hook.  This function can be used to
+            free any private resources allocated by the hook when it was
+            created. The template for the function is:
+
+                void RemoveHookFunc (@{"struct XMHook" LINK "xmodule.h/File" 92} *hook);
+                                     A0
+
+        @{"XMHOOK_LoadModFunc" LINK "xmodule.h/File" 245} - (APTR) Pointer to the hook function which
+            loads a module. The template for the function is:
+
+                LONG LoadModFunc (BPTR fileHandle, @{"struct SongInfo" LINK "songclass.h/File" 284} *song,
+                                  D0               A0
+                    @{"struct XMHook" LINK "xmodule.h/File" 92} *loader);
+                    A1
+
+            `fileHandle' is an open file to load the module from. The
+            caller will take care to close it for you. The loader should
+            return RETURN_OK for success, or any other AmigaDOS error
+            code to mean failure.  In particular, RETURN_WARN indicates
+            that something went wrong, but the song is ok.  The special
+            error code @{"ERROR_IOERR" LINK "xmodule.h/File" 194} can be used when some dos.library
+            call (e.g.: Read()) failed.  In the latter case, the
+            AmigaDOS IoErr value should be set to explain the specific
+            cause of the problem.
+            (This tag is required by all @{"NT_XMLOADER" LINK "xmodule.h/File" 138} type hooks).
+
+        @{"XMHOOK_SaveModFunc" LINK "xmodule.h/File" 246} - (APTR) Pointer to the hook function which
+            saves a module. The template for the function is:
+
+                LONG SaveModFunc (BPTR fileHandle, @{"struct SongInfo" LINK "songclass.h/File" 284} *song,
+                                  D0               A0
+                    @{"struct XMHook" LINK "xmodule.h/File" 92} *saver);
+                    A1
+
+            fileHandle is an open file to save the module to. The caller
+            will take care to close it for you. The saver should return
+            RETURN_OK for success, or any other AmigaDOS error code to
+            mean failure.  In particular, RETURN_WARN indicates that
+            something went wrong, but the song is ok.  The special
+            error code @{"ERROR_IOERR" LINK "xmodule.h/File" 194} can be used when some dos.library
+            call (e.g.: Read()) failed.  In the latter case, the
+            AmigaDOS IoErr value should be set to explain the specific
+            cause of the problem.
+            (This tag is required by all @{"NT_XMSAVER" LINK "xmodule.h/File" 139} type hooks).
+
+
+        @{"XMHOOK_IdentifyModFunc" LINK "xmodule.h/File" 247} - (APTR) Pointer to the hook function
+            which identifies a module format. The template for the
+            function is:
+
+                @{"struct XMHook" LINK "xmodule.h/File" 92} *IdentifyModFunc (BPTR fileHandle,
+                                                D0
+                    @{"struct XMHook" LINK "xmodule.h/File" 92} *hook,struct TagItem *tagList);
+                    A0                  A1
+
+            fileHandle is an open file to try the identification on. The
+            caller will take care to close it. NOTE: Do not make assumptions
+            on the initial file position (e.g: seek yourself to position 0
+            if you need to). This funtion should return a pointer to a valid
+            loader (usually the one passed in) if the format is recognized,
+            NULL otherwhise.  (This tag is required by all @{"NT_XMLOADER" LINK "xmodule.h/File" 138} type
+            hooks).@{b}
+
+    RESULT@{ub}
+        hook - Pointer to the newly allocated XMHook structure, or
+            NULL for failure.@{b}
+
+    SEE ALSO@{ub}
+        @{"xmRemHook()" LINK "xmRemHook"}, @{"xmIdentifyModule()" LINK "xmIdentifyModule"}, xmLoadSong(), xmSaveSong()
+
+@ENDNODE
+@NODE "xmAddInstrumentA" "xmodule/xmAddInstrumentA()"
+@{b}
+
+    NAME@{ub}
+        xmAddInstrumentA -- Adds a instrument to a song
+        xmAddInstrument -- Varargs stub for xmAddInstrumentA@{b}
+
+    SYNOPSIS@{ub}
+        instrument = xmAddInstrumentA(si, instrNum, tagList)
+        D0                            A0  D0        A1
+
+        @{"struct Instrument" LINK "songclass.h/File" 183} *xmAddInstrumentA(@{"struct SongInfo" LINK "songclass.h/File" 284} *,LONG,
+            struct TagItem *);
+
+
+        instrument = xmAddInstrument(si,instrNum,tag1,...)
+
+        @{"struct Instrument" LINK "songclass.h/File" 183} *xmAddInstrument(@{"struct SongInfo" LINK "songclass.h/File" 284} *,LONG,LONG,...);@{b}
+
+    FUNCTION@{ub}
+        Adds an instrument to a song by calling the @{"SNGM_ADDINSTRUMENT" LINK "songclass.h/File" 32} method .@{b}
+
+    INPUTS@{ub}
+        si - pointer to the song to which the instrument should be added.
+        tagList - optional TagList.  See @{"SNGM_ADDINSTRUMENT" LINK "songclass.h/File" 32} for possible tags .@{b}
+
+    RESULT@{ub}
+        Pointer to the new instrument or NULL for failure.@{b}
+
+    NOTE@{ub}
+        In order to add instruments, you should have exclusive access to
+        the song.  Always obtain a lock before you call this function on
+        public songs.@{b}
+
+    SEE ALSO@{ub}
+        @{"xmRemInstrument()" LINK "xmRemInstrument"}, @{"songclass" LINK "songclass/MAIN"}/SNGM_REMINSTRUMENT
+
+@ENDNODE
+@NODE "xmAddPatternA" "xmodule/xmAddPatternA()"
+@{b}
+
+    NAME@{ub}
+        xmAddPatternA -- Adds a pattern to a song
+        xmAddPattern -- Varargs stub for xmAddPatternA@{b}
+
+    SYNOPSIS@{ub}
+        pattern = xmAddPatternA(si, tagList)
+        D0                      A0  A1
+
+        @{"struct Pattern" LINK "songclass.h/File" 229} *xmAddPatternA(@{"struct SongInfo" LINK "songclass.h/File" 284} *,struct TagItem *);
+
+
+        pattern = xmAddPattern (si,tag1,...)
+
+        @{"struct Pattern" LINK "songclass.h/File" 229} *xmAddPattern(@{"struct SongInfo" LINK "songclass.h/File" 284} *,LONG Tag1,...);@{b}
+
+    FUNCTION@{ub}
+        Adds a pattern to a song by calling the @{"SNGM_ADDPATTERN" LINK "songclass.h/File" 29} method.@{b}
+
+    INPUTS@{ub}
+        si - pointer to the song to which the pattern should be added.
+        tagList - optional TagList.  See @{"SNGM_ADDPATTERN" LINK "songclass.h/File" 29} for possible tags.@{b}
+
+    RESULT@{ub}
+        Pointer to the new pattern or NULL for failure.@{b}
+
+    NOTE@{ub}
+        In order to add patterns, you should have exclusive access to
+        the song.  Always obtain a lock before you call this function on
+        public songs.@{b}
+
+    SEE ALSO@{ub}
+        @{"xmRemPattern()" LINK "xmRemPattern"}, @{"songclass" LINK "songclass/MAIN"}/SNGM_ADDPATTERN
+
+@ENDNODE
+@NODE "xmAddSongA" "xmodule/xmAddSongA()"
+@{b}
+
+    NAME@{ub}
+        xmAddSongA -- Add a song to the song list
+        xmAddSong -- Varargs stub for xmAddSongA@{b}
+
+    SYNOPSIS@{ub}
+        success = xmAddSongA(songInfo,position,tagList);
+        D0                   A0       A1       A2
+
+        ULONG xmAddSongA(@{"struct SongInfo" LINK "songclass.h/File" 284} *,@{"struct SongInfo" LINK "songclass.h/File" 284} *,
+            struct TagItem *);
+
+
+        success = xmAddSong(songInfo,position,tag1,...);
+
+        ULONG xmAddSong(@{"struct SongInfo" LINK "songclass.h/File" 284} *,@{"struct SongInfo" LINK "songclass.h/File" 284} *,
+            LONG,...);@{b}
+
+    FUNCTION@{ub}
+        Adds a song to the public song list. Trying to add a song
+        twice is harmless.@{b}
+
+    INPUTS@{ub}
+        songInfo - song to be added.  Passing a NULL pointer is safe.
+        position - Position to add the song in.  Passing NULL adds the
+            song in the head of the list, while ~0 adds it in the tail.
+            passing a pointer to a SongInfo already in the list inserts
+            the first song _after_ the other one.
+        tagList - pointer to a TagList for more arguments.@{b}
+
+    TAGS@{ub}
+        @{"XMSNG_Active" LINK "xmodule.h/File" 209} - (BOOL) Makes this song the active one. The
+            default is to just add the song without activating it.@{b}
+
+    RESULT@{ub}
+        success - Will be 0 for failure, in which case the song will
+            not be added to the songs list. Currently, xmAddSongA()
+            will never fail.@{b}
+
+    NOTE@{ub}
+        The song list is protected from multiple tasks access by a
+        SignalSemaphore in XModuleBase. This call will wait if the
+        song list has been locked by another task. Beware of deadlock
+        conditions!@{b}
+
+    SEE ALSO@{ub}
+        @{"xmRemSong()" LINK "xmRemSong"}
+
+@ENDNODE
+@NODE "xmCreateSong" "xmodule/xmCreateSong()"
+@{b}
+
+    NAME@{ub}
+        xmCreateSongA -- Create and initialize a new SongInfo structure
+        xmCreateSong -- Varargs stub for xmCreateSongA@{b}
+
+    SYNOPSIS@{ub}
+        songInfo = xmCreateSongA(tagList);
+        D0                      A0
+
+        @{"struct SongInfo" LINK "songclass.h/File" 284} *xmCreateSongA(struct TagItem *);
+
+
+        songInfo = xmCreateSong(Tag1,...);
+
+        @{"struct SongInfo" LINK "songclass.h/File" 284} *xmCreateSong(ULONG,...);@{b}
+
+    FUNCTION@{ub}
+        Allocates and initializes a new SongInfo structure.  The song
+        can then be added to the song list via @{"xmAddSongA()" LINK "xmAddSongA"}, in which
+        case, it is no longer required to free it with @{"xmDeleteSong()" LINK "xmDeleteSong"}.@{b}
+
+    INPUTS@{ub}
+        tagList - pointer to an optional tag list specifying how to
+            initialize the SongInfo structure.@{b}
+
+    TAGS@{ub}
+        @{"SNGA_DefaultTracks" LINK "songclass.h/File" 121} - Sets the default number of pattern tracks for
+            the song. Defaults to 4.
+
+        @{"SNGA_DefaultPattLen" LINK "songclass.h/File" 122} - Sets the default number of pattern lines for
+            the song. Defaults to 64.
+
+        @{"SNGA_ReadyToUse" LINK "songclass.h/File" 127} - Adds one pattern and one position to the song.
+            Defaults to FALSE.
+
+        @{"XMSNG_AddToList" LINK "xmodule.h/File" 205} - (@{"struct SongInfo" LINK "songclass.h/File" 284} *) Add the song to the song list.
+            When a song is being added to the list, a shared lock is
+            obtained on it to prevent other tasks from modifying (or even
+            remove) the song before you can do your job on it. IT IS YOUR
+            DUTY TO UNLOCK THE SONG as soon as you are done modifying it.
+            Passing NULL adds the song on the head of the list, while -1
+            (~0) will add it to the end of the SongList. Passing in a
+            pointer to another song which is already in the list, will
+            add the new song _after_ the latter.
+            (Default is not adding the song).
+
+        @{"XMSNG_Active" LINK "xmodule.h/File" 209} - (BOOL) Makes this song the active one. This tag is
+            considered only if the @{"XMSNG_AddToList" LINK "xmodule.h/File" 205} tag is also passed.@{b}
+
+    RESULT@{ub}
+        songInfo - pointer to the newly allocated SongInfo structure, or
+            NULL for failure.@{b}
+
+    SEE ALSO@{ub}
+        @{"xmDeleteSong()" LINK "xmDeleteSong"}, @{"xmAddSongA()" LINK "xmAddSongA"}
+
+@ENDNODE
+@NODE "xmDeleteSong" "xmodule/xmDeleteSong()"
+@{b}
+
+    NAME@{ub}
+        xmDeleteSong -- Deletes a song@{b}
+
+    SYNOPSIS@{ub}
+        xmDeleteSong(songInfo)
+                     A0
+
+        void xmDeleteSong(@{"struct SongInfo" LINK "songclass.h/File" 284} *);@{b}
+
+    FUNCTION@{ub}
+        Deletes a song and all the items attached to it (patterns,
+        instruments, etc.).  This call will also remove the song from
+        the song list if it had been added to it.@{b}
+
+    INPUTS@{ub}
+        songInfo - pointer to the SongInfo structure to be deleted.
+            Passing a NULL pointer is harmless.@{b}
+
+    NOTE@{ub}
+        In order to delete a song which has been added to the public
+        song list, you must first obtain an exclusive lock on it to
+        prevent other tasks from walking on it while you are freeing
+        it's data structures.  The semaphore does NOT need to be
+        relinquished, because the SongInfo structure won't exist any
+        more when this call returns.@{b}
+
+    SEE ALSO@{ub}
+        @{"xmCreateSong()" LINK "xmCreateSong"}, @{"xmRemSong()" LINK "xmRemSong"}
+
+@ENDNODE
+@NODE "xmDisplayMessage" "xmodule/xmDisplayMessage()"
+@{b}
+
+    NAME@{ub}
+        xmDisplayMessageA -- Displays a message to the user
+        xmDisplayMessage -- Varargs stub for xmDisplayMessageA()@{b}
+
+    SYNOPSIS@{ub}
+        xmDisplayMessageA(level, message, args)
+                          DO     A0       A1
+
+        void xmDisplayMessageA(ULONG,APTR,LONG *);
+
+
+        xmDisplayMessage(level, message, ...)
+
+        void xmDisplayMessage(ULONG,APTR,...);@{b}
+
+    FUNCTION@{ub}
+        Outputs a string in the XModule log window or in the 'action' field
+        of the progress indicator.  The string is printf-formatted before
+        being output.@{b}
+
+    INPUTS@{ub}
+        level - a number from 0 to 7 which indicates the importance of the
+            message.  7 is used for very annoying messages (eg: debug output) ,
+            0 for very important things (eg: disaster).
+            If you set the @{"XMDMF_USECATALOG" LINK "xmodule.h/File" 187} bit in the level parameter, you
+            can pass a catalog string number instead of a pointer to a string .
+            Specifying @{"XMDMF_ACTION" LINK "xmodule.h/File" 185}, the message will be put in the 'action'
+            field of the progress indicator.
+            If the flag @{"XMDMF_DOSFAULT" LINK "xmodule.h/File" 184} is specified, a Fault() output is
+            formatted using the message as an header.  In this case, the
+            level parameter takes another meaing: The lower word can contain
+            an AmigaDOS error code. If it is 0, IoErr() will be used to get
+            the error code.
+        message - pointer to a string or catalog message number,
+            when the @{"XMDMF_USECATALOG" LINK "xmodule.h/File" 187} flag is set.
+        args - arguments for formatting.@{b}
+
+    EXAMPLES@{ub}
+        xmDisplayMessage (@{"XMDMF_ALERT" LINK "xmodule.h/File" 173},
+            "The application `%s' fucked up Windoze95 because %s.",
+            "(unknown name)", "an error occurred");
+
+        xmDisplayMessage (XMDMF_USE_CATALOG | @{"XMDMF_COMMENT" LINK "xmodule.h/File" 179},
+            MSG_LIFE_UNIVERSE_AND_ALLTHAT, 42, "Fortytwo", "For tea too");
+
+        xmDisplayMessageA (@{"XMDMF_ACTION" LINK "xmodule.h/File" 185} | @{"XMDMF_USECATALOG" LINK "xmodule.h/File" 187},
+            MSG_READING_COMICS, NULL);
+
+        xmDisplayMessage (@{"XMDMF_DOSFAULT" LINK "xmodule.h/File" 184} | @{"XMDMF_USECATALOG" LINK "xmodule.h/File" 187},
+            MSG_CANT_LOAD_MODULE, ModuleName);@{b}
+
+    SEE ALSO@{ub}
+        @{"xmDisplayProgress()" LINK "xmDisplayProgress"}
+
+@ENDNODE
+@NODE "xmDisplayProgress" "xmodule/xmDisplayProgress()"
+@{b}
+
+    NAME@{ub}
+        xmDisplayProgress -- Uptdates the progress bar indicator@{b}
+
+    SYNOPSIS@{ub}
+        abort = xmDisplayProgress(done, total)
+                                  D0    D1
+
+        LONG @{"xmDisplayMessageA" LINK "xmDisplayMessage"}(ULONG,ULONG);@{b}
+
+    FUNCTION@{ub}
+        Updates the position of the fuel gauge in the progress window to
+        show the progress of an operation.  Additionally, it checks for
+        user abort.@{b}
+
+    INPUTS@{ub}
+        done - a number which indicates how much of the work has
+            been already completed
+        total - Total number of operations to do.@{b}
+
+    RESULT@{ub}
+        0 for success, ERROR_BREAK if user abort was detected.  You should
+        always check this return code to abort what you were doing.
+
+@ENDNODE
+@NODE "xmIdentifyModule" "xmodule/xmIdentifyModule()"
+@{b}
+
+    NAME@{ub}
+        xmIdentifyModule -- Returns the type of a module@{b}
+
+    SYNOPSIS@{ub}
+        loader = xmIdentifyModule(fh, tagList)
+        D0                        D0  A0
+
+        @{"struct XMHook" LINK "xmodule.h/File" 92} *xmIdentifyModule(BPTR,struct TagItem *);@{b}
+
+    FUNCTION@{ub}
+        Finds out a loader which is able to read the given module.@{b}
+
+    INPUTS@{ub}
+        fh - AmigaDOS FileHandle to examine.
+        tagList - Additional parameters. Leave it NULL for now.@{b}
+
+    RESULT@{ub}
+        loader - Pointer to the first loader which knows how to load this
+            module, or NULL otherwise.@{b}
+
+    NOTE@{ub}
+        Before you call this function, you must first obtain a lock on the
+        loaders list to protect yourself from other tasks which might remove
+        the returned loader before you can actually use it.@{b}
+
+    SEE ALSO@{ub}
+
+@ENDNODE
+@NODE "xmLoadModuleA" "xmodule/xmLoadModuleA()"
+@{b}
+
+    NAME@{ub}
+        xmLoadModuleA -- Loads a module and converts it in XModule format
+        xmLoadModule -- Varargs stub for xmLoadModuleA@{b}
+
+    SYNOPSIS@{ub}
+        songInfo = xmLoadModuleA(fileName,tagList)
+        D0                       A0       A1
+
+        @{"struct SongInfo" LINK "songclass.h/File" 284} *xmLoadModuleA(STRPTR,struct TagItem *);
+
+
+        songInfo = xmLoadModule(fileName,tag,...)
+
+        @{"struct SongInfo" LINK "songclass.h/File" 284} *xmLoadModule(STRPTR,LONG,...);@{b}
+
+    FUNCTION@{ub}
+        Loads fileName using the correct module loader.@{b}
+
+    INPUTS@{ub}
+        fileName - File to read. Can be NULL if the @{"XMSNG_FileHandle" LINK "xmodule.h/File" 208}
+            tag is passed.
+        tagList - Additional parameters (see below).  Can be NULL.@{b}
+
+    TAGS@{ub}
+        @{"XMSNG_OldSong" LINK "xmodule.h/File" 206} - ti_Data is the pointer to a SongInfo which will be
+            freed as soon as the module format has been determined.  This
+            is useful when the user wants to replace a song with another
+            one.  Passing NULL uses the currently active song.
+
+        @{"XMSNG_AddToList" LINK "xmodule.h/File" 205} - (@{"struct SongInfo" LINK "songclass.h/File" 284} *) Add the song to the song list.
+            When a song is being added to the list, a shared lock is
+            obtained on it to prevent other tasks from modifying (or even
+            remove) the song before you can do your job on it. IT IS YOUR
+            DUTY TO UNLOCK THE SONG as soon as you are done modifying it.
+            Passing NULL adds the song on the head of the list, while -1
+            (~0) will add it to the end of the SongList. Passing in a
+            pointer to another song which is already in the list, will
+            add the new song _after_ the latter.
+            (Default is not adding the song).
+
+        @{"XMSNG_Loader" LINK "xmodule.h/File" 207} - (@{"struct XMHook" LINK "xmodule.h/File" 92} *) Disables automatic format
+            checking and forces loading the module with the given
+            loader. (Defaults to NULL).
+
+        @{"XMSNG_FileHandle" LINK "xmodule.h/File" 208} - (BPTR) pointer to an open AmigaDOS
+            FileHandle to read the module from.  The file must
+            already be positioned over the beginning of the module data.
+            NOTE: Even if this tag is passed, the fileName parameter is
+                still used to fill in the SongName field in case it is
+                missing inside the module AND the filesystem does not
+                support the ACTION_EXAMINE_FH packet.
+            NOTE: Some loaders may require a fully seekable file, so be
+                careful when using pipes.
+            NOTE: automatic data decompression is not possible when
+                @{"XMSNG_FileHandle" LINK "xmodule.h/File" 208} is passed.
+            (Defaults to NULL).
+
+        XMSNG_IFFHandle - (BPTR) pointer to an already initialized
+            IFFHandle to read the module from.  The IFF must
+            already be positioned over the beginning of the module FORM.
+            Even if this tag is passed, the fileName parameter is still
+            used to fill in the SongName field in case it is missing
+            inside the module.
+            NOTE: The iffparse.library can deal with non-seekable files,
+                but some loaders may require a fully seekable file, so be
+                careful when using pipes.
+            NOTE: automatic file decompression is not possible when
+                XMSNG_IFFHandle is passed.
+            (Defaults to NULL).
+
+        @{"XMSNG_Active" LINK "xmodule.h/File" 209} - (BOOL) Makes this song the active one. This tag is
+            considered only if the @{"XMSNG_AddToList" LINK "xmodule.h/File" 205} tag is also passed.@{b}
+
+    RESULT@{ub}
+        songInfo - Pointer to the newly allocated SongInfo structure, or
+            NULL for failure.  This function will not fail if the module is
+            partially corrupted. Anyway, the returned SongInfo will always
+            be valid. You can check IoErr() to know if there were problems.@{b}
+
+    EXAMPLE@{ub}
+        /* Load a song and add it to the SongList */
+        si = xmLoadSongTags (file, NULL,
+            @{"XMSNG_AddToList" LINK "xmodule.h/File" 205}, (@{"struct SongInfo" LINK "songclass.h/File" 284} *)~0,
+            TAG_DONE);
+
+        /* Check for errors even if si is not NULL */
+        error = IoErr();
+
+        /* Release Semaphore got by xmLoadSong() */
+        if (si) ReleaseSemaphore (&si->Lock);@{b}
+
+    SEE ALSO@{ub}
+        @{"xmAddSongA()" LINK "xmAddSongA"}, @{"xmIdentifyModule()" LINK "xmIdentifyModule"}
+
+@ENDNODE
+@NODE "xmLockActiveSong" "xmodule/xmLockActiveSong()"
+@{b}
+
+    NAME@{ub}
+        xmLockActiveSong -- Obtains an lock on the active song@{b}
+
+    SYNOPSIS@{ub}
+        song = xmLockActiveSong(mode);
+        D0                        D0:16
+
+        @{"struct SongInfo" LINK "songclass.h/File" 284} *@{"xmActivateSong" LINK "xmActivateSong"}(UWORD);@{b}
+
+    FUNCTION@{ub}
+        Obtains an exclusive or shared lock on the active song,
+        waiting if needed.  This call is a shortcut to:
+
+            ObtainSemaphoreShared (&XModuleBase->xm_BaseLock);
+            ObtainSemaphore[Shared] (&XModuleBase->xm_CurrentSong.Lock);
+            ReleaseSemaphore (&XModuleBase->xm_BaseLock);
+
+        To unlock a song obtained in this way, you just need to
+        ReleaseSemaphore() it.
+
+        You MUST always lock a song before you even think to
+        read from -or write to- its data!@{b}
+
+    INPUTS@{ub}
+        mode - one of SM_SHARED or SM_EXCLUSIVE.@{b}
+
+    RESULT@{ub}
+        song - Pointer to the song which *was* active at the time
+            you called xmLockActiveSong().  The song will be
+            locked for you.  The result will be NULL if no song
+            is active.@{b}
+
+    NOTE@{ub}
+        Please be careful if you call this function while holding
+        locks on other songs.  Doing so, you run the risk of causing
+        deadlock condition.
+        This function does only lock the song; it is NOT guaranteed
+        that it will remain the active one.@{b}
+
+    SEE ALSO@{ub}
+
+@ENDNODE
+@NODE "xmProcessSongA" "xmodule/xmProcessSongA()"
+@{b}
+
+    NAME@{ub}
+        xmProcessSongA -- Performs complex processing on a song
+        xmProcessSong -- Varargs stub for xmProcessSongA()@{b}
+
+    SYNOPSIS@{ub}
+        result = xmProcessSongA(si, reserved, tagList)
+                                A0  A1,       A2
+
+        LONG xmProcessSongA(@{"struct SongInfo" LINK "songclass.h/File" 284} *,void *,struct TagItem *);
+
+
+        result = xmProcessSong(si, reserved, tag1, ...)
+
+        LONG xmProcessSongA(@{"struct SongInfo" LINK "songclass.h/File" 284} *,void *,LONG,...);@{b}
+
+    FUNCTION@{ub}
+        Performs complex processing operations on a song.@{b}
+
+    INPUTS@{ub}
+        si - pointer to the song to be processed.
+        reserved - Reserved for future use.
+        tagList - List of arguments.  See below for possible tags.@{b}
+
+    RESULT@{ub}
+        The result depends on the kind of operation done.  For most
+        operations, it's value will be 0 to indicate success and
+        an AmigaDOS error code which indicates the cause for failure.@{b}
+
+    TAGS@{ub}
+        @{"XMSNG_Optimize" LINK "xmodule.h/File" 213} - (LONG).  Tries to reduce the song size by removing
+            all unused data.  Possible optimizations are:
+                - @{"XMOF_REM_UNUSED_PATTERNS" LINK "xmodule.h/File" 221}
+                - @{"XMOF_REM_DUP_PATTERNS" LINK "xmodule.h/File" 222}
+                - @{"XMOF_CUT_PATTERNS" LINK "xmodule.h/File" 227}
+                - @{"XMOF_REM_UNUSED_INSTRS" LINK "xmodule.h/File" 223}
+                - @{"XMOF_CUT_INSTR_LOOPS" LINK "xmodule.h/File" 225}
+                - @{"XMOF_CUT_INSTR_TAILS" LINK "xmodule.h/File" 226}
+                - @{"XMOF_DEFAULT" LINK "xmodule.h/File" 220}
+            @{"XMOF_DEFAULT" LINK "xmodule.h/File" 220} will select all the optimizations choosen by
+            the user in addition to the ones specified with the other flags.
+
+        @{"XMSNG_RemapInstruments" LINK "xmodule.h/File" 214} - (BOOL) Performs instruments remapping.
+
+        @{"XMSNG_LimitPatterns" LINK "xmodule.h/File" 215} - (UWORD,UWORD) Limits the length all the
+            patterns inside a minimum and maximum value.  The upper 16bits
+            of the argument are the minimum value, the lower ones are
+            the maximum value.  Patterns outside this limits will be grown
+            or split as appropriate.
+
+        @{"XMSNG_Join" LINK "xmodule.h/File" 216} - (@{"struct SongInfo" LINK "songclass.h/File" 284} *) - Joins the song with another one.
+
+        @{"XMSNG_Merge" LINK "xmodule.h/File" 217} - (@{"struct SongInfo" LINK "songclass.h/File" 284} *) - Merges the song with another one.@{b}
+
+    NOTE@{ub}
+        In order to process a song, you should have exclusive access to
+        it.  Always obtain a lock before you call this function on
+        public songs.
+
+@ENDNODE
+@NODE "xmRemHook" "xmodule/xmRemHook()"
+@{b}
+
+    NAME@{ub}
+        xmRemHook -- Removes an XModule Hook@{b}
+
+    SYNOPSIS@{ub}
+        xmRemHookA(xmHook)
+                   A0
+
+        void xmRemHook(@{"struct XMHook" LINK "xmodule.h/File" 92} *);@{b}
+
+    FUNCTION@{ub}
+        Removes an XModule Hook, calls its RemoveHookFunc() and then
+        frees its memory.@{b}
+
+    INPUTS@{ub}
+        xmHook - pointer to the hook to be removed.@{b}
+
+    SEE ALSO@{ub}
+        @{"xmAddHook()" LINK "xmAddHook"}
+
+@ENDNODE
+@NODE "xmRemInstrument" "xmodule/xmRemInstrument()"
+@{b}
+
+    NAME@{ub}
+        xmRemInstrument -- Removes an instrument from a song@{b}
+
+    SYNOPSIS@{ub}
+        xmRemInstrument(si, instrNum)
+                        A0  D0
+
+        void xmRemInstrument(@{"struct SongInfo" LINK "songclass.h/File" 284} *,LONG);@{b}
+
+    FUNCTION@{ub}
+        Removes an instrument from a song by calling the @{"SNGM_REMINSTRUMENT" LINK "songclass.h/File" 34}
+        method.@{b}
+
+    INPUTS@{ub}
+        si - pointer to the song to which the instrument should be removed.
+        mum - Number of the instrument to be removed.@{b}
+
+    NOTE@{ub}
+        In order to remove instruments, you should have exclusive access to
+        the song.  Always obtain a lock before you call this function on
+        public songs.@{b}
+
+    SEE ALSO@{ub}
+        @{"xmAddInstrumentA()" LINK "xmAddInstrumentA"}, @{"songclass" LINK "songclass/MAIN"}/SNGM_REMINSTRUMENT
+
+@ENDNODE
+@NODE "xmRemPattern" "xmodule/xmRemPattern()"
+@{b}
+
+    NAME@{ub}
+        xmRemPattern -- Removes a pattern from a song@{b}
+
+    SYNOPSIS@{ub}
+        xmRemPattern(si, pattNum, replaceWith)
+                     A0  D0,      D1
+
+        void xmRemPattern(@{"struct SongInfo" LINK "songclass.h/File" 284} *,LONG,LONG);@{b}
+
+    FUNCTION@{ub}
+        Removes a pattern from a song by calling the @{"SNGM_REMPATTERN" LINK "songclass.h/File" 31} method.@{b}
+
+    INPUTS@{ub}
+        si - pointer to the song to which the pattern should be removed.
+        mum - Number of the pattern to be removed.
+        replaceWith - What to put in the song sequence in place of the
+            deleted pattern.@{b}
+
+    NOTE@{ub}
+        In order to remove patterns, you should have exclusive access to
+        the song.  Always obtain a lock before you call this function on
+        public songs.@{b}
+
+    SEE ALSO@{ub}
+        @{"xmAddPatternA()" LINK "xmAddPatternA"}, @{"songclass" LINK "songclass/MAIN"}/SNGM_REMPATTERN
+
+@ENDNODE
+@NODE "xmRemSong" "xmodule/xmRemSong()"
+@{b}
+
+    NAME@{ub}
+        xmRemSong -- Remove a song from the song list@{b}
+
+    SYNOPSIS@{ub}
+        success = xmRemSong(songInfo);
+        D0                  A0
+
+        ULONG xmRemSong(@{"struct SongInfo" LINK "songclass.h/File" 284} *);@{b}
+
+    FUNCTION@{ub}
+        Removes a song from the public song list. It is safe to call this
+        function even if the song has not been added to the song list. If
+        the passed SongInfo is the active one, another song will be
+        selected automatically.@{b}
+
+    INPUTS@{ub}
+        songInfo - song to be removed. If NULL, this function will take
+            no action.@{b}
+
+    RESULT@{ub}
+        success - Will be 0 for failure, in which case the song will
+            not be removed from the song list. Currently,
+            xmRemSong() will never fail.@{b}
+
+    NOTE@{ub}
+        In order to remove a song, you must first obtain an exclusive
+        lock on it.
+
+        The song list is also protected from multiple task access by
+        a SignalSemaphore. This call will wait if the song list has
+        been locked by another task. Beware of deadlock conditions!@{b}
+
+    SEE ALSO@{ub}
+        @{"xmAddSongA()" LINK "xmAddSongA"}
+
+@ENDNODE
+@NODE "xmSaveModuleA" "xmodule/xmSaveModuleA()"
+@{b}
+
+    NAME@{ub}
+        xmSaveModuleA -- Saves a module to the specified file format
+        xmSaveModule -- Varargs stub for xmSaveModuleA@{b}
+
+    SYNOPSIS@{ub}
+        error = xmSaveModuleA(songInfo, fileName, saver, tagList)
+        D0                    A0        A1        A2     A3
+
+        LONG xmSaveModuleA(@{"struct SongInfo" LINK "songclass.h/File" 284} *,STRPTR,@{"struct XMHook" LINK "xmodule.h/File" 92} *,
+            struct TagItem *);
+
+
+        error = xmSaveModule(songInfo, fileName, saver, tag1,...)
+
+        LONG xmSaveModule(@{"struct SongInfo" LINK "songclass.h/File" 284} *,STRPTR,@{"struct XMHook" LINK "xmodule.h/File" 92} *,
+            LONG,...);@{b}
+
+    FUNCTION@{ub}
+        Saves songInfo to fileName using the specified saver.@{b}
+
+    INPUTS@{ub}
+        songInfo - Song to save.
+        fileName - AmigaDOS filename to write the song to.
+        saver - Pointer to the saver to use.  Pass NULL to use
+            the default saver.@{b}
+
+    TAGS@{ub}
+        No tags are defined for this call.@{b}
+
+    RESULT@{ub}
+        error - RETURN_OK for success, or any other AmigaDOS error code
+            to mean failure.  In particular, RETURN_WARN indicates that
+            something went wrong, but the song is still ok. The special
+            error code @{"ERROR_IOERR" LINK "xmodule.h/File" 194} means that some dos.library
+            call (e.g.: Read()) failed.  In the latter case, the
+            AmigaDOS IoErr() value will be set to explain the specific
+            cause of the problem.@{b}
+
+    SEE ALSO@{ub}
+
+@ENDNODE
+@NODE "xmSetInstrumentA" "xmodule/xmSetInstrumentA()"
+@{b}
+
+    NAME@{ub}
+        xmSetInstrumentA -- Sets an instrument's attributes
+        xmSetInstrument -- Varargs stub for xmSetInstrumentA@{b}
+
+    SYNOPSIS@{ub}
+        success = xmSetInstrumentA(si, instrNum, tagList)
+        D0                         A0  D0        A1
+
+        ULONG xmSetInstrumentA(@{"struct SongInfo" LINK "songclass.h/File" 284} *,LONG,
+            struct TagItem *);
+
+
+        success = xmSetInstrument(si,instrNum,tag1,...)
+
+        ULONG xmSetInstrument(@{"struct SongInfo" LINK "songclass.h/File" 284} *,LONG,LONG,...);@{b}
+
+    FUNCTION@{ub}
+        Sets an instrument's attributes by calling the @{"SNGM_SETINSTRUMENT" LINK "songclass.h/File" 33}
+        method.@{b}
+
+    INPUTS@{ub}
+        si - pointer to the song which contains the instrument to be set.
+        tagList - instrument attributes to set.  See @{"SNGM_SETINSTRUMENT" LINK "songclass.h/File" 33}
+            for possible tags.@{b}
+
+    RESULT@{ub}
+        non zero for success.@{b}
+
+    NOTE@{ub}
+        In order to set instruments' attributes, you should have
+        exclusive access to the song.  Always obtain a lock before
+        you call this function on public songs.@{b}
+
+    SEE ALSO@{ub}
+        @{"xmAddInstrument()" LINK "xmAddInstrumentA"}, @{"songclass" LINK "songclass/MAIN"}/SNGM_SETINSTRUMENT
+
+@ENDNODE
+@NODE "xmSetPatternA" "xmodule/xmSetPatternA()"
+@{b}
+
+    NAME@{ub}
+        xmSetPatternA -- Sets pattern attributes
+        xmSetPattern -- Varargs stub for xmSetPatternA@{b}
+
+    SYNOPSIS@{ub}
+        success = xmSetPatternA(si, pattNum, tagList)
+        D0                      A0  D0       A1
+
+        ULONG xmSetPatternA(@{"struct SongInfo" LINK "songclass.h/File" 284} *,ULONG,struct TagItem *);
+
+
+        success = xmSetPattern (si,pattNum,tag1,...)
+
+        ULONG xmSetPattern(@{"struct SongInfo" LINK "songclass.h/File" 284} *,ULONG,LONG Tag1,...);@{b}
+
+    FUNCTION@{ub}
+        Sets attributes of a pattern by calling the @{"SNGM_SETPATTERN" LINK "songclass.h/File" 30} method.@{b}
+
+    INPUTS@{ub}
+        si - pointer to the song which contains the pattern to be set.
+        tagList - list of attributes to set.  See @{"SNGM_SETPATTERN" LINK "songclass.h/File" 30} for
+            possible tags.@{b}
+
+    RESULT@{ub}
+        Non zero for success@{b}
+
+    NOTE@{ub}
+        In order to set patterns attributes, you should have exclusive
+        access to the song.  Always obtain a lock before you call this
+        function on public songs.@{b}
+
+    SEE ALSO@{ub}
+        @{"xmAddPattern()" LINK "xmAddPatternA"}, @{"songclass" LINK "songclass/MAIN"}/SNGM_SETPATTERN
+
+@ENDNODE
+@NODE "xmSetSongLen" "xmodule/xmSetSongLen()"
+@{b}
+
+    NAME@{ub}
+        xmSetSongLen -- Set the number of song positions@{b}
+
+    SYNOPSIS@{ub}
+        sequence = xmSetSongLen(songInfo, length)
+        D0                      A0        D0:16
+
+        UWORD *xmSetSongLen(@{"struct SongInfo" LINK "songclass.h/File" 284} *, UWORD);@{b}
+
+    FUNCTION@{ub}
+        Allocates space in the song for a sequence table of the given
+        length. If no sequence exists yet, a new one is allocated.
+        Increasing the song length may require the sequence table to be
+        expanded, in which case it will be re-allocated and the old sequence
+        entries will be copied. Decreasing the song length could also cause
+        a reallocation of the sequence table if the size drops down enough.
+        Setting the song length to 0 will free the sequence table and return
+        NULL.@{b}
+
+    INPUTS@{ub}
+        songInfo - pointer to a SongInfo structure.
+        length - new length of song sequence table.@{b}
+
+    NOTE@{ub}
+        This function will also adjust the CurrentPos field if it is found
+        beyond the song end@{b}
+
+    BUGS@{ub}
+        This funtion is quite useless because all it does is setting the
+        @{"SNGA_Length" LINK "songclass.h/File" 88} attribute in the song object.  Setting the @{"SNGA_Length" LINK "songclass.h/File" 88}
+        attribute yourself is easier and faster if you are already setting
+        other attributes in the same song.@{b}
+
+   RESULT@{ub}
+        Pointer to the newly allocated sequence table or NULL for failure,
+        in which case the previous sequence table is left untouched.
+
+@ENDNODE
diff --git a/Autodocs/xmodule.doc b/Autodocs/xmodule.doc
new file mode 100644 (file)
index 0000000..c4bb47f
--- /dev/null
@@ -0,0 +1,1050 @@
+TABLE OF CONTENTS
+
+xmodule/--background--
+xmodule/xmActivateSong
+xmodule/xmAddHook
+xmodule/xmAddInstrumentA
+xmodule/xmAddPatternA
+xmodule/xmAddSongA
+xmodule/xmCreateSong
+xmodule/xmDeleteSong
+xmodule/xmDisplayMessage
+xmodule/xmDisplayProgress
+xmodule/xmIdentifyModule
+xmodule/xmLoadModuleA
+xmodule/xmLockActiveSong
+xmodule/xmProcessSongA
+xmodule/xmRemHook
+xmodule/xmRemInstrument
+xmodule/xmRemPattern
+xmodule/xmRemSong
+xmodule/xmSaveModuleA
+xmodule/xmSetInstrumentA
+xmodule/xmSetPatternA
+xmodule/xmSetSongLen
+\fxmodule/--background--                                 xmodule/--background--
+
+    INTRODUCTION
+        The xmodule.library is an API that provides access to the XModule
+        song management engine, as well as other general pourpose
+        services.  Hooks and external applications can use this library
+        to create, load, save and modify songs.
+
+        The xmodule.library does not exist as a stand alone shared libray.
+        Instead, it's code is contained inside the main XModule executable
+        (altrough it's logically independant from the rest of the XModule
+        code).
+
+        XModule adds the xmodule.library to the exec libray list at
+        startup time, unless it finds one already in the list (this might
+        happen when multiple copies of XModule are running at the same
+        time).
+
+    PUBLIC SONGS
+        The xmodule.library maintains a list of public songs which can be
+        used by all applications which opened the library.  Each song in
+        the list is protected from multiple task access by a
+        SignalSemaphore, and whole list is also protected by another
+        semaphore.  The locking mechanism is very simple: before you can
+        access a song you must obtain its semaphore, and you must release
+        it as soon as you are done with it.  If you are locking a song to
+        just to read some information (i.e.: you don't want to modify
+        anything), you should obtain a shared lock instead of an exclusive
+        one.  The list must be locked whenever you want to add or remove
+        a song, or when you scan it in any way.
+
+        Since public songs could be modified or even deleted by other
+        tasks, do not make your songs public unless your code is smart
+        enough to handle all possible situations.
+
+
+    HOOKS
+        Actually, most modular programs call them `modules', but it would
+        have created a lot of confusion with a program like XModule :-).
+
+        Hooks are programs that add some kind of functionality
+        to XModule.  External hook files are standard shared libraries
+        which will open the xmodule.library when they are loaded and
+        call xmAddHookA() to add themselves to a list of hooks maintained
+        by the library.
+
+        Currently, XModule supports two kinds of hooks: loaders and
+        savers.  Loader hooks can also provide a function which
+        identifies a particular module format.
+
+        An external hook libray may also contain several hooks.
+        Putting a loader and a saver for one particolar format together
+        in one libray is generally a good idea, while making a hook
+        with hundereds of loaders and savers isn't a good move because
+        it makes the whole concept of external hooks quite useless.
+        Grouping different versions or variants of one format together
+        in one external hook is acceptable.
+
+    SEE ALSO
+        songclass/--background--, exec/ObtainSemaphore()
+
+\fxmodule/xmActivateSong                                 xmodule/xmActivateSong
+
+    NAME
+        xmActivateSong -- Makes a song the active one
+
+    SYNOPSIS
+        success = xmActivateSong(songInfo);
+        D0                       A0
+
+        ULONG xmActivateSong(struct SongInfo *);
+
+    FUNCTION
+        Makes the passed song the currently active one.  It's pointer
+        will be stored in the public song list and most actions
+        will happen on this song by default.
+
+    INPUTS
+        songInfo - song to be activated. If NULL, this function will
+            take no action.
+
+    RESULT
+        success - Will be 0 for failure, in which case the song will
+            not be removed from the song list. Currently,
+            xmActivateSong() will never fail.
+
+    NOTE
+        In order to activate a song, you must own a shared lock
+        on it.  Please do not hog this lock for a long time when
+        xmActivateSong() returns, because most internal routines
+        try to lock the current song before taking any action.
+
+    SEE ALSO
+
+\fxmodule/xmAddHook                                           xmodule/xmAddHook
+
+    NAME
+        xmAddHookA -- Creates a new XModule Hook
+        xmAddHook -- Varargs stub for xmAddHookA
+
+    SYNOPSIS
+        hook = xmAddHookA(tagList)
+        D0                A0
+
+        struct XMHook *xmAddHookA(struct TagItem *);
+
+
+        hook = xmAddHook(Tag1,...)
+
+        struct XMHook *xmAddHook(ULONG,...);
+
+    FUNCTION
+        Creates a new XMHook structure and fills it in with data supplied
+        with the TagList. Adds the newly created Hook to the appropriate
+        list.
+
+    INPUTS
+        tagList - pointer to a tag list specifying how to initialize the
+            XMHook structure.
+
+    TAGS
+        XMHOOK_Type - (ULONG) Defines the pourpose of this hook. Possible
+            values are currently NT_XMLOADER and NT_XMSAVER. (This
+            tag is REQUIRED).
+
+        XMHOOK_Name - (STRPTR) ti_Data contains a short name for the
+            hook (e.g: "SoundTracker").  This name will appear in the
+            Savers list if this hook is a saver and will be passed as an
+            argument for some ARexx commands, so please use a single
+            word name.  (This tag is REQUIRED).
+
+        XMHOOK_Priority - (BYTE) Priority to give to this hook.  Hooks
+            with higher priorities will be used before lower priority
+            ones and will come first in lists shown to the user. Valid
+            range is -128..+127, but please restrict to a -20..+20
+            interval for normal cases. (Defaults to 0).
+
+        XMHOOK_Descr - (STRPTR) Verbose description of the hook
+            (without newlines). (Defaults to NULL).
+
+        XMHOOK_Author - (STRPTR) Author's name.  Please, just put
+            your full name here; no greetings, copyright notices,
+            etc. (Defaults to NULL).
+
+        XMHOOK_ID - (ULONG) This is a unique, IFF-style identifier for
+            the format.  If the format is an IFF format, it must be the
+            same of the FORM ID. (Defaults to 0, this tag is required
+            for IFF loaders and savers).
+
+        XMHOOK_Flags - (ULONG) Sets miscellaneous flags for this hook.
+            See xmodule.h for possible flags.
+
+        XMHOOK_LibraryBase - (struct Library *) Pointer to the library
+            base for external hooks.  This pointer will be used to open
+            the library when the hook is created and to close it when
+            the hook is deleted.  If you do not pass this tag, you must
+            find some other way to keep your code in memory until one
+            or more of your hooks are active.  XModule will close your
+            library just after calling the SetupXMHook() function.
+            (Defaults to NULL).
+
+        XMHOOK_UserData - (APTR) ti_Data will be stored in the
+            xmh_UserData field of the XMHook structure. This field can
+            come andy to store private data. (Defaults to NULL).
+
+        XMHOOK_RemoveHookFunc - (APTR) Pointer to a function which will be
+            called upon removing the hook.  This function can be used to
+            free any private resources allocated by the hook when it was
+            created. The template for the function is:
+
+                void RemoveHookFunc (struct XMHook *hook);
+                                     A0
+
+        XMHOOK_LoadModFunc - (APTR) Pointer to the hook function which
+            loads a module. The template for the function is:
+
+                LONG LoadModFunc (BPTR fileHandle, struct SongInfo *song,
+                                  D0               A0
+                    struct XMHook *loader);
+                    A1
+
+            `fileHandle' is an open file to load the module from. The
+            caller will take care to close it for you. The loader should
+            return RETURN_OK for success, or any other AmigaDOS error
+            code to mean failure.  In particular, RETURN_WARN indicates
+            that something went wrong, but the song is ok.  The special
+            error code ERROR_IOERR can be used when some dos.library
+            call (e.g.: Read()) failed.  In the latter case, the
+            AmigaDOS IoErr value should be set to explain the specific
+            cause of the problem.
+            (This tag is required by all NT_XMLOADER type hooks).
+
+        XMHOOK_SaveModFunc - (APTR) Pointer to the hook function which
+            saves a module. The template for the function is:
+
+                LONG SaveModFunc (BPTR fileHandle, struct SongInfo *song,
+                                  D0               A0
+                    struct XMHook *saver);
+                    A1
+
+            fileHandle is an open file to save the module to. The caller
+            will take care to close it for you. The saver should return
+            RETURN_OK for success, or any other AmigaDOS error code to
+            mean failure.  In particular, RETURN_WARN indicates that
+            something went wrong, but the song is ok.  The special
+            error code ERROR_IOERR can be used when some dos.library
+            call (e.g.: Read()) failed.  In the latter case, the
+            AmigaDOS IoErr value should be set to explain the specific
+            cause of the problem.
+            (This tag is required by all NT_XMSAVER type hooks).
+
+
+        XMHOOK_IdentifyModFunc - (APTR) Pointer to the hook function
+            which identifies a module format. The template for the
+            function is:
+
+                struct XMHook *IdentifyModFunc (BPTR fileHandle,
+                                                D0
+                    struct XMHook *hook,struct TagItem *tagList);
+                    A0                  A1
+
+            fileHandle is an open file to try the identification on. The
+            caller will take care to close it. NOTE: Do not make assumptions
+            on the initial file position (e.g: seek yourself to position 0
+            if you need to). This funtion should return a pointer to a valid
+            loader (usually the one passed in) if the format is recognized,
+            NULL otherwhise.  (This tag is required by all NT_XMLOADER type
+            hooks).
+
+    RESULT
+        hook - Pointer to the newly allocated XMHook structure, or
+            NULL for failure.
+
+    SEE ALSO
+        xmRemHook(), xmIdentifyModule(), xmLoadSong(), xmSaveSong()
+
+\fxmodule/xmAddInstrumentA                             xmodule/xmAddInstrumentA
+
+    NAME
+        xmAddInstrumentA -- Adds a instrument to a song
+        xmAddInstrument -- Varargs stub for xmAddInstrumentA
+
+    SYNOPSIS
+        instrument = xmAddInstrumentA(si, instrNum, tagList)
+        D0                            A0  D0        A1
+
+        struct Instrument *xmAddInstrumentA(struct SongInfo *,LONG,
+            struct TagItem *);
+
+
+        instrument = xmAddInstrument(si,instrNum,tag1,...)
+
+        struct Instrument *xmAddInstrument(struct SongInfo *,LONG,LONG,...);
+
+    FUNCTION
+        Adds an instrument to a song by calling the SNGM_ADDINSTRUMENT method
+.
+
+    INPUTS
+        si - pointer to the song to which the instrument should be added.
+        tagList - optional TagList.  See SNGM_ADDINSTRUMENT for possible tags
+.
+
+    RESULT
+        Pointer to the new instrument or NULL for failure.
+
+    NOTE
+        In order to add instruments, you should have exclusive access to
+        the song.  Always obtain a lock before you call this function on
+        public songs.
+
+    SEE ALSO
+        xmRemInstrument(), songclass/SNGM_REMINSTRUMENT
+
+\fxmodule/xmAddPatternA                                   xmodule/xmAddPatternA
+
+    NAME
+        xmAddPatternA -- Adds a pattern to a song
+        xmAddPattern -- Varargs stub for xmAddPatternA
+
+    SYNOPSIS
+        pattern = xmAddPatternA(si, tagList)
+        D0                      A0  A1
+
+        struct Pattern *xmAddPatternA(struct SongInfo *,struct TagItem *);
+
+
+        pattern = xmAddPattern (si,tag1,...)
+
+        struct Pattern *xmAddPattern(struct SongInfo *,LONG Tag1,...);
+
+    FUNCTION
+        Adds a pattern to a song by calling the SNGM_ADDPATTERN method.
+
+    INPUTS
+        si - pointer to the song to which the pattern should be added.
+        tagList - optional TagList.  See SNGM_ADDPATTERN for possible tags.
+
+    RESULT
+        Pointer to the new pattern or NULL for failure.
+
+    NOTE
+        In order to add patterns, you should have exclusive access to
+        the song.  Always obtain a lock before you call this function on
+        public songs.
+
+    SEE ALSO
+        xmRemPattern(), songclass/SNGM_ADDPATTERN
+
+\fxmodule/xmAddSongA                                         xmodule/xmAddSongA
+
+    NAME
+        xmAddSongA -- Add a song to the song list
+        xmAddSong -- Varargs stub for xmAddSongA
+
+    SYNOPSIS
+        success = xmAddSongA(songInfo,position,tagList);
+        D0                   A0       A1       A2
+
+        ULONG xmAddSongA(struct SongInfo *,struct SongInfo *,
+            struct TagItem *);
+
+
+        success = xmAddSong(songInfo,position,tag1,...);
+
+        ULONG xmAddSong(struct SongInfo *,struct SongInfo *,
+            LONG,...);
+
+    FUNCTION
+        Adds a song to the public song list. Trying to add a song
+        twice is harmless.
+
+    INPUTS
+        songInfo - song to be added.  Passing a NULL pointer is safe.
+        position - Position to add the song in.  Passing NULL adds the
+            song in the head of the list, while ~0 adds it in the tail.
+            passing a pointer to a SongInfo already in the list inserts
+            the first song _after_ the other one.
+        tagList - pointer to a TagList for more arguments.
+
+    TAGS
+        XMSNG_Active - (BOOL) Makes this song the active one. The
+            default is to just add the song without activating it.
+
+    RESULT
+        success - Will be 0 for failure, in which case the song will
+            not be added to the songs list. Currently, xmAddSongA()
+            will never fail.
+
+    NOTE
+        The song list is protected from multiple tasks access by a
+        SignalSemaphore in XModuleBase. This call will wait if the
+        song list has been locked by another task. Beware of deadlock
+        conditions!
+
+    SEE ALSO
+        xmRemSong()
+
+\fxmodule/xmCreateSong                                     xmodule/xmCreateSong
+
+    NAME
+        xmCreateSongA -- Create and initialize a new SongInfo structure
+        xmCreateSong -- Varargs stub for xmCreateSongA
+
+    SYNOPSIS
+        songInfo = xmCreateSongA(tagList);
+        D0                      A0
+
+        struct SongInfo *xmCreateSongA(struct TagItem *);
+
+
+        songInfo = xmCreateSong(Tag1,...);
+
+        struct SongInfo *xmCreateSong(ULONG,...);
+
+    FUNCTION
+        Allocates and initializes a new SongInfo structure.  The song
+        can then be added to the song list via xmAddSongA(), in which
+        case, it is no longer required to free it with xmDeleteSong().
+
+    INPUTS
+        tagList - pointer to an optional tag list specifying how to
+            initialize the SongInfo structure.
+
+    TAGS
+        SNGA_DefaultTracks - Sets the default number of pattern tracks for
+            the song. Defaults to 4.
+
+        SNGA_DefaultPattLen - Sets the default number of pattern lines for
+            the song. Defaults to 64.
+
+        SNGA_ReadyToUse - Adds one pattern and one position to the song.
+            Defaults to FALSE.
+
+        XMSNG_AddToList - (struct SongInfo *) Add the song to the song list.
+            When a song is being added to the list, a shared lock is
+            obtained on it to prevent other tasks from modifying (or even
+            remove) the song before you can do your job on it. IT IS YOUR
+            DUTY TO UNLOCK THE SONG as soon as you are done modifying it.
+            Passing NULL adds the song on the head of the list, while -1
+            (~0) will add it to the end of the SongList. Passing in a
+            pointer to another song which is already in the list, will
+            add the new song _after_ the latter.
+            (Default is not adding the song).
+
+        XMSNG_Active - (BOOL) Makes this song the active one. This tag is
+            considered only if the XMSNG_AddToList tag is also passed.
+
+    RESULT
+        songInfo - pointer to the newly allocated SongInfo structure, or
+            NULL for failure.
+
+    SEE ALSO
+        xmDeleteSong(), xmAddSongA()
+
+\fxmodule/xmDeleteSong                                     xmodule/xmDeleteSong
+
+    NAME
+        xmDeleteSong -- Deletes a song
+
+    SYNOPSIS
+        xmDeleteSong(songInfo)
+                     A0
+
+        void xmDeleteSong(struct SongInfo *);
+
+    FUNCTION
+        Deletes a song and all the items attached to it (patterns,
+        instruments, etc.).  This call will also remove the song from
+        the song list if it had been added to it.
+
+    INPUTS
+        songInfo - pointer to the SongInfo structure to be deleted.
+            Passing a NULL pointer is harmless.
+
+    NOTE
+        In order to delete a song which has been added to the public
+        song list, you must first obtain an exclusive lock on it to
+        prevent other tasks from walking on it while you are freeing
+        it's data structures.  The semaphore does NOT need to be
+        relinquished, because the SongInfo structure won't exist any
+        more when this call returns.
+
+    SEE ALSO
+        xmCreateSong(), xmRemSong()
+
+\fxmodule/xmDisplayMessage                             xmodule/xmDisplayMessage
+
+    NAME
+        xmDisplayMessageA -- Displays a message to the user
+        xmDisplayMessage -- Varargs stub for xmDisplayMessageA()
+
+    SYNOPSIS
+        xmDisplayMessageA(level, message, args)
+                          DO     A0       A1
+
+        void xmDisplayMessageA(ULONG,APTR,LONG *);
+
+
+        xmDisplayMessage(level, message, ...)
+
+        void xmDisplayMessage(ULONG,APTR,...);
+
+    FUNCTION
+        Outputs a string in the XModule log window or in the 'action' field
+        of the progress indicator.  The string is printf-formatted before
+        being output.
+
+    INPUTS
+        level - a number from 0 to 7 which indicates the importance of the
+            message.  7 is used for very annoying messages (eg: debug output)
+,
+            0 for very important things (eg: disaster).
+            If you set the XMDMF_USECATALOG bit in the level parameter, you
+            can pass a catalog string number instead of a pointer to a string
+.
+            Specifying XMDMF_ACTION, the message will be put in the 'action'
+            field of the progress indicator.
+            If the flag XMDMF_DOSFAULT is specified, a Fault() output is
+            formatted using the message as an header.  In this case, the
+            level parameter takes another meaing: The lower word can contain
+            an AmigaDOS error code. If it is 0, IoErr() will be used to get
+            the error code.
+        message - pointer to a string or catalog message number,
+            when the XMDMF_USECATALOG flag is set.
+        args - arguments for formatting.
+
+    EXAMPLES
+        xmDisplayMessage (XMDMF_ALERT,
+            "The application `%s' fucked up Windoze95 because %s.",
+            "(unknown name)", "an error occurred");
+
+        xmDisplayMessage (XMDMF_USE_CATALOG | XMDMF_COMMENT,
+            MSG_LIFE_UNIVERSE_AND_ALLTHAT, 42, "Fortytwo", "For tea too");
+
+        xmDisplayMessageA (XMDMF_ACTION | XMDMF_USECATALOG,
+            MSG_READING_COMICS, NULL);
+
+        xmDisplayMessage (XMDMF_DOSFAULT | XMDMF_USECATALOG,
+            MSG_CANT_LOAD_MODULE, ModuleName);
+
+    SEE ALSO
+        xmDisplayProgress()
+
+\fxmodule/xmDisplayProgress                           xmodule/xmDisplayProgress
+
+    NAME
+        xmDisplayProgress -- Uptdates the progress bar indicator
+
+    SYNOPSIS
+        abort = xmDisplayProgress(done, total)
+                                  D0    D1
+
+        LONG xmDisplayMessageA(ULONG,ULONG);
+
+    FUNCTION
+        Updates the position of the fuel gauge in the progress window to
+        show the progress of an operation.  Additionally, it checks for
+        user abort.
+
+    INPUTS
+        done - a number which indicates how much of the work has
+            been already completed
+        total - Total number of operations to do.
+
+    RESULT
+        0 for success, ERROR_BREAK if user abort was detected.  You should
+        always check this return code to abort what you were doing.
+
+\fxmodule/xmIdentifyModule                             xmodule/xmIdentifyModule
+
+    NAME
+        xmIdentifyModule -- Returns the type of a module
+
+    SYNOPSIS
+        loader = xmIdentifyModule(fh, tagList)
+        D0                        D0  A0
+
+        struct XMHook *xmIdentifyModule(BPTR,struct TagItem *);
+
+    FUNCTION
+        Finds out a loader which is able to read the given module.
+
+    INPUTS
+        fh - AmigaDOS FileHandle to examine.
+        tagList - Additional parameters. Leave it NULL for now.
+
+    RESULT
+        loader - Pointer to the first loader which knows how to load this
+            module, or NULL otherwise.
+
+    NOTE
+        Before you call this function, you must first obtain a lock on the
+        loaders list to protect yourself from other tasks which might remove
+        the returned loader before you can actually use it.
+
+    SEE ALSO
+
+\fxmodule/xmLoadModuleA                                   xmodule/xmLoadModuleA
+
+    NAME
+        xmLoadModuleA -- Loads a module and converts it in XModule format
+        xmLoadModule -- Varargs stub for xmLoadModuleA
+
+    SYNOPSIS
+        songInfo = xmLoadModuleA(fileName,tagList)
+        D0                       A0       A1
+
+        struct SongInfo *xmLoadModuleA(STRPTR,struct TagItem *);
+
+
+        songInfo = xmLoadModule(fileName,tag,...)
+
+        struct SongInfo *xmLoadModule(STRPTR,LONG,...);
+
+    FUNCTION
+        Loads fileName using the correct module loader.
+
+    INPUTS
+        fileName - File to read. Can be NULL if the XMSNG_FileHandle
+            tag is passed.
+        tagList - Additional parameters (see below).  Can be NULL.
+
+    TAGS
+        XMSNG_OldSong - ti_Data is the pointer to a SongInfo which will be
+            freed as soon as the module format has been determined.  This
+            is useful when the user wants to replace a song with another
+            one.  Passing NULL uses the currently active song.
+
+        XMSNG_AddToList - (struct SongInfo *) Add the song to the song list.
+            When a song is being added to the list, a shared lock is
+            obtained on it to prevent other tasks from modifying (or even
+            remove) the song before you can do your job on it. IT IS YOUR
+            DUTY TO UNLOCK THE SONG as soon as you are done modifying it.
+            Passing NULL adds the song on the head of the list, while -1
+            (~0) will add it to the end of the SongList. Passing in a
+            pointer to another song which is already in the list, will
+            add the new song _after_ the latter.
+            (Default is not adding the song).
+
+        XMSNG_Loader - (struct XMHook *) Disables automatic format
+            checking and forces loading the module with the given
+            loader. (Defaults to NULL).
+
+        XMSNG_FileHandle - (BPTR) pointer to an open AmigaDOS
+            FileHandle to read the module from.  The file must
+            already be positioned over the beginning of the module data.
+            NOTE: Even if this tag is passed, the fileName parameter is
+                still used to fill in the SongName field in case it is
+                missing inside the module AND the filesystem does not
+                support the ACTION_EXAMINE_FH packet.
+            NOTE: Some loaders may require a fully seekable file, so be
+                careful when using pipes.
+            NOTE: automatic data decompression is not possible when
+                XMSNG_FileHandle is passed.
+            (Defaults to NULL).
+
+        XMSNG_IFFHandle - (BPTR) pointer to an already initialized
+            IFFHandle to read the module from.  The IFF must
+            already be positioned over the beginning of the module FORM.
+            Even if this tag is passed, the fileName parameter is still
+            used to fill in the SongName field in case it is missing
+            inside the module.
+            NOTE: The iffparse.library can deal with non-seekable files,
+                but some loaders may require a fully seekable file, so be
+                careful when using pipes.
+            NOTE: automatic file decompression is not possible when
+                XMSNG_IFFHandle is passed.
+            (Defaults to NULL).
+
+        XMSNG_Active - (BOOL) Makes this song the active one. This tag is
+            considered only if the XMSNG_AddToList tag is also passed.
+
+    RESULT
+        songInfo - Pointer to the newly allocated SongInfo structure, or
+            NULL for failure.  This function will not fail if the module is
+            partially corrupted. Anyway, the returned SongInfo will always
+            be valid. You can check IoErr() to know if there were problems.
+
+    EXAMPLE
+        /* Load a song and add it to the SongList */
+        si = xmLoadSongTags (file, NULL,
+            XMSNG_AddToList, (struct SongInfo *)~0,
+            TAG_DONE);
+
+        /* Check for errors even if si is not NULL */
+        error = IoErr();
+
+        /* Release Semaphore got by xmLoadSong() */
+        if (si) ReleaseSemaphore (&si->Lock);
+
+    SEE ALSO
+        xmAddSongA(), xmIdentifyModule()
+
+\fxmodule/xmLockActiveSong                             xmodule/xmLockActiveSong
+
+    NAME
+        xmLockActiveSong -- Obtains an lock on the active song
+
+    SYNOPSIS
+        song = xmLockActiveSong(mode);
+        D0                        D0:16
+
+        struct SongInfo *xmActivateSong(UWORD);
+
+    FUNCTION
+        Obtains an exclusive or shared lock on the active song,
+        waiting if needed.  This call is a shortcut to:
+
+            ObtainSemaphoreShared (&XModuleBase->xm_BaseLock);
+            ObtainSemaphore[Shared] (&XModuleBase->xm_CurrentSong.Lock);
+            ReleaseSemaphore (&XModuleBase->xm_BaseLock);
+
+        To unlock a song obtained in this way, you just need to
+        ReleaseSemaphore() it.
+
+        You MUST always lock a song before you even think to
+        read from -or write to- its data!
+
+    INPUTS
+        mode - one of SM_SHARED or SM_EXCLUSIVE.
+
+    RESULT
+        song - Pointer to the song which *was* active at the time
+            you called xmLockActiveSong().  The song will be
+            locked for you.  The result will be NULL if no song
+            is active.
+
+    NOTE
+        Please be careful if you call this function while holding
+        locks on other songs.  Doing so, you run the risk of causing
+        deadlock condition.
+        This function does only lock the song; it is NOT guaranteed
+        that it will remain the active one.
+
+    SEE ALSO
+
+\fxmodule/xmProcessSongA                                 xmodule/xmProcessSongA
+
+    NAME
+        xmProcessSongA -- Performs complex processing on a song
+        xmProcessSong -- Varargs stub for xmProcessSongA()
+
+    SYNOPSIS
+        result = xmProcessSongA(si, reserved, tagList)
+                                A0  A1,       A2
+
+        LONG xmProcessSongA(struct SongInfo *,void *,struct TagItem *);
+
+
+        result = xmProcessSong(si, reserved, tag1, ...)
+
+        LONG xmProcessSongA(struct SongInfo *,void *,LONG,...);
+
+    FUNCTION
+        Performs complex processing operations on a song.
+
+    INPUTS
+        si - pointer to the song to be processed.
+        reserved - Reserved for future use.
+        tagList - List of arguments.  See below for possible tags.
+
+    RESULT
+        The result depends on the kind of operation done.  For most
+        operations, it's value will be 0 to indicate success and
+        an AmigaDOS error code which indicates the cause for failure.
+
+    TAGS
+        XMSNG_Optimize - (LONG).  Tries to reduce the song size by removing
+            all unused data.  Possible optimizations are:
+                - XMOF_REM_UNUSED_PATTERNS
+                - XMOF_REM_DUP_PATTERNS
+                - XMOF_CUT_PATTERNS
+                - XMOF_REM_UNUSED_INSTRS
+                - XMOF_CUT_INSTR_LOOPS
+                - XMOF_CUT_INSTR_TAILS
+                - XMOF_DEFAULT
+            XMOF_DEFAULT will select all the optimizations choosen by
+            the user in addition to the ones specified with the other flags.
+
+        XMSNG_RemapInstruments - (BOOL) Performs instruments remapping.
+
+        XMSNG_LimitPatterns - (UWORD,UWORD) Limits the length all the
+            patterns inside a minimum and maximum value.  The upper 16bits
+            of the argument are the minimum value, the lower ones are
+            the maximum value.  Patterns outside this limits will be grown
+            or split as appropriate.
+
+        XMSNG_Join - (struct SongInfo *) - Joins the song with another one.
+
+        XMSNG_Merge - (struct SongInfo *) - Merges the song with another one.
+
+    NOTE
+        In order to process a song, you should have exclusive access to
+        it.  Always obtain a lock before you call this function on
+        public songs.
+
+\fxmodule/xmRemHook                                           xmodule/xmRemHook
+
+    NAME
+        xmRemHook -- Removes an XModule Hook
+
+    SYNOPSIS
+        xmRemHookA(xmHook)
+                   A0
+
+        void xmRemHook(struct XMHook *);
+
+    FUNCTION
+        Removes an XModule Hook, calls its RemoveHookFunc() and then
+        frees its memory.
+
+    INPUTS
+        xmHook - pointer to the hook to be removed.
+
+    SEE ALSO
+        xmAddHook()
+
+\fxmodule/xmRemInstrument                               xmodule/xmRemInstrument
+
+    NAME
+        xmRemInstrument -- Removes an instrument from a song
+
+    SYNOPSIS
+        xmRemInstrument(si, instrNum)
+                        A0  D0
+
+        void xmRemInstrument(struct SongInfo *,LONG);
+
+    FUNCTION
+        Removes an instrument from a song by calling the SNGM_REMINSTRUMENT
+        method.
+
+    INPUTS
+        si - pointer to the song to which the instrument should be removed.
+        mum - Number of the instrument to be removed.
+
+    NOTE
+        In order to remove instruments, you should have exclusive access to
+        the song.  Always obtain a lock before you call this function on
+        public songs.
+
+    SEE ALSO
+        xmAddInstrumentA(), songclass/SNGM_REMINSTRUMENT
+
+\fxmodule/xmRemPattern                                     xmodule/xmRemPattern
+
+    NAME
+        xmRemPattern -- Removes a pattern from a song
+
+    SYNOPSIS
+        xmRemPattern(si, pattNum, replaceWith)
+                     A0  D0,      D1
+
+        void xmRemPattern(struct SongInfo *,LONG,LONG);
+
+    FUNCTION
+        Removes a pattern from a song by calling the SNGM_REMPATTERN method.
+
+    INPUTS
+        si - pointer to the song to which the pattern should be removed.
+        mum - Number of the pattern to be removed.
+        replaceWith - What to put in the song sequence in place of the
+            deleted pattern.
+
+    NOTE
+        In order to remove patterns, you should have exclusive access to
+        the song.  Always obtain a lock before you call this function on
+        public songs.
+
+    SEE ALSO
+        xmAddPatternA(), songclass/SNGM_REMPATTERN
+
+\fxmodule/xmRemSong                                           xmodule/xmRemSong
+
+    NAME
+        xmRemSong -- Remove a song from the song list
+
+    SYNOPSIS
+        success = xmRemSong(songInfo);
+        D0                  A0
+
+        ULONG xmRemSong(struct SongInfo *);
+
+    FUNCTION
+        Removes a song from the public song list. It is safe to call this
+        function even if the song has not been added to the song list. If
+        the passed SongInfo is the active one, another song will be
+        selected automatically.
+
+    INPUTS
+        songInfo - song to be removed. If NULL, this function will take
+            no action.
+
+    RESULT
+        success - Will be 0 for failure, in which case the song will
+            not be removed from the song list. Currently,
+            xmRemSong() will never fail.
+
+    NOTE
+        In order to remove a song, you must first obtain an exclusive
+        lock on it.
+
+        The song list is also protected from multiple task access by
+        a SignalSemaphore. This call will wait if the song list has
+        been locked by another task. Beware of deadlock conditions!
+
+    SEE ALSO
+        xmAddSongA()
+
+\fxmodule/xmSaveModuleA                                   xmodule/xmSaveModuleA
+
+    NAME
+        xmSaveModuleA -- Saves a module to the specified file format
+        xmSaveModule -- Varargs stub for xmSaveModuleA
+
+    SYNOPSIS
+        error = xmSaveModuleA(songInfo, fileName, saver, tagList)
+        D0                    A0        A1        A2     A3
+
+        LONG xmSaveModuleA(struct SongInfo *,STRPTR,struct XMHook *,
+            struct TagItem *);
+
+
+        error = xmSaveModule(songInfo, fileName, saver, tag1,...)
+
+        LONG xmSaveModule(struct SongInfo *,STRPTR,struct XMHook *,
+            LONG,...);
+
+    FUNCTION
+        Saves songInfo to fileName using the specified saver.
+
+    INPUTS
+        songInfo - Song to save.
+        fileName - AmigaDOS filename to write the song to.
+        saver - Pointer to the saver to use.  Pass NULL to use
+            the default saver.
+
+    TAGS
+        No tags are defined for this call.
+
+    RESULT
+        error - RETURN_OK for success, or any other AmigaDOS error code
+            to mean failure.  In particular, RETURN_WARN indicates that
+            something went wrong, but the song is still ok. The special
+            error code ERROR_IOERR means that some dos.library
+            call (e.g.: Read()) failed.  In the latter case, the
+            AmigaDOS IoErr() value will be set to explain the specific
+            cause of the problem.
+
+    SEE ALSO
+
+\fxmodule/xmSetInstrumentA                             xmodule/xmSetInstrumentA
+
+    NAME
+        xmSetInstrumentA -- Sets an instrument's attributes
+        xmSetInstrument -- Varargs stub for xmSetInstrumentA
+
+    SYNOPSIS
+        success = xmSetInstrumentA(si, instrNum, tagList)
+        D0                         A0  D0        A1
+
+        ULONG xmSetInstrumentA(struct SongInfo *,LONG,
+            struct TagItem *);
+
+
+        success = xmSetInstrument(si,instrNum,tag1,...)
+
+        ULONG xmSetInstrument(struct SongInfo *,LONG,LONG,...);
+
+    FUNCTION
+        Sets an instrument's attributes by calling the SNGM_SETINSTRUMENT
+        method.
+
+    INPUTS
+        si - pointer to the song which contains the instrument to be set.
+        tagList - instrument attributes to set.  See SNGM_SETINSTRUMENT
+            for possible tags.
+
+    RESULT
+        non zero for success.
+
+    NOTE
+        In order to set instruments' attributes, you should have
+        exclusive access to the song.  Always obtain a lock before
+        you call this function on public songs.
+
+    SEE ALSO
+        xmAddInstrument(), songclass/SNGM_SETINSTRUMENT
+
+\fxmodule/xmSetPatternA                                   xmodule/xmSetPatternA
+
+    NAME
+        xmSetPatternA -- Sets pattern attributes
+        xmSetPattern -- Varargs stub for xmSetPatternA
+
+    SYNOPSIS
+        success = xmSetPatternA(si, pattNum, tagList)
+        D0                      A0  D0       A1
+
+        ULONG xmSetPatternA(struct SongInfo *,ULONG,struct TagItem *);
+
+
+        success = xmSetPattern (si,pattNum,tag1,...)
+
+        ULONG xmSetPattern(struct SongInfo *,ULONG,LONG Tag1,...);
+
+    FUNCTION
+        Sets attributes of a pattern by calling the SNGM_SETPATTERN method.
+
+    INPUTS
+        si - pointer to the song which contains the pattern to be set.
+        tagList - list of attributes to set.  See SNGM_SETPATTERN for
+            possible tags.
+
+    RESULT
+        Non zero for success
+
+    NOTE
+        In order to set patterns attributes, you should have exclusive
+        access to the song.  Always obtain a lock before you call this
+        function on public songs.
+
+    SEE ALSO
+        xmAddPattern(), songclass/SNGM_SETPATTERN
+
+\fxmodule/xmSetSongLen                                     xmodule/xmSetSongLen
+
+    NAME
+        xmSetSongLen -- Set the number of song positions
+
+    SYNOPSIS
+        sequence = xmSetSongLen(songInfo, length)
+        D0                      A0        D0:16
+
+        UWORD *xmSetSongLen(struct SongInfo *, UWORD);
+
+    FUNCTION
+        Allocates space in the song for a sequence table of the given
+        length. If no sequence exists yet, a new one is allocated.
+        Increasing the song length may require the sequence table to be
+        expanded, in which case it will be re-allocated and the old sequence
+        entries will be copied. Decreasing the song length could also cause
+        a reallocation of the sequence table if the size drops down enough.
+        Setting the song length to 0 will free the sequence table and return
+        NULL.
+
+    INPUTS
+        songInfo - pointer to a SongInfo structure.
+        length - new length of song sequence table.
+
+    NOTE
+        This function will also adjust the CurrentPos field if it is found
+        beyond the song end
+
+    BUGS
+        This funtion is quite useless because all it does is setting the
+        SNGA_Length attribute in the song object.  Setting the SNGA_Length
+        attribute yourself is easier and faster if you are already setting
+        other attributes in the same song.
+
+   RESULT
+        Pointer to the newly allocated sequence table or NULL for failure,
+        in which case the previous sequence table is left untouched.
+
+\f
\ No newline at end of file
diff --git a/BoopsiStubs.h b/BoopsiStubs.h
new file mode 100644 (file)
index 0000000..a8202c7
--- /dev/null
@@ -0,0 +1,181 @@
+#ifndef BOOPSISTUBS_H
+#define BOOPSISTUBS_H
+/*
+**     $VER: BoopsiStubs.h 1.2 (1.9.97)
+**
+**     Copyright (C) 1997 Bernardo Innocenti. All rights reserved.
+**
+**     Use 4 chars wide TABs to read this file
+**
+**     Using these inline versions of the amiga.lib boopsi support functions
+**     results in faster and smaller code against their linked library
+**     counterparts. When debug is active, these functions will also
+**     validate the parameters you pass in.
+**
+*/
+
+#ifndef COMPILERSPECIFIC_H
+#include "CompilerSpecific.h"
+#endif /* COMPILERSPECIFIC_H */
+
+#ifndef DEBUG_H
+#include "Debug.h"
+#endif /* DEBUG_H */
+
+/* This definition will prevent the redefinition of the following stubs with
+ * their amiga.lib equivalents. This only works if you are using a patched
+ * version of <clib/alib_protos.h>
+ */
+#define USE_BOOPSI_STUBS
+
+
+
+/* the _HookPtr type is a shortcut for a pointer to a hook function */
+
+typedef ASMCALL ULONG (*_HookPtr)
+       (REG(a0, Class *), REG(a2, Object *), REG(a1, APTR));
+
+INLINE ULONG CoerceMethodA (struct IClass *cl, Object *o, Msg message)
+{
+       ASSERT_VALIDNO0(cl)
+       ASSERT_VALID(o)
+
+       return ((_HookPtr)cl->cl_Dispatcher.h_Entry) ((APTR)cl, (APTR)o, (APTR)message);
+}
+
+INLINE ULONG DoSuperMethodA (struct IClass *cl, Object *o, Msg message)
+{
+       ASSERT_VALIDNO0(cl)
+       ASSERT_VALID(o)
+
+       cl = cl->cl_Super;
+       return ((_HookPtr)cl->cl_Dispatcher.h_Entry) ((APTR)cl, (APTR)o, (APTR)message);
+}
+
+INLINE ULONG DoMethodA (Object *o, Msg message)
+{
+       Class *cl;
+       ASSERT_VALIDNO0(o)
+       cl = OCLASS (o);
+       ASSERT_VALIDNO0(cl)
+
+       return ((_HookPtr)cl->cl_Dispatcher.h_Entry) ((APTR)cl, (APTR)o, (APTR)message);
+}
+
+
+
+/* Var-args versions of the above functions.  SAS/C is clever enough to inline these,
+ * while gcc and egcs refuse to inline a function with '...' (yikes!).  The GCC
+ * versions of these functions are macro blocks similar to those  used in the
+ * inline/#?.h headers.
+ */
+#if defined(__SASC) || defined (__STORM__)
+
+       INLINE ULONG CoerceMethod (struct IClass *cl, Object *o, ULONG MethodID, ...)
+       {
+               ASSERT_VALIDNO0(cl)
+               ASSERT_VALID(o)
+
+               return ((_HookPtr)cl->cl_Dispatcher.h_Entry) ((APTR)cl, (APTR)o, (APTR)&MethodID);
+       }
+
+       INLINE ULONG DoSuperMethod (struct IClass *cl, Object *o, ULONG MethodID, ...)
+       {
+               ASSERT_VALIDNO0(cl)
+               ASSERT_VALID(o)
+
+               cl = cl->cl_Super;
+               return ((_HookPtr)cl->cl_Dispatcher.h_Entry) ((APTR)cl, (APTR)o, (APTR)&MethodID);
+       }
+
+       INLINE ULONG DoMethod (Object *o, ULONG MethodID, ...)
+       {
+               Class *cl;
+
+               ASSERT_VALIDNO0(o)
+               cl = OCLASS (o);
+               ASSERT_VALIDNO0(cl)
+
+               return ((_HookPtr)cl->cl_Dispatcher.h_Entry) ((APTR)cl, (APTR)o, (APTR)&MethodID);
+       }
+
+       /* varargs stub for the OM_NOTIFY method */
+       INLINE void NotifyAttrs (Object *o, struct GadgetInfo *gi, ULONG flags, Tag attr1, ...)
+       {
+               ASSERT_VALIDNO0(o)
+               ASSERT_VALID(gi)
+
+               DoMethod (o, OM_NOTIFY, &attr1, gi, flags);
+       }
+
+       /* varargs stub for the OM_UPDATE method */
+       INLINE void UpdateAttrs (Object *o, struct GadgetInfo *gi, ULONG flags, Tag attr1, ...)
+       {
+               ASSERT_VALIDNO0(o)
+               ASSERT_VALID(gi)
+
+               DoMethod (o, OM_UPDATE, &attr1, gi, flags);
+       }
+
+#elif defined(__GNUC__)
+
+       #define CoerceMethod(cl, o, msg...)                                                                                             \
+       ({                                                                                                                                                              \
+               ULONG _msg[] = { msg };                                                                                                         \
+               ASSERT_VALIDNO0(cl)                                                                                                                     \
+               ASSERT_VALID(o)                                                                                                                         \
+               ((_HookPtr)cl->cl_Dispatcher.h_Entry) ((APTR)cl, (APTR)o, (APTR)_msg);          \
+       })
+
+       #define DoSuperMethod(cl, o, msg...)                                                                                    \
+       ({                                                                                                                                                              \
+               Class *_cl;                                                                                                                                     \
+               ULONG _msg[] = { msg };                                                                                                         \
+               ASSERT_VALID(o)                                                                                                                         \
+               ASSERT_VALIDNO0(cl)                                                                                                                     \
+               _cl = cl = cl->cl_Super;                                                                                                        \
+               ASSERT_VALIDNO0(_cl)                                                                                                            \
+               ((_HookPtr)_cl->cl_Dispatcher.h_Entry) ((APTR)_cl, (APTR)o, (APTR)_msg);        \
+       })
+
+       #define DoMethod(o, msg...)                                                                                                             \
+       ({                                                                                                                                                              \
+               Class *_cl;                                                                                                                                     \
+               ULONG _msg[] = { msg };                                                                                                         \
+               ASSERT_VALIDNO0(o)                                                                                                                      \
+               _cl = OCLASS(o);                                                                                                                        \
+               ASSERT_VALIDNO0(_cl)                                                                                                            \
+               ((_HookPtr)_cl->cl_Dispatcher.h_Entry) ((APTR)_cl, (APTR)o, (APTR)_msg);        \
+       })
+
+       /* Var-args stub for the OM_NOTIFY method */
+       #define NotifyAttrs(o, gi, flags, attrs...)                                                                             \
+       ({                                                                                                                                                              \
+               Class *_cl;                                                                                                                                     \
+               ULONG _attrs[] = { attrs };                                                                                                     \
+               ULONG _msg[] = { OM_NOTIFY, (ULONG)_attrs, (ULONG)gi, flags };                          \
+               ASSERT_VALIDNO0(o)                                                                                                                      \
+               _cl = OCLASS(o);                                                                                                                        \
+               ASSERT_VALIDNO0(_cl)                                                                                                            \
+               ASSERT_VALID(gi)                                                                                                                        \
+               ((_HookPtr)_cl->cl_Dispatcher.h_Entry) ((APTR)_cl, (APTR)o, (APTR)_msg);        \
+       })
+
+       /* Var-args stub for the OM_UPDATE method */
+       #define UpdateAttrs(o, gi, flags, attrs...)                                                                             \
+       ({                                                                                                                                                              \
+               Class *_cl;                                                                                                                                     \
+               ULONG _attrs[] = { attrs };                                                                                                     \
+               ULONG _msg[] = { OM_UPDATE, (ULONG)_attrs, (ULONG)gi, flags };                          \
+               ASSERT_VALIDNO0(o)                                                                                                                      \
+               _cl = OCLASS(o);                                                                                                                        \
+               ASSERT_VALIDNO0(_cl)                                                                                                            \
+               ASSERT_VALID(gi)                                                                                                                        \
+               ((_HookPtr)_cl->cl_Dispatcher.h_Entry) ((APTR)_cl, (APTR)o, (APTR)_msg);        \
+       })
+#endif
+
+/* Nobody else needs this anymore... */
+#undef _HookPtr
+
+#endif /* !BOOPSISTUBS_H */
diff --git a/Catalogs/HowToTranslate.doc b/Catalogs/HowToTranslate.doc
new file mode 100644 (file)
index 0000000..016bdce
--- /dev/null
@@ -0,0 +1,61 @@
+
+How to make a new catalog for XModule
+*************************************
+
+ This file contains all the strings used in XModule.  Lines beginning with
+a semicolon (;) are comments and are ignored by the catalog generator.
+Every string is made up two lines:
+
+    MSG_READING_TYPE_MODULE_CHN (//)
+    Reading %s module with %ld tracks...
+
+ The first line is a symbol which identifies its meaning inside XModule.
+You do not need to modify it.  The characters "(//)" are required by the
+catalog generator and shouldn't be modified.
+
+ The second line is the message itself.  You should insert the
+translation in your own language here.  In this example, the sequences
+"%s" and "%d" have a special meaning.  At run time, they will be replaced
+by a value, let's say "TakeTracker" and "12", so that the resulting
+string would become "Reading TakeTracker module with 12 tracks...".
+
+ Your language might require a different ordering of the % symbols in the
+sentence, for instance "12 tracks TakeTracker module...".  In this case,
+you can translate the string as follows:
+
+    %2$ld tracks %1$s module...
+
+ The template is %<position>$<sequence>, where <position> is the original
+position of the % command, <sequence> is the original command sequence.
+
+ For those amongst you who are not programmers, the meaning of some strings
+may be obscure.  For instance, you might find a string like "Ok|Cancel",
+which describes the possible answers to a requesters.  You should leave the
+'|' character alone and avoid inserting additional spaces before and after
+it.
+
+ Gadget labels have a "_GAD" postfix, while menu lables end with "_MEN".
+Some gadget labels will have underscore characters ('_') before their key
+shortcut.  When you translate these labels, you shoud try to keep the same
+key (ie: "_Good Morning" -> "Buon _Giorno").  If it isn't possible,
+choose another meaningful letter, but avoid using the same key for two
+different gadgets in the same window, otherwise the user will get confused.
+
+ To help you with the translation, the template catalog "Empty.ct" is
+provided.  This file has blank lines where the translated strings should
+be inserted, followed by comment lines with the original english string.
+Just rename it to <language>.ct and fill in all the empty lines.
+
+ When you are done with the translation, use a catalog generator like
+FlexCat, KitKat or CatComp to make the xxx.catalog file.  Then, test the
+new catalog with XModule and check that every message is correct.  To make
+a catalog with FlexCat, you can use the following command line:
+
+    FlexCat Catalogs/XModule.cd Catalogs/<language>.ct
+        CATALOG=Catalogs/<language>/XModule.catalog
+
+ Each time a new version of XModule gets released, the old catalogs will
+probably have to be updated to include all the new strings.  In this case,
+I'll send you the new catalog translation file and ask you to update it.
+Of course, you are free to refuse if you do not want to do it, but, please,
+let me know this in time, so I can look around for another translator.
diff --git a/Catalogs/Makefile b/Catalogs/Makefile
new file mode 100644 (file)
index 0000000..53b2951
--- /dev/null
@@ -0,0 +1,55 @@
+##
+## Make the stuff in the catalogs/ subdirectory
+##
+## NOTE: FlexCat is a locale catalog generator made by Jochen Wiedmann.
+## It can be found on Aminet in the archive "dev/misc/FlexCat.lha".
+
+
+include /config.mk
+
+LANGUAGES      = deutsch français italiano nederlands
+CATALOGS = $(LANGUAGES:%=%/$(PROJNAME).catalog)
+
+all: $(CATALOGS)
+
+clean:
+       -Delete $(CATALOGS)
+
+.PHONY: all clean NewCTFiles
+
+
+$(CATALOGS): %/$(PROJNAME).catalog : %.ct
+       FlexCat $(PROJNAME).cd $@ CATALOG=$<
+       @FileNote $< "$(@:%.ct=%) catalog for $(PROJNAME)"
+
+# All the catalogs depend on the master catalog descriptor
+$(CATALOGS): $(PROJNAME).cd
+
+
+# Make NewCTFiles to create updated CT files for all supported languages
+#
+NewCTFiles:
+       $(FLEXCAT) $(PROJNAME).cd italiano.ct NEWCTFILE italiano.ct
+       $(FLEXCAT) $(PROJNAME).cd deutsch.ct NEWCTFILE deutsch.ct
+       $(FLEXCAT) $(PROJNAME).cd français.ct NEWCTFILE français.ct
+       $(FLEXCAT) $(PROJNAME).cd nederlands.ct NEWCTFILE nederlands.ct
+       $(FLEXCAT) $(PROJNAME).cd NEWCTFILE empty.ct
+
+
+# old make rules, not used any more
+#
+#Catalogs/Italiano/XModule.catalog: Catalogs/italiano.ct
+#      FlexCat Catalogs/XModule.cd Catalogs/italiano.ct CATALOG=Catalogs/Italiano/XModule.catalog
+#      @FileNote Catalogs/Italiano/XModule.catalog "Italiano catalog for XModule translated by Steven Cantini"
+#
+#Catalogs/Deutsch/XModule.catalog: Catalogs/deutsch.ct
+#      FlexCat Catalogs/XModule.cd Catalogs/deutsch.ct CATALOG=Catalogs/Deutsch/XModule.catalog
+#      @FileNote Catalogs/Deutsch/XModule.catalog "Deutsch catalog for XModule translated by Michael Reichenbach"
+#
+#Catalogs/Français/XModule.catalog: Catalogs/français.ct
+#      FlexCat Catalogs/XModule.cd Catalogs/français.ct CATALOG=Catalogs/Français/XModule.catalog
+#      @FileNote Catalogs/Français/XModule.catalog "Français catalog for XModule translated by Julien Wilk"
+#
+#Catalogs/Nederlands/XModule.catalog: Catalogs/nederlands.ct
+#      FlexCat Catalogs/XModule.cd Catalogs/nederlands.ct CATALOG=Catalogs/Nederlands/XModule.catalog
+#      @FileNote Catalogs/Nederlands/XModule.catalog "Dutch catalog for XModule translated by Ji Yong Dijkhuis"
diff --git a/Catalogs/deutsch.ct b/Catalogs/deutsch.ct
new file mode 100644 (file)
index 0000000..bc36eb7
--- /dev/null
@@ -0,0 +1,1491 @@
+## version $VER: Deutsch.ct 1.0 (12.6.95)
+## language deutsch
+## codeset 0
+;
+## chunk AUTH Deutsch catalog translation by Michael Reichenbach <htw564@htw-dresden.de>
+;**
+;** XModule.cd 3.9
+;**
+;** Copyright (C) 1995,96 Bernardo Innocenti
+;**
+;
+; **********************************
+; * Strings for all source modules *
+; **********************************
+;
+;
+MSG_NULL
+
+;
+; This string should remain blank.
+;
+MSG_OK
+Ok
+;Ok
+;
+MSG_UNDERSCORE_USE_GAD
+
+;_Use
+;
+MSG_UNDERSCORE_OK_GAD
+
+;_Ok
+;
+MSG_UNDERSCORE_CANCEL_GAD
+
+;_Cancel
+;
+MSG_YES_OR_NO
+Ja|Nein
+;Yes|No
+;
+MSG_RETRY_OR_CANCEL
+Nochmal versuchen|Abbrechen
+;Retry|Cancel
+;
+MSG_PROCEED_OR_CANCEL
+
+;Proceed|Cancel
+;
+MSG_CONTINUE
+Weiter
+;Continue
+;
+MSG_NO_FREE_STORE
+Nicht genug freier Speicher.
+;Insufficient memory.
+;
+MSG_BREAK
+Abgebrochen.
+;Aborted.
+;
+MSG_ERR_LOAD
+Kann \"%s\" nicht laden: %s.
+;Unable to load \"%s\"
+; %s is the filename. A colon ':' and the explanation of failure will be postpended.
+;
+MSG_CANT_OPEN
+Kann Datei \"%s\" nicht öffnen: %s.
+;Cannot open file \"%s\"
+; %s is the filename. A colon ':' and the explanation of failure will be postpended.
+;
+MSG_ERROR_READING
+Fehler beim Lesen von \"%s\": %s.
+;Error reading \"%s\"
+; %s is the filename. A colon ':' and the explanation of failure will be postpended.
+;
+MSG_ERROR_WRITING
+Fehler beim Schreiben von \"%s\": %s.
+;Error writing \"%s\"
+; %s is the filename. A colon ':' and the explanation of failure will be postpended.
+;
+;
+; *****************************
+; * Strings for Compression.c *
+; *****************************
+;
+MSG_DECRUNCHING
+Entpacke...
+;Decrunching...
+;
+MSG_NOTHING_IN_ARC
+Im Archiv \"%s\" nichts gefunden.
+;Nothing found in archive \"%s\".
+;
+MSG_CANT_LOAD_COMPRESSED
+Kann komprimierte Datei nicht laden.
+;Unable to load compressed file.
+;
+MSG_ERROR_DECOMPRESSING
+Fehler beim Entpacken der Datei \"%s\": %s.
+;Error decompressing file \"%s\": %s.
+;
+;
+; ********************
+; * Strings for Cx.c *
+; ********************
+;
+MSG_BAD_HOTKEY
+Falsche Commodity HotKey Beschreibung.
+;Bad Commodity HotKey description.
+;
+;
+; ***************************
+; * Strings for all loaders *
+; ***************************
+;
+MSG_READING_PATTS
+Lese Pattern...
+;Reading Patterns...
+;
+MSG_READING_INSTS_INFO
+Lese Informationen über Instrumente...
+;Reading Instruments Info...
+;
+MSG_READING_INSTS
+Lese Instrumente...
+;Reading Instruments...
+;
+MSG_ERR_CANT_LOAD_PATT
+FEHLER: Kann Pattern %ld nicht laden.
+;ERROR: Couldn't load pattern %ld.
+;
+MSG_ERR_CANT_LOAD_INST
+FEHLER: Kann Instrument %lx nicht laden.
+;ERROR: Couldn't load instrument %lx.
+;
+MSG_ERR_NO_MEM_FOR_INST
+FEHLER: Nicht genug freier Speicher für Instrument %lx.
+;ERROR: Not enough memory for instrument %lx.
+;
+MSG_ERR_NOT_A_SAMPLE
+FEHLER: Instrument %lx ist kein Sample.
+;ERROR: Instrument %lx is not a sample.
+;
+MSG_SONG_TOO_LONG
+WARNUNG: Songlänge überschreitet Maximum. Wird abgeschnitten.
+;WARNING: Song length exceeds maximum. Will be truncated.
+;
+MSG_SONG_HAS_TOO_MANY_PATT
+WARNUNG: Song überschreitet maximale Patternzahl.
+;WARNING: Song exceeds maximum number of patterns.
+;
+MSG_PATT_TOO_MANY_TRACKS
+WARNUNG: Pattern %ld hat zu viele Tracks. Verkürze auf %ld Tracks.
+;WARNING: Pattern %ld has too many tracks. Cropping to %ld tracks.
+;
+MSG_PATT_TOO_MANY_LINES
+WARNING: Pattern %ld hat zu viele Linien. Verkürze auf %ld Linien.
+;WARNING: Pattern %ld has too many lines. Cropping to %ld lines.
+;
+MSG_INVALID_NOTE
+WARNUNG: Ungültiger Ton %ld (Patt %ld Track %ld Linie %ld).
+;WARNING: Invalid note %ld (Patt %ld Track %ld Line %ld).
+;
+MSG_UNKNOWN_EFF
+Unbekannter Effekt: $%lx (Patt %ld Track %ld Linie %ld).
+;Unknown effect: $%lx (Patt %ld Track %ld Line %ld).
+;
+MSG_EXTRA_DATA_AFTER_MOD
+WARNUNG: Zusätzliche Daten hinter regulärem Modul: Werden ignoriert.
+;WARNING: Extra data found after valid module: Will be ignored.
+;
+MSG_WRITING_HEADER
+Schreibe Modul Header...
+;Writing Header...
+;
+MSG_WRITING_PATTS
+Schreibe Pattern...
+;Writing Patterns...
+;
+MSG_WRITING_INSTS
+Schreibe Instrumente...
+;Writing Instruments...
+;
+MSG_WRITING_INSTINFO
+Schreibe Informationen über Instrumente...
+;Writing Instruments Info...
+;
+MSG_WRITING_INSTDATA
+Schreibe Instrumentdaten...
+;Writing Instruments Data...
+;
+MSG_NOTE_TOO_LOW
+WARNUNG: Ton in Patt %ld Track %ld Linie %ld ist zu tief.
+;WARNING: Note at Patt %ld Track %ld Line %ld is too low.
+;
+MSG_NOTE_TOO_HIGH
+WARNUNG: Ton in Patt %ld Track %ld Linie %ld ist zu hoch.
+;WARNING: Note at Patt %ld Track %ld Line %ld is too high.
+;
+MSG_NO_MEM_TO_HALVE
+WARNUNG: Nicht genug freier Speicher, um Lautstärke des Instruments %lx zu halbieren.
+;WARNING: Not enough memory to halve volume of instrument %lx.
+;
+;
+; *****************************
+; * Strings for Get/SaveMED.c *
+; *****************************
+;
+MSG_READING_MMD
+Lade MMD%lc Modul...
+;Loading MMD%lc module...
+; The %lc is the MED format (0, 1, 2, ...)
+;
+MSG_UNSUPPORTED_MMD_FORMAT
+FEHLER: Nicht unterstütztes OctaMED Format.
+;ERROR: Unsupported OctaMED format.
+;
+MSG_WRONG_EFFECT_IN_MMD0
+WARNUNG: Der Effekt %lx wird im MMD0 Format nicht unterstützt. Benutze MMD1 oder höher.
+;WARNING: Effect %lx is not supported in MMD0 format. Use MMD1 or better.
+;
+;
+; ***********************************
+; * Strings for ScreamTrackerHook.c *
+; ***********************************
+;
+MSG_ADLIB_INSTR
+FEHLER: Instrument %lx ist ein ADLib %s.
+;ERROR: Instrument %lx is an ADLib %s.
+; %s is the name of the ADLib instrument (eg: Snare).
+;
+MSG_TRACK_OUT_OF_RANGE
+WARNUNG: Track %lx ist außerhalb des Speicherbereichs.
+;WARNING: Track %lx is out of range.
+;
+MSG_UNKNOWN_SAMPLE_COMPRESSION
+WARNUNG: Unbekannte Samplekompression des Instruments %lx.
+;WARNING: Unknown sample compression for instrument %lx.
+;
+MSG_INST_IS_STEREO
+WARNUNG: Instrument %lx ist ein Stereo Sample.
+;WARNING: Instrument %lx is a stereo sample.
+;
+MSG_INST_IS_16BIT
+WARNING: Instrument %lx ist 16bit: kann es nicht laden.
+;WARNING: Instrument %lx is 16bit: unable to load it.
+;
+;
+; *****************************
+; * Strings for TrackerHook.c *
+; *****************************
+;
+MSG_READING_TYPE_MODULE
+Lese %s Modul...
+;Reading %s module...
+; (%s is the module format)
+;
+MSG_EXCEEDS_64_PATTS
+WARNUNG: Modul überschreitet 64 Pattern. ProTracker 2.3 wird benötigt, um es abzuspielen.
+;NOTE: Module exceeds 64 patterns. You need ProTracker 2.3 to play it.
+;
+MSG_MODULE_ID
+
+;Tracker ID: \"%s\"
+;
+MSG_MODULE_HAS_N_CHN
+
+;Module has %lu tracks...
+;
+MSG_SONG_HAS_NO_INSTS
+Diese Datei ist ein Song und enthält keine Instrumente.
+;This file is a song and doesn't contain instruments.
+;
+MSG_EXCEEDS_MAXPAATTS
+WARNUNG: Modul überschreitet %ld Pattern.
+;WARNING: Module execeeds %ld patterns.
+;
+MSG_PATT_WILL_GROW
+Pattern %ld wird auf 64 Linien verlängert (war vorher %ld Linien lang).
+;Pattern %ld will grow to 64 lines (was %ld lines long).
+;
+MSG_SPLITTING_PATT
+Teile Pattern %ld (war vorher %ld Linien lang).
+;Splitting pattern %ld (was %ld lines long).
+;
+; **************************
+; * Strings for SaveMIDI.c *
+; **************************
+;
+MSG_CHOOSING_CHANNELS
+Wähle Kanäle...
+;Choosing Channels...
+;
+MSG_WRITING_MIDI_TRACKS
+Sichere MIDI Tracks...
+;Writing MIDI Tracks...
+;
+MSG_TOO_MANY_CHANNELS
+FEHLER: Song benötigt zu viele MIDI Kanäle.
+;ERROR: Song requires too many MIDI channels.
+;
+;
+; *********************
+; * Strings for Gui.c *
+; *********************
+;
+MSG_REALLY_QUIT_XMODULE
+XModule wirklich beenden?
+;Really Quit XModule?
+;
+MSG_CLOSE_ALL_WINDOWS
+Bitte alle fremden Fenster schließen\n\
+und dann `Weiter' wählen.
+;Please close all visitor windows\n\
+;and then select `Continue'.
+;
+;
+; ***********************
+; * Strings for Instr.c *
+; ***********************
+;
+MSG_UNKNOWN_IFF
+Unbekanntes IFF Format %s.
+;Unknown IFF format %s.
+;
+MSG_ILLEGAL_IFF_STRUCTURE
+Ungültige IFF Struktur.
+;Illegal IFF structure.
+;
+MSG_SELECT_RAW_MODE
+Instrument Format nicht erkannt.\n\
+Bitte RAW Modus wählen.
+;Unrecognized instrument format.\n\
+;Please select RAW mode.
+;
+MSG_RAW_MODES
+Signed 8bit|Unsigned 8bit|Abbrechen
+;Signed 8bit|Unsigned 8bit|Cancel
+;
+MSG_DATATYPES_ERROR
+DataType Fehler: %s.
+;DataTypes error: %s.
+; %s is a detailed description of the problem.
+;
+MSG_UNKNOWN_COMPRESSION
+Unbekannter Kompressionstyp.
+;Unknown compression type.
+;
+MSG_SAMPLE_WRONG_SIZE
+%lu Bit Samples werden nicht unterstützt.
+;%lu bit samples are not supported.
+; %lu is the number of bits per sample.
+;
+MSG_SAMPLE_NOT_MONO
+Andere Samples außer MONO werden nicht unterstützt.
+;Samples other than MONO are not supported.
+;
+MSG_SAMPLE_WRONG_NUMBER_OF_CHANNELS
+Samples mit %ld Kanälen werden nicht unterstützt.
+;Samples with %ld channels are not supported.
+;
+MSG_NO_MEMORY_TO_OPTIMIZE_INSTR
+WARNUNG: Nicht genug freier Speicher, um Instrument %lx zu optimieren.
+;WARNING: insufficient memory to optimize instrument %lx.
+;
+MSG_INSTR_WILL_SHRINK
+Instrument %lx wird von %ld auf %ld gekürzt.
+;Instrument %lx will shrink from %ld to %ld.
+;
+MSG_INSTR_DUPES_REMOVED
+Doppelte Instrumente gefunden und entfernt: %lx == %lx.
+;Duplicate instruments found and removed: %lx == %lx.
+;
+MSG_INSTR_UNUSED
+Instrument %lx wird nie benutzt und deshalb entfernt.
+;Instrument %lx was never used and it's being removed.
+;
+;
+; **********************
+; * Strings for Misc.c *
+; **********************
+;
+MSG_OPENLIB_VER_FAIL
+Konnte %s Version %ld oder höher nicht öffnen.
+;Couldn't open \"%s\" version %ld or greater.
+;
+MSG_OPENLIB_FAIL
+Konnte %s nicht öffnen.
+;Couldn't open \"%s\".
+;
+;
+; ***************************
+; * Strings for Operators.c *
+; ***************************
+;
+MSG_CANT_INSERT_PATT
+Kann Pattern nicht einfügen: Maximale Anzahl erreicht.
+;Unable to insert pattern: Maximum number of patterns reached.
+;
+MSG_PATT_UNUSED
+Pattern %ld wird nicht benutzt und deshalb gelöscht.
+;Pattern %ld is not used and is beeing deleted.
+;
+MSG_PATT_CUT
+Pattern %ld wird in Linie %ld abgeschnitten.
+;Pattern %ld will be cut at line %ld.
+;
+MSG_PATT_DUPE
+Doppelte Pattern gefunden und entfernt: %ld == %ld.
+;Duplicate patterns found and removed: %ld == %ld.
+; The two %ld are the pattern numbers.
+;
+MSG_SONG_LEN_DIFFERENT
+Songlängen sind verschieden. Benutze kürzere.
+;WARNING: Song lengths are different. Using shorter one.
+;
+MSG_PATT_LEN_DIFFERENT
+Verschiedene Patternlängen an Position %ld. Benutze kürzere.
+;WARNING: Different pattern lengths at position %ld. Using shorter one.
+;
+MSG_ERR_INSTR_OVERFLOW
+
+;ERROR: Instruments overflow. Try remapping the instruments.
+;
+;
+; ***********************
+; * Strings for Prefs.c *
+; ***********************
+;
+MSG_BAD_PREFS_VERSION
+Falsche Version der Voreinstellungsdatei.
+;Incorrect version of preferences file
+;
+;
+; ****************************
+; * Strings for Requesters.c *
+; ****************************
+;
+MSG_XMODULE_REQUEST
+XModule Anfrage
+;XModule Request
+; This is the title of requesters put out by XModule.
+;
+MSG_CLONE_WB
+Klone Workbench Bildschirm
+;Clone Workbench Screen
+;
+MSG_CLOSE_FILEREQUESTER
+Bitte Dateiauswahlfenster schließen\n und dann `Weiter' wählen.
+;Please close FileRequester\n and then select `Continue'.
+;
+MSG_SELECT_MODULES
+Modul(e) auswählen...
+;Select Module(s)...
+;
+MSG_SELECT_INSTRUMENTS
+Instrument(e) auswählen...
+;Select Instrument(s)...
+;
+MSG_SELECT_PATTERN
+Pattern auswählen...
+;Select Pattern...
+;
+MSG_SAVE_MODULE
+Sichere Modul...
+;Save Module...
+;
+MSG_SAVE_INSTRUMENT
+Sichere Instrument...
+;Save Instrument...
+;
+MSG_SAVE_PATTERN
+Sichere Pattern...
+;Save Pattern...
+;
+MSG_FILE_EXISTS
+Datei \"%s\"\nexistiert bereits.
+;File \"%s\"\nalready exists.
+;
+MSG_OVERWRITE
+Überschreiben|Andere auswählen|Abbrechen
+;Overwrite|Choose Another|Abort
+;
+;
+; **********************
+; * Strings for Song.c *
+; **********************
+;
+MSG_CLOSE_ALL_SONGS
+
+;Please close all open songs\n\
+;and then select `Continue'.
+;
+MSG_UNESPECTED_EOF
+Unerwartetes Dateiende.
+;Unespected end of file.
+;
+MSG_MODULE_LOADED_OK
+Modul geladen OK.
+;Module loaded OK.
+;
+MSG_MODULE_SAVED_OK
+Modul gesichert OK.
+;Module saved OK.
+;
+MSG_UNKNOWN_SAVE_FORMAT
+FEHLER: Unbekanntes Speicherformat.
+;ERROR: Unrecognized save format.
+;
+MSG_INVALID_LOOP_REMOVED
+Ungültige Schleife für Instrument %lx entfernt.
+;Removed invalid loop for instrument %lx.
+;
+MSG_INVALID_LOOP_FIXED
+Ungültige Schleife für Instrument %lx repariert.
+;Fixed invalid loop for instrument %lx.
+;
+MSG_SONG_HAS_NO_PATTS
+WARNUNG: Song hat keine Pattern.
+;WARNING: Song has no patterns.
+;
+MSG_SONG_HAS_NO_SEQ
+WARNUNG: Song hat keine Sequence.
+;WARNING: Song has no sequence.
+;
+MSG_INVALID_SONG_POS
+WARNUNG: Songposition %ld bezieht sich auf Pattern %ld, das nicht existiert.
+;WARNING: Song position %ld references pattern %ld, which doesn't exist.
+;
+MSG_UNKNOWN_MOD_FORMAT
+Kann Modul Format nicht identifizieren.\n\
+(Eine Datendatei als Modul zu laden ist unklug)
+;Unable to identify module format.\n\
+;(Loading a data file as a module is unwise)
+;
+MSG_SOUND_PRO_CANCEL
+SoundTracker 15|ProTracker|Abbrechen
+;SoundTracker 15|ProTracker|Cancel
+;
+MSG_AUTHOR_UNKNOWN
+Unbekannt
+;Unknown
+;
+MSG_SONG_UNTITLED
+Unbenannt
+;Untitled
+;
+;
+; **********************
+; * Strings for Help.c *
+; **********************
+;
+MSG_AMIGAGUIDE_ERROR
+AmigaGuide Fehler:
+;AmigaGuide error:
+; Note one blank space at the end of this line!
+;
+;
+; ***************************
+; * Strings for PattPrefs.c *
+; ***************************
+;
+MSG_PATTPREFS_TITLE
+
+;Pattern Editor Settings
+;
+;
+MSG_ADVANCE_TRACKS_GAD
+
+;Advance _Tracks
+;
+MSG_ADVANCE_LINES_GAD
+
+;Advance _Lines
+;
+MSG_MAX_UNDO_LEVELS_GAD
+
+;Max _Undo Levels
+;
+MSG_MAX_UNDO_MEM_GAD
+
+;Max Undo _Memory
+;
+MSG_CLIPBOARD_UNIT_GAD
+
+;Cli_pboard Unit
+;
+MSG_SCROLLER_POS_GAD
+
+;_Scroller Position
+;
+MSG_VERT_WRAP_GAD
+
+;_Vertical Wrap
+;
+MSG_HORIZ_WRAP_GAD
+
+;_Horizontal Wrap
+;
+MSG_HEX_LINE_NUMBERS_GAD
+
+;He_x Line Numbers
+;
+MSG_BLANK_ZERO_GAD
+
+;Blank _Zero Digits
+;
+MSG_BACKDROP_GAD
+
+;Backdrop _Window
+;
+MSG_HORIZ_SCROLLER_GAD
+
+;Ho_rizontal Scroller
+;
+MSG_DO_RULER_GAD
+
+;Display Cursor Ruler
+;
+MSG_DO_TINY_LINES_GAD
+
+;Display Tiny Lines
+;
+MSG_EDITOR_FONT_GAD
+
+;_Editor Font
+;
+MSG_BACKGROUND_PEN_GAD
+
+;Background
+;
+MSG_TEXT_PEN_GAD
+
+;T_ext
+;
+MSG_LINES_PEN_GAD
+
+;Li_nes
+;
+MSG_TINY_LINES_PEN_GAD
+
+;Tin_y Lines
+;
+MSG_RIGHT_GAD
+
+;Right
+;
+MSG_LEFT_GAD
+
+;Left
+;
+MSG_OFF_GAD
+
+;Off
+;
+MSG_PATT_TOO_LONG
+FEHLER: Pattern würde die maximale Linienanzahl überschreiten.
+;ERROR: Pattern would exceed the maximum number of lines.
+;
+;
+; *****************************
+; * Strings for SequenceWin.c *
+; *****************************
+;
+;
+MSG_SEQUENCE_TITLE
+
+;Sequence Editor
+;
+;
+MSG_SEQUENCE_GAD
+
+;Sequence
+;
+MSG_UNDERSCORE_ADD_GAD
+
+;_Add
+;
+MSG_UP_GAD
+
+;Up
+;
+MSG_DOWN_GAD
+
+;Down
+;
+MSG_UNDERSCORE_NAME_GAD
+
+;_Name
+;
+MSG_PATTERNS_GAD
+
+;Patterns
+;
+MSG_UNDERSCORE_UP_GAD
+
+;_Up
+;
+MSG_UNDERSCORE_DOWN_GAD
+
+;_Down
+;
+MSG_UNDERSCORE_INS_GAD
+
+;_Ins
+;
+;
+MSG_UNNAMED
+
+;-- unnamed --
+;
+;
+; ********************************
+; * Strings for InstrumentsWin.c *
+; ********************************
+;
+MSG_INSTRUMENTS_TITLE
+
+;Instruments
+;
+;
+MSG_VOLUME_GAD
+
+;_Volume
+;
+MSG_FINETUNE_GAD
+
+;_FineTune
+;
+MSG_LENGTH_GAD
+
+;Length
+;
+MSG_KIND_GAD
+
+;_Kind
+;
+MSG_EDIT_DOTS_GAD
+
+;_Edit...
+;
+MSG_SAMPLE_GAD
+
+;Sample
+;
+MSG_SYNTH_GAD
+
+;Synth
+;
+MSG_HYBRID_GAD
+
+;Hybrid
+;
+;
+MSG_INSTRUMENTS_MEN
+
+;Instruments
+;
+MSG_LOAD_MEN
+
+;Load...
+;
+MSG_REMAP_MEN
+
+;Remap
+;
+MSG_SAVE_COMPRESSED_MEN
+
+;Save Compressed
+;
+MSG_SAVE_RAW_MEN
+
+;Save Raw
+;
+;
+MSG_EMPTY
+
+;-- empty --
+;
+;
+; *************************
+; * Strings for PlayWin.c *
+; *************************
+;
+MSG_PLAY_TITLE
+
+;Play
+;
+;
+MSG_VOL_GAD
+
+;_Vol
+;
+MSG_POS_GAD
+
+;Pos
+;
+MSG_TIME_GAD
+
+;Time
+;
+MSG_RST_GAD
+
+;_Rst
+; Stands for Reset/Restart
+;
+MSG_PLAYER_INIT_ERR
+Abspielprogramm Initialisierungsfehler: %ld.
+;Player initialization error: %ld.
+;
+;
+; *****************************
+; * Strings for ProgressWin.c *
+; *****************************
+;
+MSG_PROGRESS_TITLE
+
+;XModule is working...
+;
+MSG_LOG_TITLE
+
+;XModule Log
+;
+;
+MSG_UNDERSCORE_ABORT_GAD
+
+;_Abort
+;
+;
+MSG_PERCENT_DONE
+%ld of %ld (%ld%% erledigt)
+;%ld of %ld (%ld%% done)
+; This string appears inside the progress window gauge.
+; eg: "5 of 20 (25% done)".
+; Leave that double percent (%%) alone! :-)
+;
+;
+; *****************************
+; * Strings for SongInfoWin.c *
+; *****************************
+;
+MSG_SONGINFO_TITLE
+
+;Song Information
+;
+;
+MSG_UNDERSCORE_NEW_GAD
+
+;Ne_w
+;
+MSG_OPEN_GAD
+
+;_Open...
+;
+MSG_SAVE_GAD
+
+;_Save
+;
+MSG_DEL_GAD
+
+;Del
+;
+MSG_SONG_NAME_GAD
+
+;Song _Name
+;
+MSG_AUTHOR_NAME_GAD
+
+;_Author
+;
+MSG_DEF_TEMPO_GAD
+
+;_Tempo
+;
+MSG_DEF_SPEED_GAD
+
+;S_peed
+;
+MSG_RESTART_GAD
+
+;_Restart
+;
+MSG_LENGHT_GAD
+
+;Length
+;
+MSG_NUM_PATTS_GAD
+
+;Num Patterns
+;
+MSG_NUM_TRACKS_GAD
+
+;Tracks
+;
+MSG_TOT_MOD_SIZE_GAD
+
+;Total Module Size
+;
+MSG_TOT_INST_SIZE_GAD
+
+;Total Instruments Size
+;
+;
+MSG_SONG_MEN
+
+;Song
+;
+MSG_MERGE_SONGS_MEN
+
+;Merge Songs
+;
+MSG_JOIN_SONGS_MEN
+
+;Join Songs
+;
+;
+MSG_JOIN_REQUIRES_TWO_SONGS
+Verbinden benötigt zwei Songs.
+;ERROR: Join requires two songs.
+;
+MSG_MERGE_REQUIRES_TWO_SONGS
+Verschmelzen benötigt zwei Songs.
+;ERROR: Merge requires two songs.
+;
+MSG_DISCARD_CURRENT_SONG
+Aktuellen Song verwerfen?
+;Discard current song?
+;
+;
+; ****************************
+; * Strings for ToolBoxWin.c *
+; ****************************
+;
+MSG_TOOLBOX_TITLE
+
+;ToolBox
+;
+;
+MSG_PLAY_GAD
+
+;Play...
+;
+MSG_SONGS_GAD
+
+;_Songs...
+;
+MSG_PATTERNS_DOTS_GAD
+
+;_Patterns...
+;
+MSG_INSTRUMENTS_GAD
+
+;_Instruments...
+;
+MSG_SEQUENCE_DOTS_GAD
+
+;Se_quence...
+;
+MSG_OPTIMIZATION_GAD
+
+;_Optimization...
+;
+MSG_PROJECT_MEN
+
+;Project
+;
+MSG_NEW_MEN
+
+;New
+;
+MSG_OPEN_MEN
+
+;Open...
+;
+MSG_OPEN_NEW_MEN
+
+;Open New...
+;
+MSG_SAVE_MEN
+
+;Save
+;
+MSG_SAVE_AS_MEN
+
+;Save As...
+;
+MSG_CLEAR_MEN
+
+;Clear...
+;
+MSG_ABOUT_MEN
+
+;About...
+;
+MSG_HELP_MEN
+
+;Help...
+;
+MSG_ICONIFY_MEN
+
+;Iconify...
+;
+MSG_QUIT_MEN
+
+;Quit
+;
+MSG_SETTINGS_MEN
+
+;Settings
+;
+MSG_SAVE_FORMAT_MEN
+
+;Save Format...
+;
+MSG_USER_INTERFACE_MEN
+
+;User Interface...
+;
+MSG_SAVE_ICONS_MEN
+
+;Save Icons
+;
+MSG_CONFIRM_OVERWRITE_MEN
+
+;Confirm Overwrite
+;
+MSG_CONFIRM_EXIT_MEN
+
+;Confirm Exit
+;
+MSG_VERBOSE_MEN
+
+;Verbose Log
+;
+MSG_OPEN_SETTINGS_MEN
+
+;Open Settings...
+;
+MSG_SAVE_SETTINGS_MEN
+
+;Save Settings
+;
+MSG_SAVE_SETTINGS_AS_MEN
+
+;Save Settings As...
+;
+;
+MSG_ABOUT_TEXT
+%s %s\n\
+Ein Programm zum Bearbeiten von Musikmodulen\n\n\
+\
+%s\n\
+Alle Rechte vorbehalten.\n\n\
+\
+Internet: bernie@shock.cosmos.it\n\n\
+Fidonet:  2:332/125.1\n\
+\
+Freier CHIP Speicher: %ldKB\n\
+Freier FAST Speicher: %ldKB\n\n\
+Öffentlicher Bildschirm: %s\n\
+ARexx Port: %s\n\
+CX HotKey: %s\n\
+Sprache: %s
+;%s\n\
+;A Music Module Processing Utility\n\n\
+;\
+;%s\n\
+;All rights reserved.\n\n\
+;\
+;Internet: bernie@shock.cosmos.it\n\n\
+;FidoNet:  2:332/125.1\n\
+;\
+;Free CHIP Memory: %ldKB\n\
+;Free FAST Memory: %ldKB\n\n\
+;Public Screen: %s\n\
+;ARexx Port: %s\n\
+;Cx HotKey: %s\n\
+;Language: %s
+;
+MSG_DEFAULT
+--Voreingestellt--
+;-- Default --
+;
+MSG_DISABLED
+--Gesperrt--
+;-- Disabled --
+;
+;
+; *********************************
+; * Strings for OptimizationWin.c *
+; *********************************
+;
+MSG_OPTIMIZATION_TITLE
+
+;Module Optimization
+;
+;
+MSG_OPTIMIZE_GAD
+
+;_Optimize
+;
+MSG_REM_UNUSED_PATTS_GAD
+
+;Remove Unused _Patterns
+;
+MSG_REM_DUPLICATE_PATTS_GAD
+
+;Remove _Duplicate Patterns
+;
+MSG_REM_UNUSED_INSTR_GAD
+
+;Remove Unused _Instruments
+;
+MSG_REM_DUP_INSTR_GAD
+
+;Remove Duplicate I_nstruments
+;
+MSG_CUT_AFTER_LOOP_GAD
+
+;Cut Instruments After _Loop
+;
+MSG_CUT_ZERO_TAILS_GAD
+
+;Cut Instrument _Zero Tails
+;
+MSG_CUT_PATTERNS_GAD
+
+;Cut _Breaked Patterns
+;
+MSG_REMAP_INSTRUMENTS_GAD
+
+;_Remap Instruments
+;
+;
+MSG_SAVED_X_BYTES
+%ld Bytes eingespart (%ld%%)
+;Saved %ld bytes (%ld%%)
+;
+;
+; **************************
+; * Strings for PrefsWin.c *
+; **************************
+;
+;
+MSG_PREFS_TITLE
+
+;User Interface Settings
+;
+;
+MSG_PUBLIC_SCREEN_GAD
+
+;_Public Screen
+;
+MSG_DISPLAY_MODE_GAD
+
+;Display _Mode
+;
+MSG_WINDOW_FONT_GAD
+
+;_Window Font
+;
+MSG_LISTVIEW_FONT_GAD
+
+;_ListView Font
+;
+MSG_REQUESTERS_GAD
+
+;_Requesters
+;
+MSG_USE_DATATYPES_GAD
+
+;Use _DataTypes
+;
+MSG_APPICON_GAD
+
+;Put App_Icon
+;
+MSG_REFRESH_GAD
+
+;Refres_h
+;
+MSG_LOG_TO_FILE_GAD
+
+;Log To File
+;
+MSG_LOG_LEVEL_GAD
+
+;_Log Level
+;
+MSG_ASK_AUTOSAVE_GAD
+
+;Confirm _Autosave
+;
+MSG_AUTOSAVE_TIME_GAD
+
+;Autosave Mi_nutes
+;
+MSG_DO_BACKUPS_GAD
+
+;Create _Backups
+;
+MSG_BACKUP_TEMPLATE_GAD
+
+;Bac_kup Template
+;
+MSG_BACKUP_VERSIONS_GAD
+
+;Backup _Versions
+;
+MSG_ASL_GAD
+
+;Asl
+;
+MSG_REQTOOLS_GAD
+
+;ReqTools
+;
+MSG_SMART_GAD
+
+;Smart
+;
+MSG_SIMPLE_GAD
+
+;Simple
+;
+MSG_CLONE_DEF_SCREEN
+
+;--Clone Default Screen--
+;
+;
+; ****************************
+; * Strings for PatternWin.c *
+; ****************************
+;
+MSG_PATTERN_TITLE
+
+;Pattern Editor
+;
+;
+MSG_PATTERNS_MEN
+
+;Patterns
+;
+MSG_SIZE_MEN
+
+;Size...
+;
+MSG_EDIT_MEN
+
+;Edit
+;
+MSG_MARK_MEN
+
+;Mark
+;
+MSG_CUT_MEN
+
+;Cut
+;
+MSG_COPY_MEN
+
+;Copy
+;
+MSG_PASTE_MEN
+
+;Paste
+;
+MSG_ERASE_MEN
+
+;Erase
+;
+MSG_UNDO_MEN
+
+;Undo
+;
+MSG_REDO_MEN
+
+;Redo
+;
+MSG_EDITOR_SETTINGS_MEN
+
+;Editor Settings...
+;
+;
+; ***************************
+; * Strings for SaversWin.c *
+; ***************************
+;
+MSG_SAVERS_TITLE
+
+;Savers
+;
+;
+MSG_SF_SEQUENCE_GAD
+
+;Se_quence
+;
+MSG_SF_INSTRUMENTS_GAD
+
+;_Instruments
+;
+MSG_SF_PATTERNS_GAD
+
+;_Patterns
+;
+MSG_SF_NAMES_GAD
+
+;Names
+;
+MSG_ADD_ICON_GAD
+
+;Add I_con
+;
+MSG_MODE_GAD
+
+;_Mode
+;
+MSG_OPTIONS_DOTS_GAD
+
+;Options...
+;
+MSG_NONE_GAD
+
+;None
+;
+MSG_XPK_GAD
+
+;XPK
+;
+MSG_LHA_GAD
+
+;LhA
+;
+;
+MSG_DESCRIPTION
+
+;Description
+;
+MSG_AUTHOR
+
+;Author
+;
+MSG_MAXLENGTH
+
+;Max Length
+;
+MSG_MAXTRACKS
+
+;Max Tracks
+;
+MSG_MAXINSTRUMENTS
+
+;Max Instruments
+;
+MSG_MAXPATTERNS
+
+;Max Patterns
+;
+MSG_MAXPATTLEN
+
+;Max Pattern Length
+;
+MSG_MAXSAMPLELEN
+
+;Max Sample Length
+;
+;
+; **********************
+; * Strings ClearWin.c *
+; **********************
+;
+MSG_CLEAR_TITLE
+
+;Clear Module
+;
+;
+MSG_CLR_SEQUENCE_GAD
+
+;_Sequence
+;
+MSG_CLR_INSTRUMENTS_GAD
+
+;_Instruments
+;
+MSG_CLR_PATTERNS_GAD
+
+;_Patterns
+;
+MSG_CLEARMOD_GAD
+
+;_Clear
+;
+;
+; ***************************
+; * Strings for SampleWin.c *
+; ***************************
+;
+MSG_SAMPLE_TITLE
+
+;Sample Editor
+;
+;
+MSG_RENDER_MEN
+
+;Render
+;
+MSG_POINTS_MEN
+
+;Points
+;
+MSG_LINES_MEN
+
+;Lines
+;
+MSG_FILLED_MEN
+
+;Filled
+;
+;
+; *****************************
+; * Strings for PattSizeWin.c *
+; *****************************
+;
+MSG_PATTSIZE_TITLE
+
+;Pattern Attributes
+;
+;
+MSG_LINES_GAD
+
+;_Lines
+;
+MSG_TRACKS_GAD
+
+;_Tracks
+;
+MSG_DOUBLE_GAD
+
+;_Double
+;
+MSG_HALVE_GAD
+
+;_Halve
+;
+;
+; *************************
+; * Strings for Library.c *
+; *************************
+;
+MSG_SONG_TOO_MANY_TRACKS
+
+;WARNING: The selected saver supports max %lu tracks, but the song has %lu tracks.
+;
+MSG_SONG_TOO_MANY_PATTS
+
+;WARNING: The selected saver supports max %lu patterns; the song has %lu patterns.
+;
+MSG_SONG_TOO_MANY_INSTRS
+
+;WARNING: The selected saver supports max %lu instruments, last instrument is %lu.
+;
+MSG_SONG_TOO_MANY_POS
+
+;WARNING: The selected saver supports max %lu positions, but the song has %lu positions.
+;
+MSG_PATT_LENGTH_INVALID
+
+;WARNING: The length of pattern %ld ($%lx lines) isn't allowed with the selected saver.
+;
+MSG_INSTR_TOO_LONG
+WARNUNG: Instrument %lx ist zu lang.
+;WARNING: Instrument %lx is too long and will be cropped to %lu bytes.
+;
+MSG_WILL_MODIFY_SONG
+
+;Some modifications need to be performed on this song\n\
+;in order to adapt it to the limitations of the\n\
+;destination format.
+;
+MSG_TRY_REMAPPING_INSTRUMENTS
+
+;Some instruments are placed beyond the limit for\n\
+;the selected format.\n\
+;Remapping the instruments now could help saving\n\
+;all them along with the selected format.
+;
+MSG_SAVING_MODULE
+
+;Saving %s module \"%s\"...
+; the first %s is the format name, the second %s is the song name.
diff --git a/Catalogs/empty.ct b/Catalogs/empty.ct
new file mode 100644 (file)
index 0000000..31dd947
--- /dev/null
@@ -0,0 +1,1473 @@
+## version $VER: XX.catalog XX.XX (XX.XX.XX)
+## language X
+## codeset 0
+;
+;**
+;** XModule.cd 3.9
+;**
+;** Copyright (C) 1995,96 Bernardo Innocenti
+;**
+;
+; **********************************
+; * Strings for all source modules *
+; **********************************
+;
+;
+MSG_NULL
+
+;
+; This string should remain blank.
+;
+MSG_OK
+
+;Ok
+;
+MSG_UNDERSCORE_USE_GAD
+
+;_Use
+;
+MSG_UNDERSCORE_OK_GAD
+
+;_Ok
+;
+MSG_UNDERSCORE_CANCEL_GAD
+
+;_Cancel
+;
+MSG_YES_OR_NO
+
+;Yes|No
+;
+MSG_RETRY_OR_CANCEL
+
+;Retry|Cancel
+;
+MSG_PROCEED_OR_CANCEL
+
+;Proceed|Cancel
+;
+MSG_CONTINUE
+
+;Continue
+;
+MSG_NO_FREE_STORE
+
+;Insufficient memory.
+;
+MSG_BREAK
+
+;Aborted.
+;
+MSG_ERR_LOAD
+
+;Unable to load \"%s\"
+; %s is the filename. A colon ':' and the explanation of failure will be postpended.
+;
+MSG_CANT_OPEN
+
+;Cannot open file \"%s\"
+; %s is the filename. A colon ':' and the explanation of failure will be postpended.
+;
+MSG_ERROR_READING
+
+;Error reading \"%s\"
+; %s is the filename. A colon ':' and the explanation of failure will be postpended.
+;
+MSG_ERROR_WRITING
+
+;Error writing \"%s\"
+; %s is the filename. A colon ':' and the explanation of failure will be postpended.
+;
+;
+; *****************************
+; * Strings for Compression.c *
+; *****************************
+;
+MSG_DECRUNCHING
+
+;Decrunching...
+;
+MSG_NOTHING_IN_ARC
+
+;Nothing found in archive \"%s\".
+;
+MSG_CANT_LOAD_COMPRESSED
+
+;Unable to load compressed file.
+;
+MSG_ERROR_DECOMPRESSING
+
+;Error decompressing file \"%s\": %s.
+;
+;
+; ********************
+; * Strings for Cx.c *
+; ********************
+;
+MSG_BAD_HOTKEY
+
+;Bad Commodity HotKey description.
+;
+;
+; ***************************
+; * Strings for all loaders *
+; ***************************
+;
+MSG_READING_PATTS
+
+;Reading Patterns...
+;
+MSG_READING_INSTS_INFO
+
+;Reading Instruments Info...
+;
+MSG_READING_INSTS
+
+;Reading Instruments...
+;
+MSG_ERR_CANT_LOAD_PATT
+
+;ERROR: Couldn't load pattern %ld.
+;
+MSG_ERR_CANT_LOAD_INST
+
+;ERROR: Couldn't load instrument %lx.
+;
+MSG_ERR_NO_MEM_FOR_INST
+
+;ERROR: Not enough memory for instrument %lx.
+;
+MSG_ERR_NOT_A_SAMPLE
+
+;ERROR: Instrument %lx is not a sample.
+;
+MSG_SONG_TOO_LONG
+
+;WARNING: Song length exceeds maximum. Will be truncated.
+;
+MSG_SONG_HAS_TOO_MANY_PATT
+
+;WARNING: Song exceeds maximum number of patterns.
+;
+MSG_PATT_TOO_MANY_TRACKS
+
+;WARNING: Pattern %ld has too many tracks. Cropping to %ld tracks.
+;
+MSG_PATT_TOO_MANY_LINES
+
+;WARNING: Pattern %ld has too many lines. Cropping to %ld lines.
+;
+MSG_INVALID_NOTE
+
+;WARNING: Invalid note %ld (Patt %ld Track %ld Line %ld).
+;
+MSG_UNKNOWN_EFF
+
+;Unknown effect: $%lx (Patt %ld Track %ld Line %ld).
+;
+MSG_EXTRA_DATA_AFTER_MOD
+
+;WARNING: Extra data found after valid module: Will be ignored.
+;
+MSG_WRITING_HEADER
+
+;Writing Header...
+;
+MSG_WRITING_PATTS
+
+;Writing Patterns...
+;
+MSG_WRITING_INSTS
+
+;Writing Instruments...
+;
+MSG_WRITING_INSTINFO
+
+;Writing Instruments Info...
+;
+MSG_WRITING_INSTDATA
+
+;Writing Instruments Data...
+;
+MSG_NOTE_TOO_LOW
+
+;WARNING: Note at Patt %ld Track %ld Line %ld is too low.
+;
+MSG_NOTE_TOO_HIGH
+
+;WARNING: Note at Patt %ld Track %ld Line %ld is too high.
+;
+MSG_NO_MEM_TO_HALVE
+
+;WARNING: Not enough memory to halve volume of instrument %lx.
+;
+;
+; *****************************
+; * Strings for Get/SaveMED.c *
+; *****************************
+;
+MSG_READING_MMD
+
+;Loading MMD%lc module...
+; The %lc is the MED format (0, 1, 2, ...)
+;
+MSG_UNSUPPORTED_MMD_FORMAT
+
+;ERROR: Unsupported OctaMED format.
+;
+MSG_WRONG_EFFECT_IN_MMD0
+
+;WARNING: Effect %lx is not supported in MMD0 format. Use MMD1 or better.
+;
+;
+; ***********************************
+; * Strings for ScreamTrackerHook.c *
+; ***********************************
+;
+MSG_ADLIB_INSTR
+
+;ERROR: Instrument %lx is an ADLib %s.
+; %s is the name of the ADLib instrument (eg: Snare).
+;
+MSG_TRACK_OUT_OF_RANGE
+
+;WARNING: Track %lx is out of range.
+;
+MSG_UNKNOWN_SAMPLE_COMPRESSION
+
+;WARNING: Unknown sample compression for instrument %lx.
+;
+MSG_INST_IS_STEREO
+
+;WARNING: Instrument %lx is a stereo sample.
+;
+MSG_INST_IS_16BIT
+
+;WARNING: Instrument %lx is 16bit: unable to load it.
+;
+;
+; *****************************
+; * Strings for TrackerHook.c *
+; *****************************
+;
+MSG_READING_TYPE_MODULE
+
+;Reading %s module...
+; (%s is the module format)
+;
+MSG_EXCEEDS_64_PATTS
+
+;NOTE: Module exceeds 64 patterns. You need ProTracker 2.3 to play it.
+;
+MSG_MODULE_ID
+
+;Tracker ID: \"%s\"
+;
+MSG_MODULE_HAS_N_CHN
+
+;Module has %lu tracks...
+;
+MSG_SONG_HAS_NO_INSTS
+
+;This file is a song and doesn't contain instruments.
+;
+MSG_EXCEEDS_MAXPAATTS
+
+;WARNING: Module execeeds %ld patterns.
+;
+MSG_PATT_WILL_GROW
+
+;Pattern %ld will grow to 64 lines (was %ld lines long).
+;
+MSG_SPLITTING_PATT
+
+;Splitting pattern %ld (was %ld lines long).
+;
+; **************************
+; * Strings for SaveMIDI.c *
+; **************************
+;
+MSG_CHOOSING_CHANNELS
+
+;Choosing Channels...
+;
+MSG_WRITING_MIDI_TRACKS
+
+;Writing MIDI Tracks...
+;
+MSG_TOO_MANY_CHANNELS
+
+;ERROR: Song requires too many MIDI channels.
+;
+;
+; *********************
+; * Strings for Gui.c *
+; *********************
+;
+MSG_REALLY_QUIT_XMODULE
+
+;Really Quit XModule?
+;
+MSG_CLOSE_ALL_WINDOWS
+
+;Please close all visitor windows\n\
+;and then select `Continue'.
+;
+;
+; ***********************
+; * Strings for Instr.c *
+; ***********************
+;
+MSG_UNKNOWN_IFF
+
+;Unknown IFF format %s.
+;
+MSG_ILLEGAL_IFF_STRUCTURE
+
+;Illegal IFF structure.
+;
+MSG_SELECT_RAW_MODE
+
+;Unrecognized instrument format.\n\
+;Please select RAW mode.
+;
+MSG_RAW_MODES
+
+;Signed 8bit|Unsigned 8bit|Cancel
+;
+MSG_DATATYPES_ERROR
+
+;DataTypes error: %s.
+; %s is a detailed description of the problem.
+;
+MSG_UNKNOWN_COMPRESSION
+
+;Unknown compression type.
+;
+MSG_SAMPLE_WRONG_SIZE
+
+;%lu bit samples are not supported.
+; %lu is the number of bits per sample.
+;
+MSG_SAMPLE_NOT_MONO
+
+;Samples other than MONO are not supported.
+;
+MSG_SAMPLE_WRONG_NUMBER_OF_CHANNELS
+
+;Samples with %ld channels are not supported.
+;
+MSG_NO_MEMORY_TO_OPTIMIZE_INSTR
+
+;WARNING: insufficient memory to optimize instrument %lx.
+;
+MSG_INSTR_WILL_SHRINK
+
+;Instrument %lx will shrink from %ld to %ld.
+;
+MSG_INSTR_DUPES_REMOVED
+
+;Duplicate instruments found and removed: %lx == %lx.
+;
+MSG_INSTR_UNUSED
+
+;Instrument %lx was never used and it's being removed.
+;
+;
+; **********************
+; * Strings for Misc.c *
+; **********************
+;
+MSG_OPENLIB_VER_FAIL
+
+;Couldn't open \"%s\" version %ld or greater.
+;
+MSG_OPENLIB_FAIL
+
+;Couldn't open \"%s\".
+;
+;
+; ***************************
+; * Strings for Operators.c *
+; ***************************
+;
+MSG_CANT_INSERT_PATT
+
+;Unable to insert pattern: Maximum number of patterns reached.
+;
+MSG_PATT_UNUSED
+
+;Pattern %ld is not used and is beeing deleted.
+;
+MSG_PATT_CUT
+
+;Pattern %ld will be cut at line %ld.
+;
+MSG_PATT_DUPE
+
+;Duplicate patterns found and removed: %ld == %ld.
+; The two %ld are the pattern numbers.
+;
+MSG_SONG_LEN_DIFFERENT
+
+;WARNING: Song lengths are different. Using shorter one.
+;
+MSG_PATT_LEN_DIFFERENT
+
+;WARNING: Different pattern lengths at position %ld. Using shorter one.
+;
+MSG_ERR_INSTR_OVERFLOW
+
+;ERROR: Instruments overflow. Try remapping the instruments.
+;
+;
+; ***********************
+; * Strings for Prefs.c *
+; ***********************
+;
+MSG_BAD_PREFS_VERSION
+
+;Incorrect version of preferences file
+;
+;
+; ****************************
+; * Strings for Requesters.c *
+; ****************************
+;
+MSG_XMODULE_REQUEST
+
+;XModule Request
+; This is the title of requesters put out by XModule.
+;
+MSG_CLONE_WB
+
+;Clone Workbench Screen
+;
+MSG_CLOSE_FILEREQUESTER
+
+;Please close FileRequester\n and then select `Continue'.
+;
+MSG_SELECT_MODULES
+
+;Select Module(s)...
+;
+MSG_SELECT_INSTRUMENTS
+
+;Select Instrument(s)...
+;
+MSG_SELECT_PATTERN
+
+;Select Pattern...
+;
+MSG_SAVE_MODULE
+
+;Save Module...
+;
+MSG_SAVE_INSTRUMENT
+
+;Save Instrument...
+;
+MSG_SAVE_PATTERN
+
+;Save Pattern...
+;
+MSG_FILE_EXISTS
+
+;File \"%s\"\nalready exists.
+;
+MSG_OVERWRITE
+
+;Overwrite|Choose Another|Abort
+;
+;
+; **********************
+; * Strings for Song.c *
+; **********************
+;
+MSG_CLOSE_ALL_SONGS
+
+;Please close all open songs\n\
+;and then select `Continue'.
+;
+MSG_UNESPECTED_EOF
+
+;Unespected end of file.
+;
+MSG_MODULE_LOADED_OK
+
+;Module loaded OK.
+;
+MSG_MODULE_SAVED_OK
+
+;Module saved OK.
+;
+MSG_UNKNOWN_SAVE_FORMAT
+
+;ERROR: Unrecognized save format.
+;
+MSG_INVALID_LOOP_REMOVED
+
+;Removed invalid loop for instrument %lx.
+;
+MSG_INVALID_LOOP_FIXED
+
+;Fixed invalid loop for instrument %lx.
+;
+MSG_SONG_HAS_NO_PATTS
+
+;WARNING: Song has no patterns.
+;
+MSG_SONG_HAS_NO_SEQ
+
+;WARNING: Song has no sequence.
+;
+MSG_INVALID_SONG_POS
+
+;WARNING: Song position %ld references pattern %ld, which doesn't exist.
+;
+MSG_UNKNOWN_MOD_FORMAT
+
+;Unable to identify module format.\n\
+;(Loading a data file as a module is unwise)
+;
+MSG_SOUND_PRO_CANCEL
+
+;SoundTracker 15|ProTracker|Cancel
+;
+MSG_AUTHOR_UNKNOWN
+
+;Unknown
+;
+MSG_SONG_UNTITLED
+
+;Untitled
+;
+;
+; **********************
+; * Strings for Help.c *
+; **********************
+;
+MSG_AMIGAGUIDE_ERROR
+
+;AmigaGuide error:
+; Note one blank space at the end of this line!
+;
+;
+; ***************************
+; * Strings for PattPrefs.c *
+; ***************************
+;
+MSG_PATTPREFS_TITLE
+
+;Pattern Editor Settings
+;
+;
+MSG_ADVANCE_TRACKS_GAD
+
+;Advance _Tracks
+;
+MSG_ADVANCE_LINES_GAD
+
+;Advance _Lines
+;
+MSG_MAX_UNDO_LEVELS_GAD
+
+;Max _Undo Levels
+;
+MSG_MAX_UNDO_MEM_GAD
+
+;Max Undo _Memory
+;
+MSG_CLIPBOARD_UNIT_GAD
+
+;Cli_pboard Unit
+;
+MSG_SCROLLER_POS_GAD
+
+;_Scroller Position
+;
+MSG_VERT_WRAP_GAD
+
+;_Vertical Wrap
+;
+MSG_HORIZ_WRAP_GAD
+
+;_Horizontal Wrap
+;
+MSG_HEX_LINE_NUMBERS_GAD
+
+;He_x Line Numbers
+;
+MSG_BLANK_ZERO_GAD
+
+;Blank _Zero Digits
+;
+MSG_BACKDROP_GAD
+
+;Backdrop _Window
+;
+MSG_HORIZ_SCROLLER_GAD
+
+;Ho_rizontal Scroller
+;
+MSG_DO_RULER_GAD
+
+;Display Cursor Ruler
+;
+MSG_DO_TINY_LINES_GAD
+
+;Display Tiny Lines
+;
+MSG_EDITOR_FONT_GAD
+
+;_Editor Font
+;
+MSG_BACKGROUND_PEN_GAD
+
+;Background
+;
+MSG_TEXT_PEN_GAD
+
+;T_ext
+;
+MSG_LINES_PEN_GAD
+
+;Li_nes
+;
+MSG_TINY_LINES_PEN_GAD
+
+;Tin_y Lines
+;
+MSG_RIGHT_GAD
+
+;Right
+;
+MSG_LEFT_GAD
+
+;Left
+;
+MSG_OFF_GAD
+
+;Off
+;
+MSG_PATT_TOO_LONG
+
+;ERROR: Pattern would exceed the maximum number of lines.
+;
+;
+; *****************************
+; * Strings for SequenceWin.c *
+; *****************************
+;
+;
+MSG_SEQUENCE_TITLE
+
+;Sequence Editor
+;
+;
+MSG_SEQUENCE_GAD
+
+;Sequence
+;
+MSG_UNDERSCORE_ADD_GAD
+
+;_Add
+;
+MSG_UP_GAD
+
+;Up
+;
+MSG_DOWN_GAD
+
+;Down
+;
+MSG_UNDERSCORE_NAME_GAD
+
+;_Name
+;
+MSG_PATTERNS_GAD
+
+;Patterns
+;
+MSG_UNDERSCORE_UP_GAD
+
+;_Up
+;
+MSG_UNDERSCORE_DOWN_GAD
+
+;_Down
+;
+MSG_UNDERSCORE_INS_GAD
+
+;_Ins
+;
+;
+MSG_UNNAMED
+
+;-- unnamed --
+;
+;
+; ********************************
+; * Strings for InstrumentsWin.c *
+; ********************************
+;
+MSG_INSTRUMENTS_TITLE
+
+;Instruments
+;
+;
+MSG_VOLUME_GAD
+
+;_Volume
+;
+MSG_FINETUNE_GAD
+
+;_FineTune
+;
+MSG_LENGTH_GAD
+
+;Length
+;
+MSG_KIND_GAD
+
+;_Kind
+;
+MSG_EDIT_DOTS_GAD
+
+;_Edit...
+;
+MSG_SAMPLE_GAD
+
+;Sample
+;
+MSG_SYNTH_GAD
+
+;Synth
+;
+MSG_HYBRID_GAD
+
+;Hybrid
+;
+;
+MSG_INSTRUMENTS_MEN
+
+;Instruments
+;
+MSG_LOAD_MEN
+
+;Load...
+;
+MSG_REMAP_MEN
+
+;Remap
+;
+MSG_SAVE_COMPRESSED_MEN
+
+;Save Compressed
+;
+MSG_SAVE_RAW_MEN
+
+;Save Raw
+;
+;
+MSG_EMPTY
+
+;-- empty --
+;
+;
+; *************************
+; * Strings for PlayWin.c *
+; *************************
+;
+MSG_PLAY_TITLE
+
+;Play
+;
+;
+MSG_VOL_GAD
+
+;_Vol
+;
+MSG_POS_GAD
+
+;Pos
+;
+MSG_TIME_GAD
+
+;Time
+;
+MSG_RST_GAD
+
+;_Rst
+; Stands for Reset/Restart
+;
+MSG_PLAYER_INIT_ERR
+
+;Player initialization error: %ld.
+;
+;
+; *****************************
+; * Strings for ProgressWin.c *
+; *****************************
+;
+MSG_PROGRESS_TITLE
+
+;XModule is working...
+;
+MSG_LOG_TITLE
+
+;XModule Log
+;
+;
+MSG_UNDERSCORE_ABORT_GAD
+
+;_Abort
+;
+;
+MSG_PERCENT_DONE
+
+;%ld of %ld (%ld%% done)
+; This string appears inside the progress window gauge.
+; eg: "5 of 20 (25% done)".
+; Leave that double percent (%%) alone! :-)
+;
+;
+; *****************************
+; * Strings for SongInfoWin.c *
+; *****************************
+;
+MSG_SONGINFO_TITLE
+
+;Song Information
+;
+;
+MSG_UNDERSCORE_NEW_GAD
+
+;Ne_w
+;
+MSG_OPEN_GAD
+
+;_Open...
+;
+MSG_SAVE_GAD
+
+;_Save
+;
+MSG_DEL_GAD
+
+;Del
+;
+MSG_SONG_NAME_GAD
+
+;Song _Name
+;
+MSG_AUTHOR_NAME_GAD
+
+;_Author
+;
+MSG_DEF_TEMPO_GAD
+
+;_Tempo
+;
+MSG_DEF_SPEED_GAD
+
+;S_peed
+;
+MSG_RESTART_GAD
+
+;_Restart
+;
+MSG_LENGHT_GAD
+
+;Length
+;
+MSG_NUM_PATTS_GAD
+
+;Num Patterns
+;
+MSG_NUM_TRACKS_GAD
+
+;Tracks
+;
+MSG_TOT_MOD_SIZE_GAD
+
+;Total Module Size
+;
+MSG_TOT_INST_SIZE_GAD
+
+;Total Instruments Size
+;
+;
+MSG_SONG_MEN
+
+;Song
+;
+MSG_MERGE_SONGS_MEN
+
+;Merge Songs
+;
+MSG_JOIN_SONGS_MEN
+
+;Join Songs
+;
+;
+MSG_JOIN_REQUIRES_TWO_SONGS
+
+;ERROR: Join requires two songs.
+;
+MSG_MERGE_REQUIRES_TWO_SONGS
+
+;ERROR: Merge requires two songs.
+;
+MSG_DISCARD_CURRENT_SONG
+
+;Discard current song?
+;
+;
+; ****************************
+; * Strings for ToolBoxWin.c *
+; ****************************
+;
+MSG_TOOLBOX_TITLE
+
+;ToolBox
+;
+;
+MSG_PLAY_GAD
+
+;Play...
+;
+MSG_SONGS_GAD
+
+;_Songs...
+;
+MSG_PATTERNS_DOTS_GAD
+
+;_Patterns...
+;
+MSG_INSTRUMENTS_GAD
+
+;_Instruments...
+;
+MSG_SEQUENCE_DOTS_GAD
+
+;Se_quence...
+;
+MSG_OPTIMIZATION_GAD
+
+;_Optimization...
+;
+MSG_PROJECT_MEN
+
+;Project
+;
+MSG_NEW_MEN
+
+;New
+;
+MSG_OPEN_MEN
+
+;Open...
+;
+MSG_OPEN_NEW_MEN
+
+;Open New...
+;
+MSG_SAVE_MEN
+
+;Save
+;
+MSG_SAVE_AS_MEN
+
+;Save As...
+;
+MSG_CLEAR_MEN
+
+;Clear...
+;
+MSG_ABOUT_MEN
+
+;About...
+;
+MSG_HELP_MEN
+
+;Help...
+;
+MSG_ICONIFY_MEN
+
+;Iconify...
+;
+MSG_QUIT_MEN
+
+;Quit
+;
+MSG_SETTINGS_MEN
+
+;Settings
+;
+MSG_SAVE_FORMAT_MEN
+
+;Save Format...
+;
+MSG_USER_INTERFACE_MEN
+
+;User Interface...
+;
+MSG_SAVE_ICONS_MEN
+
+;Save Icons
+;
+MSG_CONFIRM_OVERWRITE_MEN
+
+;Confirm Overwrite
+;
+MSG_CONFIRM_EXIT_MEN
+
+;Confirm Exit
+;
+MSG_VERBOSE_MEN
+
+;Verbose Log
+;
+MSG_OPEN_SETTINGS_MEN
+
+;Open Settings...
+;
+MSG_SAVE_SETTINGS_MEN
+
+;Save Settings
+;
+MSG_SAVE_SETTINGS_AS_MEN
+
+;Save Settings As...
+;
+;
+MSG_ABOUT_TEXT
+
+;%s\n\
+;A Music Module Processing Utility\n\n\
+;\
+;%s\n\
+;All rights reserved.\n\n\
+;\
+;Internet: bernie@shock.cosmos.it\n\n\
+;FidoNet:  2:332/125.1\n\
+;\
+;Free CHIP Memory: %ldKB\n\
+;Free FAST Memory: %ldKB\n\n\
+;Public Screen: %s\n\
+;ARexx Port: %s\n\
+;Cx HotKey: %s\n\
+;Language: %s
+;
+MSG_DEFAULT
+
+;-- Default --
+;
+MSG_DISABLED
+
+;-- Disabled --
+;
+;
+; *********************************
+; * Strings for OptimizationWin.c *
+; *********************************
+;
+MSG_OPTIMIZATION_TITLE
+
+;Module Optimization
+;
+;
+MSG_OPTIMIZE_GAD
+
+;_Optimize
+;
+MSG_REM_UNUSED_PATTS_GAD
+
+;Remove Unused _Patterns
+;
+MSG_REM_DUPLICATE_PATTS_GAD
+
+;Remove _Duplicate Patterns
+;
+MSG_REM_UNUSED_INSTR_GAD
+
+;Remove Unused _Instruments
+;
+MSG_REM_DUP_INSTR_GAD
+
+;Remove Duplicate I_nstruments
+;
+MSG_CUT_AFTER_LOOP_GAD
+
+;Cut Instruments After _Loop
+;
+MSG_CUT_ZERO_TAILS_GAD
+
+;Cut Instrument _Zero Tails
+;
+MSG_CUT_PATTERNS_GAD
+
+;Cut _Breaked Patterns
+;
+MSG_REMAP_INSTRUMENTS_GAD
+
+;_Remap Instruments
+;
+;
+MSG_SAVED_X_BYTES
+
+;Saved %ld bytes (%ld%%)
+;
+;
+; **************************
+; * Strings for PrefsWin.c *
+; **************************
+;
+;
+MSG_PREFS_TITLE
+
+;User Interface Settings
+;
+;
+MSG_PUBLIC_SCREEN_GAD
+
+;_Public Screen
+;
+MSG_DISPLAY_MODE_GAD
+
+;Display _Mode
+;
+MSG_WINDOW_FONT_GAD
+
+;_Window Font
+;
+MSG_LISTVIEW_FONT_GAD
+
+;_ListView Font
+;
+MSG_REQUESTERS_GAD
+
+;_Requesters
+;
+MSG_USE_DATATYPES_GAD
+
+;Use _DataTypes
+;
+MSG_APPICON_GAD
+
+;Put App_Icon
+;
+MSG_REFRESH_GAD
+
+;Refres_h
+;
+MSG_LOG_TO_FILE_GAD
+
+;Log To File
+;
+MSG_LOG_LEVEL_GAD
+
+;_Log Level
+;
+MSG_ASK_AUTOSAVE_GAD
+
+;Confirm _Autosave
+;
+MSG_AUTOSAVE_TIME_GAD
+
+;Autosave Mi_nutes
+;
+MSG_DO_BACKUPS_GAD
+
+;Create _Backups
+;
+MSG_BACKUP_TEMPLATE_GAD
+
+;Bac_kup Template
+;
+MSG_BACKUP_VERSIONS_GAD
+
+;Backup _Versions
+;
+MSG_ASL_GAD
+
+;Asl
+;
+MSG_REQTOOLS_GAD
+
+;ReqTools
+;
+MSG_SMART_GAD
+
+;Smart
+;
+MSG_SIMPLE_GAD
+
+;Simple
+;
+MSG_CLONE_DEF_SCREEN
+
+;--Clone Default Screen--
+;
+;
+; ****************************
+; * Strings for PatternWin.c *
+; ****************************
+;
+MSG_PATTERN_TITLE
+
+;Pattern Editor
+;
+;
+MSG_PATTERNS_MEN
+
+;Patterns
+;
+MSG_SIZE_MEN
+
+;Size...
+;
+MSG_EDIT_MEN
+
+;Edit
+;
+MSG_MARK_MEN
+
+;Mark
+;
+MSG_CUT_MEN
+
+;Cut
+;
+MSG_COPY_MEN
+
+;Copy
+;
+MSG_PASTE_MEN
+
+;Paste
+;
+MSG_ERASE_MEN
+
+;Erase
+;
+MSG_UNDO_MEN
+
+;Undo
+;
+MSG_REDO_MEN
+
+;Redo
+;
+MSG_EDITOR_SETTINGS_MEN
+
+;Editor Settings...
+;
+;
+; ***************************
+; * Strings for SaversWin.c *
+; ***************************
+;
+MSG_SAVERS_TITLE
+
+;Savers
+;
+;
+MSG_SF_SEQUENCE_GAD
+
+;Se_quence
+;
+MSG_SF_INSTRUMENTS_GAD
+
+;_Instruments
+;
+MSG_SF_PATTERNS_GAD
+
+;_Patterns
+;
+MSG_SF_NAMES_GAD
+
+;Names
+;
+MSG_ADD_ICON_GAD
+
+;Add I_con
+;
+MSG_MODE_GAD
+
+;_Mode
+;
+MSG_OPTIONS_DOTS_GAD
+
+;Options...
+;
+MSG_NONE_GAD
+
+;None
+;
+MSG_XPK_GAD
+
+;XPK
+;
+MSG_LHA_GAD
+
+;LhA
+;
+;
+MSG_DESCRIPTION
+
+;Description
+;
+MSG_AUTHOR
+
+;Author
+;
+MSG_MAXLENGTH
+
+;Max Length
+;
+MSG_MAXTRACKS
+
+;Max Tracks
+;
+MSG_MAXINSTRUMENTS
+
+;Max Instruments
+;
+MSG_MAXPATTERNS
+
+;Max Patterns
+;
+MSG_MAXPATTLEN
+
+;Max Pattern Length
+;
+MSG_MAXSAMPLELEN
+
+;Max Sample Length
+;
+;
+; **********************
+; * Strings ClearWin.c *
+; **********************
+;
+MSG_CLEAR_TITLE
+
+;Clear Module
+;
+;
+MSG_CLR_SEQUENCE_GAD
+
+;_Sequence
+;
+MSG_CLR_INSTRUMENTS_GAD
+
+;_Instruments
+;
+MSG_CLR_PATTERNS_GAD
+
+;_Patterns
+;
+MSG_CLEARMOD_GAD
+
+;_Clear
+;
+;
+; ***************************
+; * Strings for SampleWin.c *
+; ***************************
+;
+MSG_SAMPLE_TITLE
+
+;Sample Editor
+;
+;
+MSG_RENDER_MEN
+
+;Render
+;
+MSG_POINTS_MEN
+
+;Points
+;
+MSG_LINES_MEN
+
+;Lines
+;
+MSG_FILLED_MEN
+
+;Filled
+;
+;
+; *****************************
+; * Strings for PattSizeWin.c *
+; *****************************
+;
+MSG_PATTSIZE_TITLE
+
+;Pattern Attributes
+;
+;
+MSG_LINES_GAD
+
+;_Lines
+;
+MSG_TRACKS_GAD
+
+;_Tracks
+;
+MSG_DOUBLE_GAD
+
+;_Double
+;
+MSG_HALVE_GAD
+
+;_Halve
+;
+;
+; *************************
+; * Strings for Library.c *
+; *************************
+;
+MSG_SONG_TOO_MANY_TRACKS
+
+;WARNING: The selected saver supports max %lu tracks, but the song has %lu tracks.
+;
+MSG_SONG_TOO_MANY_PATTS
+
+;WARNING: The selected saver supports max %lu patterns; the song has %lu patterns.
+;
+MSG_SONG_TOO_MANY_INSTRS
+
+;WARNING: The selected saver supports max %lu instruments, last instrument is %lu.
+;
+MSG_SONG_TOO_MANY_POS
+
+;WARNING: The selected saver supports max %lu positions, but the song has %lu positions.
+;
+MSG_PATT_LENGTH_INVALID
+
+;WARNING: The length of pattern %ld ($%lx lines) isn't allowed with the selected saver.
+;
+MSG_INSTR_TOO_LONG
+
+;WARNING: Instrument %lx is too long and will be cropped to %lu bytes.
+;
+MSG_WILL_MODIFY_SONG
+
+;Some modifications need to be performed on this song\n\
+;in order to adapt it to the limitations of the\n\
+;destination format.
+;
+MSG_TRY_REMAPPING_INSTRUMENTS
+
+;Some instruments are placed beyond the limit for\n\
+;the selected format.\n\
+;Remapping the instruments now could help saving\n\
+;all them along with the selected format.
+;
+MSG_SAVING_MODULE
+
+;Saving %s module \"%s\"...
+; the first %s is the format name, the second %s is the song name.
diff --git a/Catalogs/français.ct b/Catalogs/français.ct
new file mode 100644 (file)
index 0000000..5b6f2a6
--- /dev/null
@@ -0,0 +1,1491 @@
+## version $VER: Français.ct 1.0 (10.9.95)
+## language français
+## codeset 0
+;
+## chunk AUTH Français catalog translation by Julien Wilk <wilkj@esiee.fr>
+;**
+;** XModule.cd 3.9
+;**
+;** Copyright (C) 1995,96 Bernardo Innocenti
+;**
+;
+; **********************************
+; * Strings for all source modules *
+; **********************************
+;
+;
+MSG_NULL
+
+;
+; This string should remain blank.
+;
+MSG_OK
+Ok
+;Ok
+;
+MSG_UNDERSCORE_USE_GAD
+
+;_Use
+;
+MSG_UNDERSCORE_OK_GAD
+
+;_Ok
+;
+MSG_UNDERSCORE_CANCEL_GAD
+
+;_Cancel
+;
+MSG_YES_OR_NO
+Oui|Non
+;Yes|No
+;
+MSG_RETRY_OR_CANCEL
+Réessayer|Abandonner
+;Retry|Cancel
+;
+MSG_PROCEED_OR_CANCEL
+
+;Proceed|Cancel
+;
+MSG_CONTINUE
+Continuer
+;Continue
+;
+MSG_NO_FREE_STORE
+Mémoire insuffisante !
+;Insufficient memory.
+;
+MSG_BREAK
+Tache abandonnée.
+;Aborted.
+;
+MSG_ERR_LOAD
+Impossible de charger \"%s\": %s.
+;Unable to load \"%s\"
+; %s is the filename. A colon ':' and the explanation of failure will be postpended.
+;
+MSG_CANT_OPEN
+Impossible d'ouvrir le fichier \"%s\" %s.
+;Cannot open file \"%s\"
+; %s is the filename. A colon ':' and the explanation of failure will be postpended.
+;
+MSG_ERROR_READING
+Erreur en lecture de \"%s\": %s.
+;Error reading \"%s\"
+; %s is the filename. A colon ':' and the explanation of failure will be postpended.
+;
+MSG_ERROR_WRITING
+Erreur d'écriture de \"%s\" %s.
+;Error writing \"%s\"
+; %s is the filename. A colon ':' and the explanation of failure will be postpended.
+;
+;
+; *****************************
+; * Strings for Compression.c *
+; *****************************
+;
+MSG_DECRUNCHING
+Décompression...
+;Decrunching...
+;
+MSG_NOTHING_IN_ARC
+Aucun module trouvé dans l'archive \"%s\".
+;Nothing found in archive \"%s\".
+;
+MSG_CANT_LOAD_COMPRESSED
+Impossible de charger le fichier compressé.
+;Unable to load compressed file.
+;
+MSG_ERROR_DECOMPRESSING
+Erreur de décompression de \"%s\": %s.
+;Error decompressing file \"%s\": %s.
+;
+;
+; ********************
+; * Strings for Cx.c *
+; ********************
+;
+MSG_BAD_HOTKEY
+Mauvaise définition de la HotKey.
+;Bad Commodity HotKey description.
+;
+;
+; ***************************
+; * Strings for all loaders *
+; ***************************
+;
+MSG_READING_PATTS
+Lecture des Patterns...
+;Reading Patterns...
+;
+MSG_READING_INSTS_INFO
+Lecture des Info-Instruments...
+;Reading Instruments Info...
+;
+MSG_READING_INSTS
+Lecture des Instruments...
+;Reading Instruments...
+;
+MSG_ERR_CANT_LOAD_PATT
+ERREUR: Ne peut charger la pattern %ld.
+;ERROR: Couldn't load pattern %ld.
+;
+MSG_ERR_CANT_LOAD_INST
+ERREUR: Ne peut lire l'instrument %lx.
+;ERROR: Couldn't load instrument %lx.
+;
+MSG_ERR_NO_MEM_FOR_INST
+ERREUR: Pas assez de mémoire pour l'instrument %lx.
+;ERROR: Not enough memory for instrument %lx.
+;
+MSG_ERR_NOT_A_SAMPLE
+ERREUR: L'instrument %lx n'est pas un sample.
+;ERROR: Instrument %lx is not a sample.
+;
+MSG_SONG_TOO_LONG
+ATTENTION: Chanson trop longue. (excédent tronqué).
+;WARNING: Song length exceeds maximum. Will be truncated.
+;
+MSG_SONG_HAS_TOO_MANY_PATT
+ATTENTION: Trop de patterns.
+;WARNING: Song exceeds maximum number of patterns.
+;
+MSG_PATT_TOO_MANY_TRACKS
+ATENTION: La pattern %ld posséde trop de pistes. (Réduite à %ld pistes).
+;WARNING: Pattern %ld has too many tracks. Cropping to %ld tracks.
+;
+MSG_PATT_TOO_MANY_LINES
+ATTENTION: La pattern %ld posséde trop de lignes. (Réduite à %ld lignes).
+;WARNING: Pattern %ld has too many lines. Cropping to %ld lines.
+;
+MSG_INVALID_NOTE
+ATTENTION: Note %ld invalide (Pattern %ld Piste %ld Ligne %ld).
+;WARNING: Invalid note %ld (Patt %ld Track %ld Line %ld).
+;
+MSG_UNKNOWN_EFF
+Effet inconnu : $%lx (Pattern %ld Piste %ld Ligne %ld).
+;Unknown effect: $%lx (Patt %ld Track %ld Line %ld).
+;
+MSG_EXTRA_DATA_AFTER_MOD
+ATTENTION: Données supplémentaire après le module: Elles seront ignorées.
+;WARNING: Extra data found after valid module: Will be ignored.
+;
+MSG_WRITING_HEADER
+Ecriture de l'en-tête...
+;Writing Header...
+;
+MSG_WRITING_PATTS
+Ecriture des Patterns...
+;Writing Patterns...
+;
+MSG_WRITING_INSTS
+Ecriture des Instruments...
+;Writing Instruments...
+;
+MSG_WRITING_INSTINFO
+Ecriture des Info-Instruments...
+;Writing Instruments Info...
+;
+MSG_WRITING_INSTDATA
+Ecriture des Data-Instruments...
+;Writing Instruments Data...
+;
+MSG_NOTE_TOO_LOW
+ATTENTION: La note en Pattern %ld Piste %ld Ligne %ld est trop basse.
+;WARNING: Note at Patt %ld Track %ld Line %ld is too low.
+;
+MSG_NOTE_TOO_HIGH
+ATTENTION: La note en Pattern %ld Piste %ld Ligne %ld est trop haute.
+;WARNING: Note at Patt %ld Track %ld Line %ld is too high.
+;
+MSG_NO_MEM_TO_HALVE
+ATTENTION: Pas assez de mémoire pour réduire le volume de l'instrument %lx.
+;WARNING: Not enough memory to halve volume of instrument %lx.
+;
+;
+; *****************************
+; * Strings for Get/SaveMED.c *
+; *****************************
+;
+MSG_READING_MMD
+Chargement du module MMD%lc...
+;Loading MMD%lc module...
+; The %lc is the MED format (0, 1, 2, ...)
+;
+MSG_UNSUPPORTED_MMD_FORMAT
+ERREUR: Format OctaMED non reconnu.
+;ERROR: Unsupported OctaMED format.
+;
+MSG_WRONG_EFFECT_IN_MMD0
+ATTENTION: L'effet %lx n'est pas reconnu dans le format MMD0. Utilisez le MMD1 ou mieux.
+;WARNING: Effect %lx is not supported in MMD0 format. Use MMD1 or better.
+;
+;
+; ***********************************
+; * Strings for ScreamTrackerHook.c *
+; ***********************************
+;
+MSG_ADLIB_INSTR
+ERREUR: L'instrument %lx est un %s ADLIB.
+;ERROR: Instrument %lx is an ADLib %s.
+; %s is the name of the ADLib instrument (eg: Snare).
+;
+MSG_TRACK_OUT_OF_RANGE
+ATTENTION: La piste %lx est hors de portée.
+;WARNING: Track %lx is out of range.
+;
+MSG_UNKNOWN_SAMPLE_COMPRESSION
+ATTENTION: Type de compression inconnue pour l'intrument %lx.
+;WARNING: Unknown sample compression for instrument %lx.
+;
+MSG_INST_IS_STEREO
+ATTENTION: L'instrument %lx est un sample stéréo.
+;WARNING: Instrument %lx is a stereo sample.
+;
+MSG_INST_IS_16BIT
+ATTENTION: L'instrument %lx est en 16 bits: impossible de le charger.
+;WARNING: Instrument %lx is 16bit: unable to load it.
+;
+;
+; *****************************
+; * Strings for TrackerHook.c *
+; *****************************
+;
+MSG_READING_TYPE_MODULE
+Chargement du module en %s...
+;Reading %s module...
+; (%s is the module format)
+;
+MSG_EXCEEDS_64_PATTS
+ATTENTION: Le module contient plus de 64 patterns. Il nécessite au moins ProTracker 2.3.
+;NOTE: Module exceeds 64 patterns. You need ProTracker 2.3 to play it.
+;
+MSG_MODULE_ID
+
+;Tracker ID: \"%s\"
+;
+MSG_MODULE_HAS_N_CHN
+
+;Module has %lu tracks...
+;
+MSG_SONG_HAS_NO_INSTS
+Ce fichier est une "song" et ne contient aucun instruments.
+;This file is a song and doesn't contain instruments.
+;
+MSG_EXCEEDS_MAXPAATTS
+ATTENTION: Le module contient plus de %ld patterns.
+;WARNING: Module execeeds %ld patterns.
+;
+MSG_PATT_WILL_GROW
+La pattern %ld est rallongée à 64 lignes. Elle n'était que de %ld lignes.
+;Pattern %ld will grow to 64 lines (was %ld lines long).
+;
+MSG_SPLITTING_PATT
+Morcelage de la pattern %ld (longue de %ld lignes).
+;Splitting pattern %ld (was %ld lines long).
+;
+; **************************
+; * Strings for SaveMIDI.c *
+; **************************
+;
+MSG_CHOOSING_CHANNELS
+Choix des voix...
+;Choosing Channels...
+;
+MSG_WRITING_MIDI_TRACKS
+Ecriture de pistes MIDI...
+;Writing MIDI Tracks...
+;
+MSG_TOO_MANY_CHANNELS
+ERREUR: Cette "song" requiert trop de voix MIDI.
+;ERROR: Song requires too many MIDI channels.
+;
+;
+; *********************
+; * Strings for Gui.c *
+; *********************
+;
+MSG_REALLY_QUIT_XMODULE
+Vous voulez VRAIMENT quitter XModule ?
+;Really Quit XModule?
+;
+MSG_CLOSE_ALL_WINDOWS
+Veuillez fermer toutes les fenêtres\n\
+puis cliquer sur 'Continuer'.
+;Please close all visitor windows\n\
+;and then select `Continue'.
+;
+;
+; ***********************
+; * Strings for Instr.c *
+; ***********************
+;
+MSG_UNKNOWN_IFF
+Format IFF inconnu pour %s.
+;Unknown IFF format %s.
+;
+MSG_ILLEGAL_IFF_STRUCTURE
+Structure IFF incohérente.
+;Illegal IFF structure.
+;
+MSG_SELECT_RAW_MODE
+Format d'instrument inconnu.\n\
+Veuillez sélectionner le mode RAW.
+;Unrecognized instrument format.\n\
+;Please select RAW mode.
+;
+MSG_RAW_MODES
+8 bits signé|8 bits non signés|Abandonner
+;Signed 8bit|Unsigned 8bit|Cancel
+;
+MSG_DATATYPES_ERROR
+Erreur de DataTypes: %s.
+;DataTypes error: %s.
+; %s is a detailed description of the problem.
+;
+MSG_UNKNOWN_COMPRESSION
+Type de compression inconnu.
+;Unknown compression type.
+;
+MSG_SAMPLE_WRONG_SIZE
+Les samples de %lu bits ne sont pas acceptés.
+;%lu bit samples are not supported.
+; %lu is the number of bits per sample.
+;
+MSG_SAMPLE_NOT_MONO
+Les samples autres que MONO ne sont pas acceptés.
+;Samples other than MONO are not supported.
+;
+MSG_SAMPLE_WRONG_NUMBER_OF_CHANNELS
+Les samples de %ld voix ne sont pas acceptés.
+;Samples with %ld channels are not supported.
+;
+MSG_NO_MEMORY_TO_OPTIMIZE_INSTR
+ATTENTION: Mémoire insuffisante pour optimiser l'instrument %lx.
+;WARNING: insufficient memory to optimize instrument %lx.
+;
+MSG_INSTR_WILL_SHRINK
+L'instrument %lx sera réduit de %ld à %ld.
+;Instrument %lx will shrink from %ld to %ld.
+;
+MSG_INSTR_DUPES_REMOVED
+Instrument redondant décelé et retiré: %lx == %lx.
+;Duplicate instruments found and removed: %lx == %lx.
+;
+MSG_INSTR_UNUSED
+L'instrument %lx n'étant jamais utilisé, il est retiré.
+;Instrument %lx was never used and it's being removed.
+;
+;
+; **********************
+; * Strings for Misc.c *
+; **********************
+;
+MSG_OPENLIB_VER_FAIL
+
+;Couldn't open \"%s\" version %ld or greater.
+;
+MSG_OPENLIB_FAIL
+Impossible d'ouvrir %s version %ld ou supérieur.
+;Couldn't open \"%s\".
+;
+;
+; ***************************
+; * Strings for Operators.c *
+; ***************************
+;
+MSG_CANT_INSERT_PATT
+Impossible d'insérer une autre pattern: La limite a déjà été atteinte.
+;Unable to insert pattern: Maximum number of patterns reached.
+;
+MSG_PATT_UNUSED
+La pattern %ld n'étant jamais utilisée, elle est retirée.
+;Pattern %ld is not used and is beeing deleted.
+;
+MSG_PATT_CUT
+La pattern %ld est coupée à la ligne %ld.
+;Pattern %ld will be cut at line %ld.
+;
+MSG_PATT_DUPE
+Pattern redondante décelée et retirée: %ld == %ld.
+;Duplicate patterns found and removed: %ld == %ld.
+; The two %ld are the pattern numbers.
+;
+MSG_SONG_LEN_DIFFERENT
+ATTENTION: Longueurs des "song" différentes. La plus petite est conservée.
+;WARNING: Song lengths are different. Using shorter one.
+;
+MSG_PATT_LEN_DIFFERENT
+ATTENTION: Patterns de longueurs différentes en %ld. La plus petite est conservée.
+;WARNING: Different pattern lengths at position %ld. Using shorter one.
+;
+MSG_ERR_INSTR_OVERFLOW
+
+;ERROR: Instruments overflow. Try remapping the instruments.
+;
+;
+; ***********************
+; * Strings for Prefs.c *
+; ***********************
+;
+MSG_BAD_PREFS_VERSION
+Version incorrecte du fichier de préférences.
+;Incorrect version of preferences file
+;
+;
+; ****************************
+; * Strings for Requesters.c *
+; ****************************
+;
+MSG_XMODULE_REQUEST
+Requête de XModule
+;XModule Request
+; This is the title of requesters put out by XModule.
+;
+MSG_CLONE_WB
+Clône de l'écran Workbench
+;Clone Workbench Screen
+;
+MSG_CLOSE_FILEREQUESTER
+Veuillez fermer le Requester de fichier\n et sélectionner 'Continuer'.
+;Please close FileRequester\n and then select `Continue'.
+;
+MSG_SELECT_MODULES
+Sélectionnez le(s) Module(s)...
+;Select Module(s)...
+;
+MSG_SELECT_INSTRUMENTS
+Sélectionnez l(es) Instrument(s)...
+;Select Instrument(s)...
+;
+MSG_SELECT_PATTERN
+sélectionnez la Pattern...
+;Select Pattern...
+;
+MSG_SAVE_MODULE
+Ecriture du module...
+;Save Module...
+;
+MSG_SAVE_INSTRUMENT
+Ecriture de l'instrument...
+;Save Instrument...
+;
+MSG_SAVE_PATTERN
+Ecriture de la pattern...
+;Save Pattern...
+;
+MSG_FILE_EXISTS
+Le fichier \"%s\"\n existe déjà.
+;File \"%s\"\nalready exists.
+;
+MSG_OVERWRITE
+Réécrire|Choisir un autre|Abandonner
+;Overwrite|Choose Another|Abort
+;
+;
+; **********************
+; * Strings for Song.c *
+; **********************
+;
+MSG_CLOSE_ALL_SONGS
+
+;Please close all open songs\n\
+;and then select `Continue'.
+;
+MSG_UNESPECTED_EOF
+Mauvaise fin de fichier.
+;Unespected end of file.
+;
+MSG_MODULE_LOADED_OK
+Module chargé OK.
+;Module loaded OK.
+;
+MSG_MODULE_SAVED_OK
+Module sauvagardé OK.
+;Module saved OK.
+;
+MSG_UNKNOWN_SAVE_FORMAT
+ERREUR: Format de sauvegarde inconnu.
+;ERROR: Unrecognized save format.
+;
+MSG_INVALID_LOOP_REMOVED
+Loop invalide de l'instrument %lx retiré.
+;Removed invalid loop for instrument %lx.
+;
+MSG_INVALID_LOOP_FIXED
+Loop invalide de l'instrument %lx corrigé.
+;Fixed invalid loop for instrument %lx.
+;
+MSG_SONG_HAS_NO_PATTS
+ATTENTION: La "song" ne contient aucune pattern.
+;WARNING: Song has no patterns.
+;
+MSG_SONG_HAS_NO_SEQ
+ATTENTION: La "song" ne contient aucune séquence.
+;WARNING: Song has no sequence.
+;
+MSG_INVALID_SONG_POS
+ATTENTION: La "song" en %ld référencie la pattern %ld qui n'existe pas.
+;WARNING: Song position %ld references pattern %ld, which doesn't exist.
+;
+MSG_UNKNOWN_MOD_FORMAT
+Impossible d'identifier le format de ce module.\n\
+(Charger un ficher de datas comme un module n'est pas très judicieux)
+;Unable to identify module format.\n\
+;(Loading a data file as a module is unwise)
+;
+MSG_SOUND_PRO_CANCEL
+SoundTracker 15|ProTracker|Abandonner
+;SoundTracker 15|ProTracker|Cancel
+;
+MSG_AUTHOR_UNKNOWN
+Inconnu
+;Unknown
+;
+MSG_SONG_UNTITLED
+Pas de titre
+;Untitled
+;
+;
+; **********************
+; * Strings for Help.c *
+; **********************
+;
+MSG_AMIGAGUIDE_ERROR
+Erreur AmigaGuide:
+;AmigaGuide error:
+; Note one blank space at the end of this line!
+;
+;
+; ***************************
+; * Strings for PattPrefs.c *
+; ***************************
+;
+MSG_PATTPREFS_TITLE
+
+;Pattern Editor Settings
+;
+;
+MSG_ADVANCE_TRACKS_GAD
+
+;Advance _Tracks
+;
+MSG_ADVANCE_LINES_GAD
+
+;Advance _Lines
+;
+MSG_MAX_UNDO_LEVELS_GAD
+
+;Max _Undo Levels
+;
+MSG_MAX_UNDO_MEM_GAD
+
+;Max Undo _Memory
+;
+MSG_CLIPBOARD_UNIT_GAD
+
+;Cli_pboard Unit
+;
+MSG_SCROLLER_POS_GAD
+
+;_Scroller Position
+;
+MSG_VERT_WRAP_GAD
+
+;_Vertical Wrap
+;
+MSG_HORIZ_WRAP_GAD
+
+;_Horizontal Wrap
+;
+MSG_HEX_LINE_NUMBERS_GAD
+
+;He_x Line Numbers
+;
+MSG_BLANK_ZERO_GAD
+
+;Blank _Zero Digits
+;
+MSG_BACKDROP_GAD
+
+;Backdrop _Window
+;
+MSG_HORIZ_SCROLLER_GAD
+
+;Ho_rizontal Scroller
+;
+MSG_DO_RULER_GAD
+
+;Display Cursor Ruler
+;
+MSG_DO_TINY_LINES_GAD
+
+;Display Tiny Lines
+;
+MSG_EDITOR_FONT_GAD
+
+;_Editor Font
+;
+MSG_BACKGROUND_PEN_GAD
+
+;Background
+;
+MSG_TEXT_PEN_GAD
+
+;T_ext
+;
+MSG_LINES_PEN_GAD
+
+;Li_nes
+;
+MSG_TINY_LINES_PEN_GAD
+
+;Tin_y Lines
+;
+MSG_RIGHT_GAD
+
+;Right
+;
+MSG_LEFT_GAD
+
+;Left
+;
+MSG_OFF_GAD
+
+;Off
+;
+MSG_PATT_TOO_LONG
+ERREUR: La pattern dépasse le nombre maximum de lignes.
+;ERROR: Pattern would exceed the maximum number of lines.
+;
+;
+; *****************************
+; * Strings for SequenceWin.c *
+; *****************************
+;
+;
+MSG_SEQUENCE_TITLE
+
+;Sequence Editor
+;
+;
+MSG_SEQUENCE_GAD
+
+;Sequence
+;
+MSG_UNDERSCORE_ADD_GAD
+
+;_Add
+;
+MSG_UP_GAD
+
+;Up
+;
+MSG_DOWN_GAD
+
+;Down
+;
+MSG_UNDERSCORE_NAME_GAD
+
+;_Name
+;
+MSG_PATTERNS_GAD
+
+;Patterns
+;
+MSG_UNDERSCORE_UP_GAD
+
+;_Up
+;
+MSG_UNDERSCORE_DOWN_GAD
+
+;_Down
+;
+MSG_UNDERSCORE_INS_GAD
+
+;_Ins
+;
+;
+MSG_UNNAMED
+
+;-- unnamed --
+;
+;
+; ********************************
+; * Strings for InstrumentsWin.c *
+; ********************************
+;
+MSG_INSTRUMENTS_TITLE
+
+;Instruments
+;
+;
+MSG_VOLUME_GAD
+
+;_Volume
+;
+MSG_FINETUNE_GAD
+
+;_FineTune
+;
+MSG_LENGTH_GAD
+
+;Length
+;
+MSG_KIND_GAD
+
+;_Kind
+;
+MSG_EDIT_DOTS_GAD
+
+;_Edit...
+;
+MSG_SAMPLE_GAD
+
+;Sample
+;
+MSG_SYNTH_GAD
+
+;Synth
+;
+MSG_HYBRID_GAD
+
+;Hybrid
+;
+;
+MSG_INSTRUMENTS_MEN
+
+;Instruments
+;
+MSG_LOAD_MEN
+
+;Load...
+;
+MSG_REMAP_MEN
+
+;Remap
+;
+MSG_SAVE_COMPRESSED_MEN
+
+;Save Compressed
+;
+MSG_SAVE_RAW_MEN
+
+;Save Raw
+;
+;
+MSG_EMPTY
+
+;-- empty --
+;
+;
+; *************************
+; * Strings for PlayWin.c *
+; *************************
+;
+MSG_PLAY_TITLE
+
+;Play
+;
+;
+MSG_VOL_GAD
+
+;_Vol
+;
+MSG_POS_GAD
+
+;Pos
+;
+MSG_TIME_GAD
+
+;Time
+;
+MSG_RST_GAD
+
+;_Rst
+; Stands for Reset/Restart
+;
+MSG_PLAYER_INIT_ERR
+Erreur d'initialisation du Player: %ld.
+;Player initialization error: %ld.
+;
+;
+; *****************************
+; * Strings for ProgressWin.c *
+; *****************************
+;
+MSG_PROGRESS_TITLE
+
+;XModule is working...
+;
+MSG_LOG_TITLE
+
+;XModule Log
+;
+;
+MSG_UNDERSCORE_ABORT_GAD
+
+;_Abort
+;
+;
+MSG_PERCENT_DONE
+%ld de %ld (%ld%% réalisés).
+;%ld of %ld (%ld%% done)
+; This string appears inside the progress window gauge.
+; eg: "5 of 20 (25% done)".
+; Leave that double percent (%%) alone! :-)
+;
+;
+; *****************************
+; * Strings for SongInfoWin.c *
+; *****************************
+;
+MSG_SONGINFO_TITLE
+
+;Song Information
+;
+;
+MSG_UNDERSCORE_NEW_GAD
+
+;Ne_w
+;
+MSG_OPEN_GAD
+
+;_Open...
+;
+MSG_SAVE_GAD
+
+;_Save
+;
+MSG_DEL_GAD
+
+;Del
+;
+MSG_SONG_NAME_GAD
+
+;Song _Name
+;
+MSG_AUTHOR_NAME_GAD
+
+;_Author
+;
+MSG_DEF_TEMPO_GAD
+
+;_Tempo
+;
+MSG_DEF_SPEED_GAD
+
+;S_peed
+;
+MSG_RESTART_GAD
+
+;_Restart
+;
+MSG_LENGHT_GAD
+
+;Length
+;
+MSG_NUM_PATTS_GAD
+
+;Num Patterns
+;
+MSG_NUM_TRACKS_GAD
+
+;Tracks
+;
+MSG_TOT_MOD_SIZE_GAD
+
+;Total Module Size
+;
+MSG_TOT_INST_SIZE_GAD
+
+;Total Instruments Size
+;
+;
+MSG_SONG_MEN
+
+;Song
+;
+MSG_MERGE_SONGS_MEN
+
+;Merge Songs
+;
+MSG_JOIN_SONGS_MEN
+
+;Join Songs
+;
+;
+MSG_JOIN_REQUIRES_TWO_SONGS
+ERREUR: Un ajout nécessite deux "song".
+;ERROR: Join requires two songs.
+;
+MSG_MERGE_REQUIRES_TWO_SONGS
+ERREUR: Une fusion nécessite deux "song".
+;ERROR: Merge requires two songs.
+;
+MSG_DISCARD_CURRENT_SONG
+Abandonner le traitement de cette "song"?
+;Discard current song?
+;
+;
+; ****************************
+; * Strings for ToolBoxWin.c *
+; ****************************
+;
+MSG_TOOLBOX_TITLE
+
+;ToolBox
+;
+;
+MSG_PLAY_GAD
+
+;Play...
+;
+MSG_SONGS_GAD
+
+;_Songs...
+;
+MSG_PATTERNS_DOTS_GAD
+
+;_Patterns...
+;
+MSG_INSTRUMENTS_GAD
+
+;_Instruments...
+;
+MSG_SEQUENCE_DOTS_GAD
+
+;Se_quence...
+;
+MSG_OPTIMIZATION_GAD
+
+;_Optimization...
+;
+MSG_PROJECT_MEN
+
+;Project
+;
+MSG_NEW_MEN
+
+;New
+;
+MSG_OPEN_MEN
+
+;Open...
+;
+MSG_OPEN_NEW_MEN
+
+;Open New...
+;
+MSG_SAVE_MEN
+
+;Save
+;
+MSG_SAVE_AS_MEN
+
+;Save As...
+;
+MSG_CLEAR_MEN
+
+;Clear...
+;
+MSG_ABOUT_MEN
+
+;About...
+;
+MSG_HELP_MEN
+
+;Help...
+;
+MSG_ICONIFY_MEN
+
+;Iconify...
+;
+MSG_QUIT_MEN
+
+;Quit
+;
+MSG_SETTINGS_MEN
+
+;Settings
+;
+MSG_SAVE_FORMAT_MEN
+
+;Save Format...
+;
+MSG_USER_INTERFACE_MEN
+
+;User Interface...
+;
+MSG_SAVE_ICONS_MEN
+
+;Save Icons
+;
+MSG_CONFIRM_OVERWRITE_MEN
+
+;Confirm Overwrite
+;
+MSG_CONFIRM_EXIT_MEN
+
+;Confirm Exit
+;
+MSG_VERBOSE_MEN
+
+;Verbose Log
+;
+MSG_OPEN_SETTINGS_MEN
+
+;Open Settings...
+;
+MSG_SAVE_SETTINGS_MEN
+
+;Save Settings
+;
+MSG_SAVE_SETTINGS_AS_MEN
+
+;Save Settings As...
+;
+;
+MSG_ABOUT_TEXT
+%s %s\n\
+Programme de Traitement de Modules\n\n\
+\
+%s\n\
+Tous droits réservés.\n\n\
+\
+Internet: bernie@shock.cosmos.it\n\n\
+FidoNet:  2:332/125.1\n\
+\
+Mémoire CHIP libre: %ld Ko\n\
+Mémoire FAST libre: %ld Ko\n\n\
+Ecran Public: %s\n\
+Port ARexx: %s\n\
+Cx_HotKey: %s\n\
+Language: %s
+;%s\n\
+;A Music Module Processing Utility\n\n\
+;\
+;%s\n\
+;All rights reserved.\n\n\
+;\
+;Internet: bernie@shock.cosmos.it\n\n\
+;FidoNet:  2:332/125.1\n\
+;\
+;Free CHIP Memory: %ldKB\n\
+;Free FAST Memory: %ldKB\n\n\
+;Public Screen: %s\n\
+;ARexx Port: %s\n\
+;Cx HotKey: %s\n\
+;Language: %s
+;
+MSG_DEFAULT
+--Défaut--
+;-- Default --
+;
+MSG_DISABLED
+--Désactivé--
+;-- Disabled --
+;
+;
+; *********************************
+; * Strings for OptimizationWin.c *
+; *********************************
+;
+MSG_OPTIMIZATION_TITLE
+
+;Module Optimization
+;
+;
+MSG_OPTIMIZE_GAD
+
+;_Optimize
+;
+MSG_REM_UNUSED_PATTS_GAD
+
+;Remove Unused _Patterns
+;
+MSG_REM_DUPLICATE_PATTS_GAD
+
+;Remove _Duplicate Patterns
+;
+MSG_REM_UNUSED_INSTR_GAD
+
+;Remove Unused _Instruments
+;
+MSG_REM_DUP_INSTR_GAD
+
+;Remove Duplicate I_nstruments
+;
+MSG_CUT_AFTER_LOOP_GAD
+
+;Cut Instruments After _Loop
+;
+MSG_CUT_ZERO_TAILS_GAD
+
+;Cut Instrument _Zero Tails
+;
+MSG_CUT_PATTERNS_GAD
+
+;Cut _Breaked Patterns
+;
+MSG_REMAP_INSTRUMENTS_GAD
+
+;_Remap Instruments
+;
+;
+MSG_SAVED_X_BYTES
+%ld octets gagnés (%ld%%)
+;Saved %ld bytes (%ld%%)
+;
+;
+; **************************
+; * Strings for PrefsWin.c *
+; **************************
+;
+;
+MSG_PREFS_TITLE
+
+;User Interface Settings
+;
+;
+MSG_PUBLIC_SCREEN_GAD
+
+;_Public Screen
+;
+MSG_DISPLAY_MODE_GAD
+
+;Display _Mode
+;
+MSG_WINDOW_FONT_GAD
+
+;_Window Font
+;
+MSG_LISTVIEW_FONT_GAD
+
+;_ListView Font
+;
+MSG_REQUESTERS_GAD
+
+;_Requesters
+;
+MSG_USE_DATATYPES_GAD
+
+;Use _DataTypes
+;
+MSG_APPICON_GAD
+
+;Put App_Icon
+;
+MSG_REFRESH_GAD
+
+;Refres_h
+;
+MSG_LOG_TO_FILE_GAD
+
+;Log To File
+;
+MSG_LOG_LEVEL_GAD
+
+;_Log Level
+;
+MSG_ASK_AUTOSAVE_GAD
+
+;Confirm _Autosave
+;
+MSG_AUTOSAVE_TIME_GAD
+
+;Autosave Mi_nutes
+;
+MSG_DO_BACKUPS_GAD
+
+;Create _Backups
+;
+MSG_BACKUP_TEMPLATE_GAD
+
+;Bac_kup Template
+;
+MSG_BACKUP_VERSIONS_GAD
+
+;Backup _Versions
+;
+MSG_ASL_GAD
+
+;Asl
+;
+MSG_REQTOOLS_GAD
+
+;ReqTools
+;
+MSG_SMART_GAD
+
+;Smart
+;
+MSG_SIMPLE_GAD
+
+;Simple
+;
+MSG_CLONE_DEF_SCREEN
+
+;--Clone Default Screen--
+;
+;
+; ****************************
+; * Strings for PatternWin.c *
+; ****************************
+;
+MSG_PATTERN_TITLE
+
+;Pattern Editor
+;
+;
+MSG_PATTERNS_MEN
+
+;Patterns
+;
+MSG_SIZE_MEN
+
+;Size...
+;
+MSG_EDIT_MEN
+
+;Edit
+;
+MSG_MARK_MEN
+
+;Mark
+;
+MSG_CUT_MEN
+
+;Cut
+;
+MSG_COPY_MEN
+
+;Copy
+;
+MSG_PASTE_MEN
+
+;Paste
+;
+MSG_ERASE_MEN
+
+;Erase
+;
+MSG_UNDO_MEN
+
+;Undo
+;
+MSG_REDO_MEN
+
+;Redo
+;
+MSG_EDITOR_SETTINGS_MEN
+
+;Editor Settings...
+;
+;
+; ***************************
+; * Strings for SaversWin.c *
+; ***************************
+;
+MSG_SAVERS_TITLE
+
+;Savers
+;
+;
+MSG_SF_SEQUENCE_GAD
+
+;Se_quence
+;
+MSG_SF_INSTRUMENTS_GAD
+
+;_Instruments
+;
+MSG_SF_PATTERNS_GAD
+
+;_Patterns
+;
+MSG_SF_NAMES_GAD
+
+;Names
+;
+MSG_ADD_ICON_GAD
+
+;Add I_con
+;
+MSG_MODE_GAD
+
+;_Mode
+;
+MSG_OPTIONS_DOTS_GAD
+
+;Options...
+;
+MSG_NONE_GAD
+
+;None
+;
+MSG_XPK_GAD
+
+;XPK
+;
+MSG_LHA_GAD
+
+;LhA
+;
+;
+MSG_DESCRIPTION
+
+;Description
+;
+MSG_AUTHOR
+
+;Author
+;
+MSG_MAXLENGTH
+
+;Max Length
+;
+MSG_MAXTRACKS
+
+;Max Tracks
+;
+MSG_MAXINSTRUMENTS
+
+;Max Instruments
+;
+MSG_MAXPATTERNS
+
+;Max Patterns
+;
+MSG_MAXPATTLEN
+
+;Max Pattern Length
+;
+MSG_MAXSAMPLELEN
+
+;Max Sample Length
+;
+;
+; **********************
+; * Strings ClearWin.c *
+; **********************
+;
+MSG_CLEAR_TITLE
+
+;Clear Module
+;
+;
+MSG_CLR_SEQUENCE_GAD
+
+;_Sequence
+;
+MSG_CLR_INSTRUMENTS_GAD
+
+;_Instruments
+;
+MSG_CLR_PATTERNS_GAD
+
+;_Patterns
+;
+MSG_CLEARMOD_GAD
+
+;_Clear
+;
+;
+; ***************************
+; * Strings for SampleWin.c *
+; ***************************
+;
+MSG_SAMPLE_TITLE
+
+;Sample Editor
+;
+;
+MSG_RENDER_MEN
+
+;Render
+;
+MSG_POINTS_MEN
+
+;Points
+;
+MSG_LINES_MEN
+
+;Lines
+;
+MSG_FILLED_MEN
+
+;Filled
+;
+;
+; *****************************
+; * Strings for PattSizeWin.c *
+; *****************************
+;
+MSG_PATTSIZE_TITLE
+
+;Pattern Attributes
+;
+;
+MSG_LINES_GAD
+
+;_Lines
+;
+MSG_TRACKS_GAD
+
+;_Tracks
+;
+MSG_DOUBLE_GAD
+
+;_Double
+;
+MSG_HALVE_GAD
+
+;_Halve
+;
+;
+; *************************
+; * Strings for Library.c *
+; *************************
+;
+MSG_SONG_TOO_MANY_TRACKS
+
+;WARNING: The selected saver supports max %lu tracks, but the song has %lu tracks.
+;
+MSG_SONG_TOO_MANY_PATTS
+
+;WARNING: The selected saver supports max %lu patterns; the song has %lu patterns.
+;
+MSG_SONG_TOO_MANY_INSTRS
+
+;WARNING: The selected saver supports max %lu instruments, last instrument is %lu.
+;
+MSG_SONG_TOO_MANY_POS
+
+;WARNING: The selected saver supports max %lu positions, but the song has %lu positions.
+;
+MSG_PATT_LENGTH_INVALID
+
+;WARNING: The length of pattern %ld ($%lx lines) isn't allowed with the selected saver.
+;
+MSG_INSTR_TOO_LONG
+ATTENTION: L'instrument %lx est trop long.
+;WARNING: Instrument %lx is too long and will be cropped to %lu bytes.
+;
+MSG_WILL_MODIFY_SONG
+
+;Some modifications need to be performed on this song\n\
+;in order to adapt it to the limitations of the\n\
+;destination format.
+;
+MSG_TRY_REMAPPING_INSTRUMENTS
+
+;Some instruments are placed beyond the limit for\n\
+;the selected format.\n\
+;Remapping the instruments now could help saving\n\
+;all them along with the selected format.
+;
+MSG_SAVING_MODULE
+
+;Saving %s module \"%s\"...
+; the first %s is the format name, the second %s is the song name.
diff --git a/Catalogs/italiano.ct b/Catalogs/italiano.ct
new file mode 100644 (file)
index 0000000..27bc5f1
--- /dev/null
@@ -0,0 +1,1488 @@
+## version $VER: Italiano.catalog 1.1 ($TODAY)
+## language italiano
+## codeset 0
+;
+## chunk AUTH Italian catalog translation by Steven Cantini
+;**
+;** XModule.cd 3.9
+;**
+;** Copyright (C) 1995,96 Bernardo Innocenti
+;**
+;
+; **********************************
+; * Strings for all source modules *
+; **********************************
+;
+;
+MSG_NULL
+
+;
+; This string should remain blank.
+;
+MSG_OK
+Ok
+;Ok
+;
+MSG_UNDERSCORE_USE_GAD
+_Usa
+;_Use
+;
+MSG_UNDERSCORE_OK_GAD
+
+;_Ok
+;
+MSG_UNDERSCORE_CANCEL_GAD
+_Annulla
+;_Cancel
+;
+MSG_YES_OR_NO
+Sì|No
+;Yes|No
+;
+MSG_RETRY_OR_CANCEL
+Riprova|Annulla
+;Retry|Cancel
+;
+MSG_PROCEED_OR_CANCEL
+
+;Proceed|Cancel
+;
+MSG_CONTINUE
+Continua
+;Continue
+;
+MSG_NO_FREE_STORE
+Memoria insufficiente.
+;Insufficient memory.
+;
+MSG_BREAK
+Annullato.
+;Aborted.
+;
+MSG_ERR_LOAD
+Non posso caricare \"%s\": %s.
+;Unable to load \"%s\"
+; %s is the filename. A colon ':' and the explanation of failure will be postpended.
+;
+MSG_CANT_OPEN
+Non posso aprire il file \"%s\": %s.
+;Cannot open file \"%s\"
+; %s is the filename. A colon ':' and the explanation of failure will be postpended.
+;
+MSG_ERROR_READING
+Errore di lettura nel file \"%s\": %s.
+;Error reading \"%s\"
+; %s is the filename. A colon ':' and the explanation of failure will be postpended.
+;
+MSG_ERROR_WRITING
+Errore scrivendo \"%s\": %s.
+;Error writing \"%s\"
+; %s is the filename. A colon ':' and the explanation of failure will be postpended.
+;
+;
+; *****************************
+; * Strings for Compression.c *
+; *****************************
+;
+MSG_DECRUNCHING
+Decompressione...
+;Decrunching...
+;
+MSG_NOTHING_IN_ARC
+L'archivio \"%s\" è vuoto.
+;Nothing found in archive \"%s\".
+;
+MSG_CANT_LOAD_COMPRESSED
+Non posso caricare il file compresso.
+;Unable to load compressed file.
+;
+MSG_ERROR_DECOMPRESSING
+Errore di decompressione sul file \"%s\": %s.
+;Error decompressing file \"%s\": %s.
+;
+;
+; ********************
+; * Strings for Cx.c *
+; ********************
+;
+MSG_BAD_HOTKEY
+Descrizione della Commodity HotKey errata.
+;Bad Commodity HotKey description.
+;
+;
+; ***************************
+; * Strings for all loaders *
+; ***************************
+;
+MSG_READING_PATTS
+Lettura Patterns...
+;Reading Patterns...
+;
+MSG_READING_INSTS_INFO
+Lettura Info degli Strumenti...
+;Reading Instruments Info...
+;
+MSG_READING_INSTS
+Lettura Strumenti...
+;Reading Instruments...
+;
+MSG_ERR_CANT_LOAD_PATT
+ERRORE: Non ho potuto caricare il pattern %ld.
+;ERROR: Couldn't load pattern %ld.
+;
+MSG_ERR_CANT_LOAD_INST
+ERRORE: Non ho potuto caricare lo strumento %lx.
+;ERROR: Couldn't load instrument %lx.
+;
+MSG_ERR_NO_MEM_FOR_INST
+ERRORE: Memoria insufficiente per lo strumento %lx.
+;ERROR: Not enough memory for instrument %lx.
+;
+MSG_ERR_NOT_A_SAMPLE
+ERRORE: Lo strumento %lx non è un sample.
+;ERROR: Instrument %lx is not a sample.
+;
+MSG_SONG_TOO_LONG
+ATTENZIONE: La song è troppo grande. Verra' troncata.
+;WARNING: Song length exceeds maximum. Will be truncated.
+;
+MSG_SONG_HAS_TOO_MANY_PATT
+ATTENZIONE: La song ha troppi pattern.
+;WARNING: Song exceeds maximum number of patterns.
+;
+MSG_PATT_TOO_MANY_TRACKS
+ATTENZIONE: Il pattern %ld ha troppe tracce. Lo riduco a %ld tracce.
+;WARNING: Pattern %ld has too many tracks. Cropping to %ld tracks.
+;
+MSG_PATT_TOO_MANY_LINES
+ATTENZIONE: Il pattern %ld ha troppe linee. Lo riduco a %ld linee.
+;WARNING: Pattern %ld has too many lines. Cropping to %ld lines.
+;
+MSG_INVALID_NOTE
+ATTENZIONE: Nota %ld non valida (Patt %ld Traccia %ld Linea %ld).
+;WARNING: Invalid note %ld (Patt %ld Track %ld Line %ld).
+;
+MSG_UNKNOWN_EFF
+Effetto sconosciuto: $%lx (Patt %ld Traccia %ld Linea %ld).
+;Unknown effect: $%lx (Patt %ld Track %ld Line %ld).
+;
+MSG_EXTRA_DATA_AFTER_MOD
+ATTENZIONE: Ulteriori dati trovati dopo un modulo valido: li ignoro.
+;WARNING: Extra data found after valid module: Will be ignored.
+;
+MSG_WRITING_HEADER
+Scrittura dell'Header...
+;Writing Header...
+;
+MSG_WRITING_PATTS
+Scrittura dei Pattern...
+;Writing Patterns...
+;
+MSG_WRITING_INSTS
+Scrittura degli Strumenti...
+;Writing Instruments...
+;
+MSG_WRITING_INSTINFO
+Scrittura Info degli Strumenti...
+;Writing Instruments Info...
+;
+MSG_WRITING_INSTDATA
+Scrittura dei Dati degli Strumenti...
+;Writing Instruments Data...
+;
+MSG_NOTE_TOO_LOW
+ATTENZIONE: La nota al Patt %ld Traccia %ld Linea %ld è troppo bassa.
+;WARNING: Note at Patt %ld Track %ld Line %ld is too low.
+;
+MSG_NOTE_TOO_HIGH
+ATTENZIONE: La nota al Patt %ld Traccia %ld Linea %ld è troppo alta.
+;WARNING: Note at Patt %ld Track %ld Line %ld is too high.
+;
+MSG_NO_MEM_TO_HALVE
+ATTENZIONE: Memoria insuff. per dimezzare il volume dello strumento %lx.
+;WARNING: Not enough memory to halve volume of instrument %lx.
+;
+;
+; *****************************
+; * Strings for Get/SaveMED.c *
+; *****************************
+;
+MSG_READING_MMD
+Lettura modulo MMD%lc...
+;Loading MMD%lc module...
+; The %lc is the MED format (0, 1, 2, ...)
+;
+MSG_UNSUPPORTED_MMD_FORMAT
+ERRORE: Formato OctaMED non supportato.
+;ERROR: Unsupported OctaMED format.
+;
+MSG_WRONG_EFFECT_IN_MMD0
+ATTENZIONE: L'effetto %lx non è supportato nell'MMD0. Usa almeno l'MMD1.
+;WARNING: Effect %lx is not supported in MMD0 format. Use MMD1 or better.
+;
+;
+; ***********************************
+; * Strings for ScreamTrackerHook.c *
+; ***********************************
+;
+MSG_ADLIB_INSTR
+ERRORE: Lo strumento %lx è un %s ADLib.
+;ERROR: Instrument %lx is an ADLib %s.
+; %s is the name of the ADLib instrument (eg: Snare).
+;
+MSG_TRACK_OUT_OF_RANGE
+ATTENZIONE: La traccia %lx è fuori dal limite.
+;WARNING: Track %lx is out of range.
+;
+MSG_UNKNOWN_SAMPLE_COMPRESSION
+ATTENZIONE: Compressione del sample sconosciuta per lo strumento %lx.
+;WARNING: Unknown sample compression for instrument %lx.
+;
+MSG_INST_IS_STEREO
+ATTENZIONE: Lo strumento %lx e' stereo.
+;WARNING: Instrument %lx is a stereo sample.
+;
+MSG_INST_IS_16BIT
+ATTENZIONE: Lo strumento %lx e' a 16bit: non puo' essere caricato.
+;WARNING: Instrument %lx is 16bit: unable to load it.
+;
+;
+; *****************************
+; * Strings for TrackerHook.c *
+; *****************************
+;
+MSG_READING_TYPE_MODULE
+Lettura modulo %s...
+;Reading %s module...
+; (%s is the module format)
+;
+MSG_EXCEEDS_64_PATTS
+ATTENZIONE: Il modulo ha più di 64 pattern. Ti serve il ProTracker 2.3 per sentirlo.
+;NOTE: Module exceeds 64 patterns. You need ProTracker 2.3 to play it.
+;
+MSG_MODULE_ID
+
+;Tracker ID: \"%s\"
+;
+MSG_MODULE_HAS_N_CHN
+
+;Module has %lu tracks...
+;
+MSG_SONG_HAS_NO_INSTS
+Questo file è una song e non contiene strumenti.
+;This file is a song and doesn't contain instruments.
+;
+MSG_EXCEEDS_MAXPAATTS
+ATTENZIONE: Il modulo supera %ld pattern.
+;WARNING: Module execeeds %ld patterns.
+;
+MSG_PATT_WILL_GROW
+Il pattern %ld sarà portato a 64 linee (era lungo %ld).
+;Pattern %ld will grow to 64 lines (was %ld lines long).
+;
+MSG_SPLITTING_PATT
+Il pattern %ld verrà spezzato (era lungo %ld linee).
+;Splitting pattern %ld (was %ld lines long).
+;
+; **************************
+; * Strings for SaveMIDI.c *
+; **************************
+;
+MSG_CHOOSING_CHANNELS
+Scelta dei Canali...
+;Choosing Channels...
+;
+MSG_WRITING_MIDI_TRACKS
+Scrittura tracce MIDI...
+;Writing MIDI Tracks...
+;
+MSG_TOO_MANY_CHANNELS
+ERRORE: La song richiede troppi canali MIDI.
+;ERROR: Song requires too many MIDI channels.
+;
+;
+; *********************
+; * Strings for Gui.c *
+; *********************
+;
+MSG_REALLY_QUIT_XMODULE
+Si vuole veramente uscire da XModule?
+;Really Quit XModule?
+;
+MSG_CLOSE_ALL_WINDOWS
+Chiudi tutte le finestre in questo schermo\ne poi seleziona `Continua'.
+;Please close all visitor windows\n\
+;and then select `Continue'.
+;
+;
+; ***********************
+; * Strings for Instr.c *
+; ***********************
+;
+MSG_UNKNOWN_IFF
+Formato IFF %s sconosciuto.
+;Unknown IFF format %s.
+;
+MSG_ILLEGAL_IFF_STRUCTURE
+Struttura IFF illegale.
+;Illegal IFF structure.
+;
+MSG_SELECT_RAW_MODE
+Formato dello strumento sconosciuto.\nPer favore scegli il modo RAW.
+;Unrecognized instrument format.\n\
+;Please select RAW mode.
+;
+MSG_RAW_MODES
+8bit con segno|8bit senza segno|Annulla
+;Signed 8bit|Unsigned 8bit|Cancel
+;
+MSG_DATATYPES_ERROR
+Errore DataTypes: %s.
+;DataTypes error: %s.
+; %s is a detailed description of the problem.
+;
+MSG_UNKNOWN_COMPRESSION
+Tipo di compressione sconosciuta.
+;Unknown compression type.
+;
+MSG_SAMPLE_WRONG_SIZE
+I campioni a %lu bit non sono supportati.
+;%lu bit samples are not supported.
+; %lu is the number of bits per sample.
+;
+MSG_SAMPLE_NOT_MONO
+I campioni non MONO non sono supportati.
+;Samples other than MONO are not supported.
+;
+MSG_SAMPLE_WRONG_NUMBER_OF_CHANNELS
+I campioni con %ld canali non sono supportati.
+;Samples with %ld channels are not supported.
+;
+MSG_NO_MEMORY_TO_OPTIMIZE_INSTR
+ATTENZIONE: Memoria insufficiente per ottimizzare lo strumento %lx.
+;WARNING: insufficient memory to optimize instrument %lx.
+;
+MSG_INSTR_WILL_SHRINK
+Accorcio lo strumento %lx da %ld a %ld bytes.
+;Instrument %lx will shrink from %ld to %ld.
+;
+MSG_INSTR_DUPES_REMOVED
+Ho trovato e rimosso due strumenti uguali: %lx == %lx.
+;Duplicate instruments found and removed: %lx == %lx.
+;
+MSG_INSTR_UNUSED
+Lo strumento %lx non è mai usato. Lo rimuovo.
+;Instrument %lx was never used and it's being removed.
+;
+;
+; **********************
+; * Strings for Misc.c *
+; **********************
+;
+MSG_OPENLIB_VER_FAIL
+Non riesco ad aprire \"%s\" versione %ld o superiore.
+;Couldn't open \"%s\" version %ld or greater.
+;
+MSG_OPENLIB_FAIL
+Non riesco ad aprire \"%s\".
+;Couldn't open \"%s\".
+;
+;
+; ***************************
+; * Strings for Operators.c *
+; ***************************
+;
+MSG_CANT_INSERT_PATT
+Non posso inserire il pattern: è stato raggiunto il numero massimo di pattern.
+;Unable to insert pattern: Maximum number of patterns reached.
+;
+MSG_PATT_UNUSED
+Il pattern %ld non è usato e verrà cancellato.
+;Pattern %ld is not used and is beeing deleted.
+;
+MSG_PATT_CUT
+Il pattern %ld sarà tagliato alla linea %ld.
+;Pattern %ld will be cut at line %ld.
+;
+MSG_PATT_DUPE
+Ho trovato e rimosso due pattern uguali: %ld == %ld.
+;Duplicate patterns found and removed: %ld == %ld.
+; The two %ld are the pattern numbers.
+;
+MSG_SONG_LEN_DIFFERENT
+ATTENZIONE: Le song hanno lunghezza diversa. Uso quella piu piccola.
+;WARNING: Song lengths are different. Using shorter one.
+;
+MSG_PATT_LEN_DIFFERENT
+ATTENZIONE: Lunghezze di pattern diverse alla posizione %ld. Uso la più piccola.
+;WARNING: Different pattern lengths at position %ld. Using shorter one.
+;
+MSG_ERR_INSTR_OVERFLOW
+
+;ERROR: Instruments overflow. Try remapping the instruments.
+;
+;
+; ***********************
+; * Strings for Prefs.c *
+; ***********************
+;
+MSG_BAD_PREFS_VERSION
+Versione errata del file di preferenze
+;Incorrect version of preferences file
+;
+;
+; ****************************
+; * Strings for Requesters.c *
+; ****************************
+;
+MSG_XMODULE_REQUEST
+Richiesta di XModule
+;XModule Request
+; This is the title of requesters put out by XModule.
+;
+MSG_CLONE_WB
+Clona lo schermo Workbench
+;Clone Workbench Screen
+;
+MSG_CLOSE_FILEREQUESTER
+Per favore chiudi il FileRequester\ne poi seleziona `Continua'.
+;Please close FileRequester\n and then select `Continue'.
+;
+MSG_SELECT_MODULES
+Seleziona uno o più moduli...
+;Select Module(s)...
+;
+MSG_SELECT_INSTRUMENTS
+Seleziona uno o più strumenti...
+;Select Instrument(s)...
+;
+MSG_SELECT_PATTERN
+Seleziona un pattern...
+;Select Pattern...
+;
+MSG_SAVE_MODULE
+Salva il modulo...
+;Save Module...
+;
+MSG_SAVE_INSTRUMENT
+Salva lo strumento...
+;Save Instrument...
+;
+MSG_SAVE_PATTERN
+Salva il pattern...
+;Save Pattern...
+;
+MSG_FILE_EXISTS
+Il file \"%s\"\nesiste già.
+;File \"%s\"\nalready exists.
+;
+MSG_OVERWRITE
+Sovrascrivi|Cambia Nome|Annulla
+;Overwrite|Choose Another|Abort
+;
+;
+; **********************
+; * Strings for Song.c *
+; **********************
+;
+MSG_CLOSE_ALL_SONGS
+
+;Please close all open songs\n\
+;and then select `Continue'.
+;
+MSG_UNESPECTED_EOF
+Fine prematura del file.
+;Unespected end of file.
+;
+MSG_MODULE_LOADED_OK
+Modulo caricato correttamente.
+;Module loaded OK.
+;
+MSG_MODULE_SAVED_OK
+Modulo salvato correttamente.
+;Module saved OK.
+;
+MSG_UNKNOWN_SAVE_FORMAT
+ERRORE: Formato di save sconosciuto.
+;ERROR: Unrecognized save format.
+;
+MSG_INVALID_LOOP_REMOVED
+Ho rimosso un loop non valido per lo strumento %lx.
+;Removed invalid loop for instrument %lx.
+;
+MSG_INVALID_LOOP_FIXED
+Ho riparato un loop non valido per lo strumento %lx.
+;Fixed invalid loop for instrument %lx.
+;
+MSG_SONG_HAS_NO_PATTS
+ATTENZIONE: La song non ha pattern.
+;WARNING: Song has no patterns.
+;
+MSG_SONG_HAS_NO_SEQ
+ATTENZIONE: La song non ha una sequenza.
+;WARNING: Song has no sequence.
+;
+MSG_INVALID_SONG_POS
+ATTENZIONE: La posizione %ld rimanda al pattern %ld, che non esiste.
+;WARNING: Song position %ld references pattern %ld, which doesn't exist.
+;
+MSG_UNKNOWN_MOD_FORMAT
+Non riesco ad identificare il formato.\n(Caricare un file di dati come modulo è pericoloso)
+;Unable to identify module format.\n\
+;(Loading a data file as a module is unwise)
+;
+MSG_SOUND_PRO_CANCEL
+SoundTracker 15|ProTracker|Annulla
+;SoundTracker 15|ProTracker|Cancel
+;
+MSG_AUTHOR_UNKNOWN
+Sconosciuto
+;Unknown
+;
+MSG_SONG_UNTITLED
+Senza titolo
+;Untitled
+;
+;
+; **********************
+; * Strings for Help.c *
+; **********************
+;
+MSG_AMIGAGUIDE_ERROR
+Errore AmigaGuide:
+;AmigaGuide error:
+; Note one blank space at the end of this line!
+;
+;
+; ***************************
+; * Strings for PattPrefs.c *
+; ***************************
+;
+MSG_PATTPREFS_TITLE
+Parametri Editor Pattern
+;Pattern Editor Settings
+;
+;
+MSG_ADVANCE_TRACKS_GAD
+
+;Advance _Tracks
+;
+MSG_ADVANCE_LINES_GAD
+
+;Advance _Lines
+;
+MSG_MAX_UNDO_LEVELS_GAD
+
+;Max _Undo Levels
+;
+MSG_MAX_UNDO_MEM_GAD
+
+;Max Undo _Memory
+;
+MSG_CLIPBOARD_UNIT_GAD
+
+;Cli_pboard Unit
+;
+MSG_SCROLLER_POS_GAD
+
+;_Scroller Position
+;
+MSG_VERT_WRAP_GAD
+
+;_Vertical Wrap
+;
+MSG_HORIZ_WRAP_GAD
+
+;_Horizontal Wrap
+;
+MSG_HEX_LINE_NUMBERS_GAD
+
+;He_x Line Numbers
+;
+MSG_BLANK_ZERO_GAD
+
+;Blank _Zero Digits
+;
+MSG_BACKDROP_GAD
+
+;Backdrop _Window
+;
+MSG_HORIZ_SCROLLER_GAD
+
+;Ho_rizontal Scroller
+;
+MSG_DO_RULER_GAD
+
+;Display Cursor Ruler
+;
+MSG_DO_TINY_LINES_GAD
+
+;Display Tiny Lines
+;
+MSG_EDITOR_FONT_GAD
+
+;_Editor Font
+;
+MSG_BACKGROUND_PEN_GAD
+
+;Background
+;
+MSG_TEXT_PEN_GAD
+
+;T_ext
+;
+MSG_LINES_PEN_GAD
+
+;Li_nes
+;
+MSG_TINY_LINES_PEN_GAD
+
+;Tin_y Lines
+;
+MSG_RIGHT_GAD
+
+;Right
+;
+MSG_LEFT_GAD
+
+;Left
+;
+MSG_OFF_GAD
+
+;Off
+;
+MSG_PATT_TOO_LONG
+ERRORE: Il pattern crescerebbe oltre il massimo numero di linee.
+;ERROR: Pattern would exceed the maximum number of lines.
+;
+;
+; *****************************
+; * Strings for SequenceWin.c *
+; *****************************
+;
+;
+MSG_SEQUENCE_TITLE
+Editor Sequenza
+;Sequence Editor
+;
+;
+MSG_SEQUENCE_GAD
+Sequenza
+;Sequence
+;
+MSG_UNDERSCORE_ADD_GAD
+_Aggiungi
+;_Add
+;
+MSG_UP_GAD
+Su
+;Up
+;
+MSG_DOWN_GAD
+Giu`
+;Down
+;
+MSG_UNDERSCORE_NAME_GAD
+_Nome
+;_Name
+;
+MSG_PATTERNS_GAD
+Patterns
+;Patterns
+;
+MSG_UNDERSCORE_UP_GAD
+_Su
+;_Up
+;
+MSG_UNDERSCORE_DOWN_GAD
+_Giu`
+;_Down
+;
+MSG_UNDERSCORE_INS_GAD
+_Ins
+;_Ins
+;
+;
+MSG_UNNAMED
+--senza nome--
+;-- unnamed --
+;
+;
+; ********************************
+; * Strings for InstrumentsWin.c *
+; ********************************
+;
+MSG_INSTRUMENTS_TITLE
+Strumenti
+;Instruments
+;
+;
+MSG_VOLUME_GAD
+_Volume
+;_Volume
+;
+MSG_FINETUNE_GAD
+_FineTune
+;_FineTune
+;
+MSG_LENGTH_GAD
+Lunghezza
+;Length
+;
+MSG_KIND_GAD
+_Tipo
+;_Kind
+;
+MSG_EDIT_DOTS_GAD
+_Edita...
+;_Edit...
+;
+MSG_SAMPLE_GAD
+Campione
+;Sample
+;
+MSG_SYNTH_GAD
+Synth
+;Synth
+;
+MSG_HYBRID_GAD
+Ibrido
+;Hybrid
+;
+;
+MSG_INSTRUMENTS_MEN
+Strumenti
+;Instruments
+;
+MSG_LOAD_MEN
+Carica...
+;Load...
+;
+MSG_REMAP_MEN
+Rimappa
+;Remap
+;
+MSG_SAVE_COMPRESSED_MEN
+Salva Compresso
+;Save Compressed
+;
+MSG_SAVE_RAW_MEN
+Salva Grezzo
+;Save Raw
+;
+;
+MSG_EMPTY
+--vuoto--
+;-- empty --
+;
+;
+; *************************
+; * Strings for PlayWin.c *
+; *************************
+;
+MSG_PLAY_TITLE
+Riproduzione
+;Play
+;
+;
+MSG_VOL_GAD
+
+;_Vol
+;
+MSG_POS_GAD
+Pos
+;Pos
+;
+MSG_TIME_GAD
+Tempo
+;Time
+;
+MSG_RST_GAD
+Rst
+;_Rst
+; Stands for Reset/Restart
+;
+MSG_PLAYER_INIT_ERR
+Errore di inizializzazione del player: %ld.
+;Player initialization error: %ld.
+;
+;
+; *****************************
+; * Strings for ProgressWin.c *
+; *****************************
+;
+MSG_PROGRESS_TITLE
+
+;XModule is working...
+;
+MSG_LOG_TITLE
+
+;XModule Log
+;
+;
+MSG_UNDERSCORE_ABORT_GAD
+
+;_Abort
+;
+;
+MSG_PERCENT_DONE
+%ld di %ld (%ld%% fatto)
+;%ld of %ld (%ld%% done)
+; This string appears inside the progress window gauge.
+; eg: "5 of 20 (25% done)".
+; Leave that double percent (%%) alone! :-)
+;
+;
+; *****************************
+; * Strings for SongInfoWin.c *
+; *****************************
+;
+MSG_SONGINFO_TITLE
+Informazioni Song
+;Song Information
+;
+;
+MSG_UNDERSCORE_NEW_GAD
+
+;Ne_w
+;
+MSG_OPEN_GAD
+_Carica...
+;_Open...
+;
+MSG_SAVE_GAD
+_Salva
+;_Save
+;
+MSG_DEL_GAD
+Del
+;Del
+;
+MSG_SONG_NAME_GAD
+_Nome Song
+;Song _Name
+;
+MSG_AUTHOR_NAME_GAD
+_Autore
+;_Author
+;
+MSG_DEF_TEMPO_GAD
+_Tempo
+;_Tempo
+;
+MSG_DEF_SPEED_GAD
+_Velocita`
+;S_peed
+;
+MSG_RESTART_GAD
+_Riparti
+;_Restart
+;
+MSG_LENGHT_GAD
+Lunghezza
+;Length
+;
+MSG_NUM_PATTS_GAD
+Num Patterns
+;Num Patterns
+;
+MSG_NUM_TRACKS_GAD
+Tracce
+;Tracks
+;
+MSG_TOT_MOD_SIZE_GAD
+Lunghezza Totale Modulo
+;Total Module Size
+;
+MSG_TOT_INST_SIZE_GAD
+Lunghezza Totale Strumenti
+;Total Instruments Size
+;
+;
+MSG_SONG_MEN
+Song
+;Song
+;
+MSG_MERGE_SONGS_MEN
+Fusione Song
+;Merge Songs
+;
+MSG_JOIN_SONGS_MEN
+Unione Song
+;Join Songs
+;
+;
+MSG_JOIN_REQUIRES_TWO_SONGS
+ERRORE: L'unione richiede due song.
+;ERROR: Join requires two songs.
+;
+MSG_MERGE_REQUIRES_TWO_SONGS
+ERRORE: La fusione richiede due song.
+;ERROR: Merge requires two songs.
+;
+MSG_DISCARD_CURRENT_SONG
+Scarto la song corrente?
+;Discard current song?
+;
+;
+; ****************************
+; * Strings for ToolBoxWin.c *
+; ****************************
+;
+MSG_TOOLBOX_TITLE
+Barra Strumenti
+;ToolBox
+;
+;
+MSG_PLAY_GAD
+Play...
+;Play...
+;
+MSG_SONGS_GAD
+_Songs...
+;_Songs...
+;
+MSG_PATTERNS_DOTS_GAD
+_Patterns...
+;_Patterns...
+;
+MSG_INSTRUMENTS_GAD
+S_trumenti...
+;_Instruments...
+;
+MSG_SEQUENCE_DOTS_GAD
+Se_quenza...
+;Se_quence...
+;
+MSG_OPTIMIZATION_GAD
+_Ottimizzazione...
+;_Optimization...
+;
+MSG_PROJECT_MEN
+Progetto
+;Project
+;
+MSG_NEW_MEN
+Nuovo
+;New
+;
+MSG_OPEN_MEN
+Carica...
+;Open...
+;
+MSG_OPEN_NEW_MEN
+Carica Un Altro...
+;Open New...
+;
+MSG_SAVE_MEN
+Salva
+;Save
+;
+MSG_SAVE_AS_MEN
+Salva Con Nome...
+;Save As...
+;
+MSG_CLEAR_MEN
+Cancella...
+;Clear...
+;
+MSG_ABOUT_MEN
+Informazioni...
+;About...
+;
+MSG_HELP_MEN
+Aiuto...
+;Help...
+;
+MSG_ICONIFY_MEN
+Iconifica...
+;Iconify...
+;
+MSG_QUIT_MEN
+Fine
+;Quit
+;
+MSG_SETTINGS_MEN
+Opzioni
+;Settings
+;
+MSG_SAVE_FORMAT_MEN
+Formato Di Uscita...
+;Save Format...
+;
+MSG_USER_INTERFACE_MEN
+Interfaccia Utente...
+;User Interface...
+;
+MSG_SAVE_ICONS_MEN
+Genera Icone
+;Save Icons
+;
+MSG_CONFIRM_OVERWRITE_MEN
+Conferma Sovrascrittura
+;Confirm Overwrite
+;
+MSG_CONFIRM_EXIT_MEN
+Conferma Uscita
+;Confirm Exit
+;
+MSG_VERBOSE_MEN
+Rapporto Dettagliato
+;Verbose Log
+;
+MSG_OPEN_SETTINGS_MEN
+Carica Configurazione...
+;Open Settings...
+;
+MSG_SAVE_SETTINGS_MEN
+Salva Configurazione...
+;Save Settings
+;
+MSG_SAVE_SETTINGS_AS_MEN
+Salva Configurazione Con Nome...
+;Save Settings As...
+;
+;
+MSG_ABOUT_TEXT
+%s %s\n\
+Programma Di Elaborarazione Moduli Musicali\n\n\
+\
+%s\n\
+Tutti i diritti riservati.\n\n\
+\
+Internet: bernie@shock.cosmos.it\n\n\
+FidoNet:  2:332/125.1\n\
+\
+Memoria CHIP Libera: %ldKB\n\
+Memoria FAST Libera: %ldKB\n\n\
+Schermo Pubblico: %s\n\
+Porta ARexx: %s\n\
+Cx HotKey: %s\n\
+Lingua: %s
+;%s\n\
+;A Music Module Processing Utility\n\n\
+;\
+;%s\n\
+;All rights reserved.\n\n\
+;\
+;Internet: bernie@shock.cosmos.it\n\n\
+;FidoNet:  2:332/125.1\n\
+;\
+;Free CHIP Memory: %ldKB\n\
+;Free FAST Memory: %ldKB\n\n\
+;Public Screen: %s\n\
+;ARexx Port: %s\n\
+;Cx HotKey: %s\n\
+;Language: %s
+;
+MSG_DEFAULT
+--Default--
+;-- Default --
+;
+MSG_DISABLED
+--Disabilitato--
+;-- Disabled --
+;
+;
+; *********************************
+; * Strings for OptimizationWin.c *
+; *********************************
+;
+MSG_OPTIMIZATION_TITLE
+Ottimizzazione Modulo
+;Module Optimization
+;
+;
+MSG_OPTIMIZE_GAD
+_Ottimizzare
+;_Optimize
+;
+MSG_REM_UNUSED_PATTS_GAD
+Rimuovi _Pattern Non Usati
+;Remove Unused _Patterns
+;
+MSG_REM_DUPLICATE_PATTS_GAD
+Rimuovi Patterns _Doppi
+;Remove _Duplicate Patterns
+;
+MSG_REM_UNUSED_INSTR_GAD
+Rimuovi _Strumenti Non Usati
+;Remove Unused _Instruments
+;
+MSG_REM_DUP_INSTR_GAD
+
+;Remove Duplicate I_nstruments
+;
+MSG_CUT_AFTER_LOOP_GAD
+Taglia Strumenti Dopo Il Loop
+;Cut Instruments After _Loop
+;
+MSG_CUT_ZERO_TAILS_GAD
+Taglia Code di _Zeri Degli Strumenti
+;Cut Instrument _Zero Tails
+;
+MSG_CUT_PATTERNS_GAD
+
+;Cut _Breaked Patterns
+;
+MSG_REMAP_INSTRUMENTS_GAD
+
+;_Remap Instruments
+;
+;
+MSG_SAVED_X_BYTES
+Guadagnati %ld bytes (%ld%%)
+;Saved %ld bytes (%ld%%)
+;
+;
+; **************************
+; * Strings for PrefsWin.c *
+; **************************
+;
+;
+MSG_PREFS_TITLE
+Settaggi dell'interfaccia utente
+;User Interface Settings
+;
+;
+MSG_PUBLIC_SCREEN_GAD
+_Schermo Pubblico
+;_Public Screen
+;
+MSG_DISPLAY_MODE_GAD
+_Modo Video
+;Display _Mode
+;
+MSG_WINDOW_FONT_GAD
+Font della _Finestra
+;_Window Font
+;
+MSG_LISTVIEW_FONT_GAD
+
+;_ListView Font
+;
+MSG_REQUESTERS_GAD
+_Requesters
+;_Requesters
+;
+MSG_USE_DATATYPES_GAD
+
+;Use _DataTypes
+;
+MSG_APPICON_GAD
+Metti l'App_Icon
+;Put App_Icon
+;
+MSG_REFRESH_GAD
+
+;Refres_h
+;
+MSG_LOG_TO_FILE_GAD
+
+;Log To File
+;
+MSG_LOG_LEVEL_GAD
+
+;_Log Level
+;
+MSG_ASK_AUTOSAVE_GAD
+
+;Confirm _Autosave
+;
+MSG_AUTOSAVE_TIME_GAD
+
+;Autosave Mi_nutes
+;
+MSG_DO_BACKUPS_GAD
+
+;Create _Backups
+;
+MSG_BACKUP_TEMPLATE_GAD
+
+;Bac_kup Template
+;
+MSG_BACKUP_VERSIONS_GAD
+
+;Backup _Versions
+;
+MSG_ASL_GAD
+Asl
+;Asl
+;
+MSG_REQTOOLS_GAD
+ReqTools
+;ReqTools
+;
+MSG_SMART_GAD
+Smart
+;Smart
+;
+MSG_SIMPLE_GAD
+Simple
+;Simple
+;
+MSG_CLONE_DEF_SCREEN
+
+;--Clone Default Screen--
+;
+;
+; ****************************
+; * Strings for PatternWin.c *
+; ****************************
+;
+MSG_PATTERN_TITLE
+Editor Pattern
+;Pattern Editor
+;
+;
+MSG_PATTERNS_MEN
+Patterns
+;Patterns
+;
+MSG_SIZE_MEN
+Dimensione...
+;Size...
+;
+MSG_EDIT_MEN
+Editor
+;Edit
+;
+MSG_MARK_MEN
+Marca
+;Mark
+;
+MSG_CUT_MEN
+Taglia
+;Cut
+;
+MSG_COPY_MEN
+Copia
+;Copy
+;
+MSG_PASTE_MEN
+Incolla
+;Paste
+;
+MSG_ERASE_MEN
+Cancella
+;Erase
+;
+MSG_UNDO_MEN
+Undo
+;Undo
+;
+MSG_REDO_MEN
+Redo
+;Redo
+;
+MSG_EDITOR_SETTINGS_MEN
+Opzioni Editor...
+;Editor Settings...
+;
+;
+; ***************************
+; * Strings for SaversWin.c *
+; ***************************
+;
+MSG_SAVERS_TITLE
+
+;Savers
+;
+;
+MSG_SF_SEQUENCE_GAD
+
+;Se_quence
+;
+MSG_SF_INSTRUMENTS_GAD
+
+;_Instruments
+;
+MSG_SF_PATTERNS_GAD
+
+;_Patterns
+;
+MSG_SF_NAMES_GAD
+
+;Names
+;
+MSG_ADD_ICON_GAD
+
+;Add I_con
+;
+MSG_MODE_GAD
+
+;_Mode
+;
+MSG_OPTIONS_DOTS_GAD
+
+;Options...
+;
+MSG_NONE_GAD
+
+;None
+;
+MSG_XPK_GAD
+
+;XPK
+;
+MSG_LHA_GAD
+
+;LhA
+;
+;
+MSG_DESCRIPTION
+
+;Description
+;
+MSG_AUTHOR
+
+;Author
+;
+MSG_MAXLENGTH
+
+;Max Length
+;
+MSG_MAXTRACKS
+
+;Max Tracks
+;
+MSG_MAXINSTRUMENTS
+
+;Max Instruments
+;
+MSG_MAXPATTERNS
+
+;Max Patterns
+;
+MSG_MAXPATTLEN
+
+;Max Pattern Length
+;
+MSG_MAXSAMPLELEN
+
+;Max Sample Length
+;
+;
+; **********************
+; * Strings ClearWin.c *
+; **********************
+;
+MSG_CLEAR_TITLE
+Cancellazione Modulo
+;Clear Module
+;
+;
+MSG_CLR_SEQUENCE_GAD
+
+;_Sequence
+;
+MSG_CLR_INSTRUMENTS_GAD
+
+;_Instruments
+;
+MSG_CLR_PATTERNS_GAD
+
+;_Patterns
+;
+MSG_CLEARMOD_GAD
+
+;_Clear
+;
+;
+; ***************************
+; * Strings for SampleWin.c *
+; ***************************
+;
+MSG_SAMPLE_TITLE
+Editor Campionamenti
+;Sample Editor
+;
+;
+MSG_RENDER_MEN
+Grafico
+;Render
+;
+MSG_POINTS_MEN
+A Punti
+;Points
+;
+MSG_LINES_MEN
+A Linee
+;Lines
+;
+MSG_FILLED_MEN
+Riempito
+;Filled
+;
+;
+; *****************************
+; * Strings for PattSizeWin.c *
+; *****************************
+;
+MSG_PATTSIZE_TITLE
+Attributi Pattern
+;Pattern Attributes
+;
+;
+MSG_LINES_GAD
+
+;_Lines
+;
+MSG_TRACKS_GAD
+
+;_Tracks
+;
+MSG_DOUBLE_GAD
+
+;_Double
+;
+MSG_HALVE_GAD
+
+;_Halve
+;
+;
+; *************************
+; * Strings for Library.c *
+; *************************
+;
+MSG_SONG_TOO_MANY_TRACKS
+
+;WARNING: The selected saver supports max %lu tracks, but the song has %lu tracks.
+;
+MSG_SONG_TOO_MANY_PATTS
+
+;WARNING: The selected saver supports max %lu patterns; the song has %lu patterns.
+;
+MSG_SONG_TOO_MANY_INSTRS
+
+;WARNING: The selected saver supports max %lu instruments, last instrument is %lu.
+;
+MSG_SONG_TOO_MANY_POS
+
+;WARNING: The selected saver supports max %lu positions, but the song has %lu positions.
+;
+MSG_PATT_LENGTH_INVALID
+
+;WARNING: The length of pattern %ld ($%lx lines) isn't allowed with the selected saver.
+;
+MSG_INSTR_TOO_LONG
+ATTENZIONE: Lo strumento %lx è troppo lungo.
+;WARNING: Instrument %lx is too long and will be cropped to %lu bytes.
+;
+MSG_WILL_MODIFY_SONG
+
+;Some modifications need to be performed on this song\n\
+;in order to adapt it to the limitations of the\n\
+;destination format.
+;
+MSG_TRY_REMAPPING_INSTRUMENTS
+
+;Some instruments are placed beyond the limit for\n\
+;the selected format.\n\
+;Remapping the instruments now could help saving\n\
+;all them along with the selected format.
+;
+MSG_SAVING_MODULE
+
+;Saving %s module \"%s\"...
+; the first %s is the format name, the second %s is the song name.
diff --git a/Catalogs/nederlands.ct b/Catalogs/nederlands.ct
new file mode 100644 (file)
index 0000000..08f4be2
--- /dev/null
@@ -0,0 +1,1479 @@
+## version $VER: Nederlands.ct 1.0 (15.12.95)
+## language nederlands
+## codeset 0
+;
+## chunk AUTH Dutch catalog translation by Ji Yong Dijkhuis <0dijkhuis01@lelystad.flnet.nl>
+;**
+;** XModule.cd 3.9
+;**
+;** Copyright (C) 1995,96 Bernardo Innocenti
+;**
+;
+; **********************************
+; * Strings for all source modules *
+; **********************************
+;
+;
+MSG_NULL
+
+;
+; This string should remain blank.
+;
+MSG_OK
+Ok
+;Ok
+;
+MSG_UNDERSCORE_USE_GAD
+
+;_Use
+;
+MSG_UNDERSCORE_OK_GAD
+
+;_Ok
+;
+MSG_UNDERSCORE_CANCEL_GAD
+
+;_Cancel
+;
+MSG_YES_OR_NO
+Ja|Nee
+;Yes|No
+;
+MSG_RETRY_OR_CANCEL
+Nogmaals|Annuleer
+;Retry|Cancel
+;
+MSG_PROCEED_OR_CANCEL
+
+;Proceed|Cancel
+;
+MSG_CONTINUE
+Doorgaan
+;Continue
+;
+MSG_NO_FREE_STORE
+Niet genoeg geheugen
+;Insufficient memory.
+;
+MSG_BREAK
+Afgebroken
+;Aborted.
+;
+MSG_ERR_LOAD
+Kan \"%s\" niet laden: %s.
+;Unable to load \"%s\"
+; %s is the filename. A colon ':' and the explanation of failure will be postpended.
+;
+MSG_CANT_OPEN
+Kan \"%s\" niet openen: %s.
+;Cannot open file \"%s\"
+; %s is the filename. A colon ':' and the explanation of failure will be postpended.
+;
+MSG_ERROR_READING
+Fout bij lezen \"%s\": %s.
+;Error reading \"%s\"
+; %s is the filename. A colon ':' and the explanation of failure will be postpended.
+;
+MSG_ERROR_WRITING
+Fout bij bewaren \"%s\": %s.
+;Error writing \"%s\"
+; %s is the filename. A colon ':' and the explanation of failure will be postpended.
+;
+;
+; *****************************
+; * Strings for Compression.c *
+; *****************************
+;
+MSG_DECRUNCHING
+Uitpakken...
+;Decrunching...
+;
+MSG_NOTHING_IN_ARC
+Niets gevonden in archief \"%s\".
+;Nothing found in archive \"%s\".
+;
+MSG_CANT_LOAD_COMPRESSED
+Niet mogelijk om gecomprimeerd bestand te laden.
+;Unable to load compressed file.
+;
+MSG_ERROR_DECOMPRESSING
+Fout bij uitpakken bestand \"%s\": %s
+;Error decompressing file \"%s\": %s.
+;
+;
+; ********************
+; * Strings for Cx.c *
+; ********************
+;
+MSG_BAD_HOTKEY
+Slechte Commodity Hotkey beschrijving.
+;Bad Commodity HotKey description.
+;
+;
+; ***************************
+; * Strings for all loaders *
+; ***************************
+;
+MSG_READING_PATTS
+Lezen Patronen...
+;Reading Patterns...
+;
+MSG_READING_INSTS_INFO
+Lezen Instrumenten Info...
+;Reading Instruments Info...
+;
+MSG_READING_INSTS
+Lezen Instrumenten...
+;Reading Instruments...
+;
+MSG_ERR_CANT_LOAD_PATT
+FOUT: Kon patroon %ld niet laden.
+;ERROR: Couldn't load pattern %ld.
+;
+MSG_ERR_CANT_LOAD_INST
+FOUT: Kon instrument %lx niet laden.
+;ERROR: Couldn't load instrument %lx.
+;
+MSG_ERR_NO_MEM_FOR_INST
+FOUT: Niet genoeg geheugen voor instrument %lx.
+;ERROR: Not enough memory for instrument %lx.
+;
+MSG_ERR_NOT_A_SAMPLE
+FOUT: Instrument %lx is geen sample.
+;ERROR: Instrument %lx is not a sample.
+;
+MSG_SONG_TOO_LONG
+WAASCHUWING: Song lengte overschrijdt maximum. Zal worden ingekort.
+;WARNING: Song length exceeds maximum. Will be truncated.
+;
+MSG_SONG_HAS_TOO_MANY_PATT
+WAARSCHUWING: Song overschrijdt maximaal aantal patronen.
+;WARNING: Song exceeds maximum number of patterns.
+;
+MSG_PATT_TOO_MANY_TRACKS
+WAARSCHUWING: Patroon %ld heeft te veel sporen. Afkappen naar %ld 
+;WARNING: Pattern %ld has too many tracks. Cropping to %ld tracks.
+;
+MSG_PATT_TOO_MANY_LINES
+Patroon %ld heeft te veel lijnen. Afkappen naar %ld lijnen.
+;WARNING: Pattern %ld has too many lines. Cropping to %ld lines.
+;
+MSG_INVALID_NOTE
+WAARSCHUWING: Ongeldige noot %ld (Pat %ld Spoor %ld Lijn %ld).
+;WARNING: Invalid note %ld (Patt %ld Track %ld Line %ld).
+;
+MSG_UNKNOWN_EFF
+Onbekend effect: $%lx (Pat %ld Spoor %ld Lijn %ld).
+;Unknown effect: $%lx (Patt %ld Track %ld Line %ld).
+;
+MSG_EXTRA_DATA_AFTER_MOD
+WAARSCHUWING: Extra data gevonden achter module: Zal worden 
+;WARNING: Extra data found after valid module: Will be ignored.
+;
+MSG_WRITING_HEADER
+Bewaren Kop...
+;Writing Header...
+;
+MSG_WRITING_PATTS
+Bewaren Patroon...
+;Writing Patterns...
+;
+MSG_WRITING_INSTS
+Bewaren Instrumenten...
+;Writing Instruments...
+;
+MSG_WRITING_INSTINFO
+Bewaren Instrumenten Info...
+;Writing Instruments Info...
+;
+MSG_WRITING_INSTDATA
+Bewaren Instrumenten Data...
+;Writing Instruments Data...
+;
+MSG_NOTE_TOO_LOW
+WAARSCHUWING: Noot op Pat %ld Spoor %ld Lijn %ld is te laag.
+;WARNING: Note at Patt %ld Track %ld Line %ld is too low.
+;
+MSG_NOTE_TOO_HIGH
+WAARSCHUWING: Noot op Pat %ld Spoor %ld Lijn %ld is te hoog.
+;WARNING: Note at Patt %ld Track %ld Line %ld is too high.
+;
+MSG_NO_MEM_TO_HALVE
+WAARSCHUWING: Niet genoeg geheugen om volume van instrument %lx te 
+;WARNING: Not enough memory to halve volume of instrument %lx.
+;
+;
+; *****************************
+; * Strings for Get/SaveMED.c *
+; *****************************
+;
+MSG_READING_MMD
+Laden MMD%lc module...
+;Loading MMD%lc module...
+; The %lc is the MED format (0, 1, 2, ...)
+;
+MSG_UNSUPPORTED_MMD_FORMAT
+FOUT: Geen ondersteund OctaMED formaat.
+;ERROR: Unsupported OctaMED format.
+;
+MSG_WRONG_EFFECT_IN_MMD0
+WAARSCHUWING: Effect %lx wordt niet ondersteund in MMD0 formaat. 
+;WARNING: Effect %lx is not supported in MMD0 format. Use MMD1 or better.
+;
+;
+; ***********************************
+; * Strings for ScreamTrackerHook.c *
+; ***********************************
+;
+MSG_ADLIB_INSTR
+FOUT: Instrument %lx is een ADLib %s.
+;ERROR: Instrument %lx is an ADLib %s.
+; %s is the name of the ADLib instrument (eg: Snare).
+;
+MSG_TRACK_OUT_OF_RANGE
+WAARSCHUWING: Spoor %lx is buiten bereik.
+;WARNING: Track %lx is out of range.
+;
+MSG_UNKNOWN_SAMPLE_COMPRESSION
+WAARSCHUWING: Onbekende sample compressie voor instrument %lx.
+;WARNING: Unknown sample compression for instrument %lx.
+;
+MSG_INST_IS_STEREO
+WAARSCHUWING: Instrument %lx is een stereo sample.
+;WARNING: Instrument %lx is a stereo sample.
+;
+MSG_INST_IS_16BIT
+WAARSCHUWING: Instrument %lx is 16bit: onmogelijk om te laden.
+;WARNING: Instrument %lx is 16bit: unable to load it.
+;
+;
+; *****************************
+; * Strings for TrackerHook.c *
+; *****************************
+;
+MSG_READING_TYPE_MODULE
+Lezen %s module
+;Reading %s module...
+; (%s is the module format)
+;
+MSG_EXCEEDS_64_PATTS
+WAARSCHUWING: Module overschrijdt 64 patronen. ProTracker 2.3 benodigd om module te spelen.
+;NOTE: Module exceeds 64 patterns. You need ProTracker 2.3 to play it.
+;
+MSG_MODULE_ID
+
+;Tracker ID: \"%s\"
+;
+MSG_MODULE_HAS_N_CHN
+
+;Module has %lu tracks...
+;
+MSG_SONG_HAS_NO_INSTS
+Dit bestand is een song en heeft geen instrumenten.
+;This file is a song and doesn't contain instruments.
+;
+MSG_EXCEEDS_MAXPAATTS
+WAARSCHUWING: Module overschreidt %ld patronen.
+;WARNING: Module execeeds %ld patterns.
+;
+MSG_PATT_WILL_GROW
+Patroon %ld wordt verlengd naar 64 lijnen (was %ld lijnen lang).
+;Pattern %ld will grow to 64 lines (was %ld lines long).
+;
+MSG_SPLITTING_PATT
+Splitsen patroon %ld (was %ld lijnen lang).
+;Splitting pattern %ld (was %ld lines long).
+;
+; **************************
+; * Strings for SaveMIDI.c *
+; **************************
+;
+MSG_CHOOSING_CHANNELS
+Kiezen Kanalen...
+;Choosing Channels...
+;
+MSG_WRITING_MIDI_TRACKS
+Bewaren MIDI Sporen...
+;Writing MIDI Tracks...
+;
+MSG_TOO_MANY_CHANNELS
+FOUT: Song heeft te veel MIDI kanalen nodig.
+;ERROR: Song requires too many MIDI channels.
+;
+;
+; *********************
+; * Strings for Gui.c *
+; *********************
+;
+MSG_REALLY_QUIT_XMODULE
+Wekelijke beeindigen XModule?
+;Really Quit XModule?
+;
+MSG_CLOSE_ALL_WINDOWS
+Sluit alle vreemde vensters\n\
+a.u.b en selecteer dan `Doorgaan'.
+;Please close all visitor windows\n\
+;and then select `Continue'.
+;
+;
+; ***********************
+; * Strings for Instr.c *
+; ***********************
+;
+MSG_UNKNOWN_IFF
+Onbekend IFF formaat %s.
+;Unknown IFF format %s.
+;
+MSG_ILLEGAL_IFF_STRUCTURE
+Foutieve IFF structuur.
+;Illegal IFF structure.
+;
+MSG_SELECT_RAW_MODE
+Onbekend instrument formaat.\n\
+;Unrecognized instrument format.\n\
+;Please select RAW mode.
+;Unrecognized instrument format.\n\
+;Please select RAW mode.
+;
+MSG_RAW_MODES
+Signed 8bit|Unsigned 8bit|Annuleer
+;Signed 8bit|Unsigned 8bit|Cancel
+;
+MSG_DATATYPES_ERROR
+DataTypes fout: %s.
+;DataTypes error: %s.
+; %s is a detailed description of the problem.
+;
+MSG_UNKNOWN_COMPRESSION
+Onbekend compressie type.
+;Unknown compression type.
+;
+MSG_SAMPLE_WRONG_SIZE
+%lu bit samples worden niet ondersteund.
+;%lu bit samples are not supported.
+; %lu is the number of bits per sample.
+;
+MSG_SAMPLE_NOT_MONO
+Samples anders dan MONO worden niet ondersteund.
+;Samples other than MONO are not supported.
+;
+MSG_SAMPLE_WRONG_NUMBER_OF_CHANNELS
+Samples met %ld kanalen worden niet ondersteund.
+;Samples with %ld channels are not supported.
+;
+MSG_NO_MEMORY_TO_OPTIMIZE_INSTR
+WAARSCHUWING: onvoldoende geheugen om instrument %lx te optimalizeren.
+;WARNING: insufficient memory to optimize instrument %lx.
+;
+MSG_INSTR_WILL_SHRINK
+Instrument %lx zal krimpen van %ld naar %ld.
+;Instrument %lx will shrink from %ld to %ld.
+;
+MSG_INSTR_DUPES_REMOVED
+Dubbele instrumenten gevonden en verwijderd: %lx == %lx.
+;Duplicate instruments found and removed: %lx == %lx.
+;
+MSG_INSTR_UNUSED
+Instrument %lx is niet gebruikt en wordt verwijderd.
+;Instrument %lx was never used and it's being removed.
+;
+;
+; **********************
+; * Strings for Misc.c *
+; **********************
+;
+MSG_OPENLIB_VER_FAIL
+
+;Couldn't open \"%s\" version %ld or greater.
+;
+MSG_OPENLIB_FAIL
+Kon %s versie %ld of hoger niet openen.
+;Couldn't open \"%s\".
+;
+;
+; ***************************
+; * Strings for Operators.c *
+; ***************************
+;
+MSG_CANT_INSERT_PATT
+Invoegen patroon niet mogelijk: Maximaal aantal patronen bereikt.
+;Unable to insert pattern: Maximum number of patterns reached.
+;
+MSG_PATT_UNUSED
+Patroon %ld is niet gebruikt en wordt verwijdert.
+;Pattern %ld is not used and is beeing deleted.
+;
+MSG_PATT_CUT
+Patroon %ld wordt afgekapt op lijn %ld.
+;Pattern %ld will be cut at line %ld.
+;
+MSG_PATT_DUPE
+Dubbele patronen gevonden en verwijderd: %ld == %ld.
+;Duplicate patterns found and removed: %ld == %ld.
+; The two %ld are the pattern numbers.
+;
+MSG_SONG_LEN_DIFFERENT
+WAARSCHUWING: Song lengtes zijn verschillend. De kortere wordt gebruikt.
+;WARNING: Song lengths are different. Using shorter one.
+;
+MSG_PATT_LEN_DIFFERENT
+WAARSCHUWING: Verschillende patroon lengtes op positie %ld. De kortere wordt gebruikt.
+;WARNING: Different pattern lengths at position %ld. Using shorter one.
+;
+MSG_ERR_INSTR_OVERFLOW
+
+;ERROR: Instruments overflow. Try remapping the instruments.
+;
+;
+; ***********************
+; * Strings for Prefs.c *
+; ***********************
+;
+MSG_BAD_PREFS_VERSION
+Foutieve versie van instellingen bestand.
+;Incorrect version of preferences file
+;
+;
+; ****************************
+; * Strings for Requesters.c *
+; ****************************
+;
+MSG_XMODULE_REQUEST
+XModule Aanvraag Venster
+;XModule Request
+; This is the title of requesters put out by XModule.
+;
+MSG_CLONE_WB
+Namaken Workbench Scherm
+;Clone Workbench Screen
+;
+MSG_CLOSE_FILEREQUESTER
+Bestandsaanvraag venster\n sluiten a.u.b en selecteer dan `Doorgaan'.
+;Please close FileRequester\n and then select `Continue'.
+;
+MSG_SELECT_MODULES
+Selecteer Module(s)...
+;Select Module(s)...
+;
+MSG_SELECT_INSTRUMENTS
+Selecteer Instrument(en)...
+;Select Instrument(s)...
+;
+MSG_SELECT_PATTERN
+Selecteer Patroon...
+;Select Pattern...
+;
+MSG_SAVE_MODULE
+Bewaren Module...
+;Save Module...
+;
+MSG_SAVE_INSTRUMENT
+Bewaren Instrument...
+;Save Instrument...
+;
+MSG_SAVE_PATTERN
+Bewaren Patroon...
+;Save Pattern...
+;
+MSG_FILE_EXISTS
+Bestand \"%s\"\n bestaat reeds.
+;File \"%s\"\nalready exists.
+;
+MSG_OVERWRITE
+Overschrijven|Kies Andere|Annuleer
+;Overwrite|Choose Another|Abort
+;
+;
+; **********************
+; * Strings for Song.c *
+; **********************
+;
+MSG_CLOSE_ALL_SONGS
+
+;Please close all open songs\n\
+;and then select `Continue'.
+;
+MSG_UNESPECTED_EOF
+Onverwacht einde van bestand.
+;Unespected end of file.
+;
+MSG_MODULE_LOADED_OK
+Module goed ingeladen.
+;Module loaded OK.
+;
+MSG_MODULE_SAVED_OK
+Module goed weggeschreven.
+;Module saved OK.
+;
+MSG_UNKNOWN_SAVE_FORMAT
+FOUT: Onbekend bewaar formaat.
+;ERROR: Unrecognized save format.
+;
+MSG_INVALID_LOOP_REMOVED
+Foutieve loop voor instrument %lx verwijderd.
+;Removed invalid loop for instrument %lx.
+;
+MSG_INVALID_LOOP_FIXED
+Foutieve loop voor instrument %lx hersteld.
+;Fixed invalid loop for instrument %lx.
+;
+MSG_SONG_HAS_NO_PATTS
+WAARSCHUWING: Song heeft geen patronen.
+;WARNING: Song has no patterns.
+;
+MSG_SONG_HAS_NO_SEQ
+WAARSCHUWING: Song heeft geen volgreeks.
+;WARNING: Song has no sequence.
+;
+MSG_INVALID_SONG_POS
+WAARSCHUWING: Song positie %ld refereert aan patroon %ld, deze bestaat niet.
+;WARNING: Song position %ld references pattern %ld, which doesn't exist.
+;
+MSG_UNKNOWN_MOD_FORMAT
+Kon module formaat niet identificeren.\n\
+(Een data bestand als mudule laden is onverstandig)
+;Unable to identify module format.\n\
+;(Loading a data file as a module is unwise)
+;
+MSG_SOUND_PRO_CANCEL
+Soundtracker 15|ProTracker|Annuleer
+;SoundTracker 15|ProTracker|Cancel
+;
+MSG_AUTHOR_UNKNOWN
+Onbekend
+;Unknown
+;
+MSG_SONG_UNTITLED
+Ongetiteld
+;Untitled
+;
+;
+; **********************
+; * Strings for Help.c *
+; **********************
+;
+MSG_AMIGAGUIDE_ERROR
+AmigaGuide fout: 
+;AmigaGuide error:
+; Note one blank space at the end of this line!
+;
+;
+; ***************************
+; * Strings for PattPrefs.c *
+; ***************************
+;
+MSG_PATTPREFS_TITLE
+
+;Pattern Editor Settings
+;
+;
+MSG_ADVANCE_TRACKS_GAD
+
+;Advance _Tracks
+;
+MSG_ADVANCE_LINES_GAD
+
+;Advance _Lines
+;
+MSG_MAX_UNDO_LEVELS_GAD
+
+;Max _Undo Levels
+;
+MSG_MAX_UNDO_MEM_GAD
+
+;Max Undo _Memory
+;
+MSG_CLIPBOARD_UNIT_GAD
+
+;Cli_pboard Unit
+;
+MSG_SCROLLER_POS_GAD
+
+;_Scroller Position
+;
+MSG_VERT_WRAP_GAD
+
+;_Vertical Wrap
+;
+MSG_HORIZ_WRAP_GAD
+
+;_Horizontal Wrap
+;
+MSG_HEX_LINE_NUMBERS_GAD
+
+;He_x Line Numbers
+;
+MSG_BLANK_ZERO_GAD
+
+;Blank _Zero Digits
+;
+MSG_BACKDROP_GAD
+
+;Backdrop _Window
+;
+MSG_HORIZ_SCROLLER_GAD
+
+;Ho_rizontal Scroller
+;
+MSG_DO_RULER_GAD
+
+;Display Cursor Ruler
+;
+MSG_DO_TINY_LINES_GAD
+
+;Display Tiny Lines
+;
+MSG_EDITOR_FONT_GAD
+
+;_Editor Font
+;
+MSG_BACKGROUND_PEN_GAD
+
+;Background
+;
+MSG_TEXT_PEN_GAD
+
+;T_ext
+;
+MSG_LINES_PEN_GAD
+
+;Li_nes
+;
+MSG_TINY_LINES_PEN_GAD
+
+;Tin_y Lines
+;
+MSG_RIGHT_GAD
+
+;Right
+;
+MSG_LEFT_GAD
+
+;Left
+;
+MSG_OFF_GAD
+
+;Off
+;
+MSG_PATT_TOO_LONG
+FOUT: Patroon zou het maximum aantal lijnen overschrijden.
+;ERROR: Pattern would exceed the maximum number of lines.
+;
+;
+; *****************************
+; * Strings for SequenceWin.c *
+; *****************************
+;
+;
+MSG_SEQUENCE_TITLE
+
+;Sequence Editor
+;
+;
+MSG_SEQUENCE_GAD
+
+;Sequence
+;
+MSG_UNDERSCORE_ADD_GAD
+
+;_Add
+;
+MSG_UP_GAD
+
+;Up
+;
+MSG_DOWN_GAD
+
+;Down
+;
+MSG_UNDERSCORE_NAME_GAD
+
+;_Name
+;
+MSG_PATTERNS_GAD
+
+;Patterns
+;
+MSG_UNDERSCORE_UP_GAD
+
+;_Up
+;
+MSG_UNDERSCORE_DOWN_GAD
+
+;_Down
+;
+MSG_UNDERSCORE_INS_GAD
+
+;_Ins
+;
+;
+MSG_UNNAMED
+
+;-- unnamed --
+;
+;
+; ********************************
+; * Strings for InstrumentsWin.c *
+; ********************************
+;
+MSG_INSTRUMENTS_TITLE
+
+;Instruments
+;
+;
+MSG_VOLUME_GAD
+
+;_Volume
+;
+MSG_FINETUNE_GAD
+
+;_FineTune
+;
+MSG_LENGTH_GAD
+
+;Length
+;
+MSG_KIND_GAD
+
+;_Kind
+;
+MSG_EDIT_DOTS_GAD
+
+;_Edit...
+;
+MSG_SAMPLE_GAD
+
+;Sample
+;
+MSG_SYNTH_GAD
+
+;Synth
+;
+MSG_HYBRID_GAD
+
+;Hybrid
+;
+;
+MSG_INSTRUMENTS_MEN
+
+;Instruments
+;
+MSG_LOAD_MEN
+
+;Load...
+;
+MSG_REMAP_MEN
+
+;Remap
+;
+MSG_SAVE_COMPRESSED_MEN
+
+;Save Compressed
+;
+MSG_SAVE_RAW_MEN
+
+;Save Raw
+;
+;
+MSG_EMPTY
+
+;-- empty --
+;
+;
+; *************************
+; * Strings for PlayWin.c *
+; *************************
+;
+MSG_PLAY_TITLE
+
+;Play
+;
+;
+MSG_VOL_GAD
+
+;_Vol
+;
+MSG_POS_GAD
+
+;Pos
+;
+MSG_TIME_GAD
+
+;Time
+;
+MSG_RST_GAD
+
+;_Rst
+; Stands for Reset/Restart
+;
+MSG_PLAYER_INIT_ERR
+Afspeler initialisatie fout: %ld.
+;Player initialization error: %ld.
+;
+;
+; *****************************
+; * Strings for ProgressWin.c *
+; *****************************
+;
+MSG_PROGRESS_TITLE
+
+;XModule is working...
+;
+MSG_LOG_TITLE
+
+;XModule Log
+;
+;
+MSG_UNDERSCORE_ABORT_GAD
+
+;_Abort
+;
+;
+MSG_PERCENT_DONE
+%ld van %ld (%ld%% gedaan)
+;%ld of %ld (%ld%% done)
+; This string appears inside the progress window gauge.
+; eg: "5 of 20 (25% done)".
+; Leave that double percent (%%) alone! :-)
+;
+;
+; *****************************
+; * Strings for SongInfoWin.c *
+; *****************************
+;
+MSG_SONGINFO_TITLE
+
+;Song Information
+;
+;
+MSG_UNDERSCORE_NEW_GAD
+
+;Ne_w
+;
+MSG_OPEN_GAD
+
+;_Open...
+;
+MSG_SAVE_GAD
+
+;_Save
+;
+MSG_DEL_GAD
+
+;Del
+;
+MSG_SONG_NAME_GAD
+
+;Song _Name
+;
+MSG_AUTHOR_NAME_GAD
+
+;_Author
+;
+MSG_DEF_TEMPO_GAD
+
+;_Tempo
+;
+MSG_DEF_SPEED_GAD
+
+;S_peed
+;
+MSG_RESTART_GAD
+
+;_Restart
+;
+MSG_LENGHT_GAD
+
+;Length
+;
+MSG_NUM_PATTS_GAD
+
+;Num Patterns
+;
+MSG_NUM_TRACKS_GAD
+
+;Tracks
+;
+MSG_TOT_MOD_SIZE_GAD
+
+;Total Module Size
+;
+MSG_TOT_INST_SIZE_GAD
+
+;Total Instruments Size
+;
+;
+MSG_SONG_MEN
+
+;Song
+;
+MSG_MERGE_SONGS_MEN
+
+;Merge Songs
+;
+MSG_JOIN_SONGS_MEN
+
+;Join Songs
+;
+;
+MSG_JOIN_REQUIRES_TWO_SONGS
+FOUT: Toevoegen vereist twee songs.
+;ERROR: Join requires two songs.
+;
+MSG_MERGE_REQUIRES_TWO_SONGS
+FOUT: Samenvoegen vereist twee songs.
+;ERROR: Merge requires two songs.
+;
+MSG_DISCARD_CURRENT_SONG
+Verwijderen huidige song?
+;Discard current song?
+;
+;
+; ****************************
+; * Strings for ToolBoxWin.c *
+; ****************************
+;
+MSG_TOOLBOX_TITLE
+
+;ToolBox
+;
+;
+MSG_PLAY_GAD
+
+;Play...
+;
+MSG_SONGS_GAD
+
+;_Songs...
+;
+MSG_PATTERNS_DOTS_GAD
+
+;_Patterns...
+;
+MSG_INSTRUMENTS_GAD
+
+;_Instruments...
+;
+MSG_SEQUENCE_DOTS_GAD
+
+;Se_quence...
+;
+MSG_OPTIMIZATION_GAD
+
+;_Optimization...
+;
+MSG_PROJECT_MEN
+
+;Project
+;
+MSG_NEW_MEN
+
+;New
+;
+MSG_OPEN_MEN
+
+;Open...
+;
+MSG_OPEN_NEW_MEN
+
+;Open New...
+;
+MSG_SAVE_MEN
+
+;Save
+;
+MSG_SAVE_AS_MEN
+
+;Save As...
+;
+MSG_CLEAR_MEN
+
+;Clear...
+;
+MSG_ABOUT_MEN
+
+;About...
+;
+MSG_HELP_MEN
+
+;Help...
+;
+MSG_ICONIFY_MEN
+
+;Iconify...
+;
+MSG_QUIT_MEN
+
+;Quit
+;
+MSG_SETTINGS_MEN
+
+;Settings
+;
+MSG_SAVE_FORMAT_MEN
+
+;Save Format...
+;
+MSG_USER_INTERFACE_MEN
+
+;User Interface...
+;
+MSG_SAVE_ICONS_MEN
+
+;Save Icons
+;
+MSG_CONFIRM_OVERWRITE_MEN
+
+;Confirm Overwrite
+;
+MSG_CONFIRM_EXIT_MEN
+
+;Confirm Exit
+;
+MSG_VERBOSE_MEN
+
+;Verbose Log
+;
+MSG_OPEN_SETTINGS_MEN
+
+;Open Settings...
+;
+MSG_SAVE_SETTINGS_MEN
+
+;Save Settings
+;
+MSG_SAVE_SETTINGS_AS_MEN
+
+;Save Settings As...
+;
+;
+MSG_ABOUT_TEXT
+%s %s\n\
+Een Muziek Module Bewerkings Utility\n\n
+;%s\n\
+;A Music Module Processing Utility\n\n\
+;\
+;%s\n\
+;All rights reserved.\n\n\
+;\
+;Internet: bernie@shock.cosmos.it\n\n\
+;FidoNet:  2:332/125.1\n\
+;\
+;Free CHIP Memory: %ldKB\n\
+;Free FAST Memory: %ldKB\n\n\
+;Public Screen: %s\n\
+;ARexx Port: %s\n\
+;Cx HotKey: %s\n\
+;Language: %s
+;
+MSG_DEFAULT
+--Standaard--
+;-- Default --
+;
+MSG_DISABLED
+--Uitgeschakeld--
+;-- Disabled --
+;
+;
+; *********************************
+; * Strings for OptimizationWin.c *
+; *********************************
+;
+MSG_OPTIMIZATION_TITLE
+
+;Module Optimization
+;
+;
+MSG_OPTIMIZE_GAD
+
+;_Optimize
+;
+MSG_REM_UNUSED_PATTS_GAD
+
+;Remove Unused _Patterns
+;
+MSG_REM_DUPLICATE_PATTS_GAD
+
+;Remove _Duplicate Patterns
+;
+MSG_REM_UNUSED_INSTR_GAD
+
+;Remove Unused _Instruments
+;
+MSG_REM_DUP_INSTR_GAD
+
+;Remove Duplicate I_nstruments
+;
+MSG_CUT_AFTER_LOOP_GAD
+
+;Cut Instruments After _Loop
+;
+MSG_CUT_ZERO_TAILS_GAD
+
+;Cut Instrument _Zero Tails
+;
+MSG_CUT_PATTERNS_GAD
+
+;Cut _Breaked Patterns
+;
+MSG_REMAP_INSTRUMENTS_GAD
+
+;_Remap Instruments
+;
+;
+MSG_SAVED_X_BYTES
+Bewaard %ld bytes (%ld%%)
+;Saved %ld bytes (%ld%%)
+;
+;
+; **************************
+; * Strings for PrefsWin.c *
+; **************************
+;
+;
+MSG_PREFS_TITLE
+
+;User Interface Settings
+;
+;
+MSG_PUBLIC_SCREEN_GAD
+
+;_Public Screen
+;
+MSG_DISPLAY_MODE_GAD
+
+;Display _Mode
+;
+MSG_WINDOW_FONT_GAD
+
+;_Window Font
+;
+MSG_LISTVIEW_FONT_GAD
+
+;_ListView Font
+;
+MSG_REQUESTERS_GAD
+
+;_Requesters
+;
+MSG_USE_DATATYPES_GAD
+
+;Use _DataTypes
+;
+MSG_APPICON_GAD
+
+;Put App_Icon
+;
+MSG_REFRESH_GAD
+
+;Refres_h
+;
+MSG_LOG_TO_FILE_GAD
+
+;Log To File
+;
+MSG_LOG_LEVEL_GAD
+
+;_Log Level
+;
+MSG_ASK_AUTOSAVE_GAD
+
+;Confirm _Autosave
+;
+MSG_AUTOSAVE_TIME_GAD
+
+;Autosave Mi_nutes
+;
+MSG_DO_BACKUPS_GAD
+
+;Create _Backups
+;
+MSG_BACKUP_TEMPLATE_GAD
+
+;Bac_kup Template
+;
+MSG_BACKUP_VERSIONS_GAD
+
+;Backup _Versions
+;
+MSG_ASL_GAD
+
+;Asl
+;
+MSG_REQTOOLS_GAD
+
+;ReqTools
+;
+MSG_SMART_GAD
+
+;Smart
+;
+MSG_SIMPLE_GAD
+
+;Simple
+;
+MSG_CLONE_DEF_SCREEN
+
+;--Clone Default Screen--
+;
+;
+; ****************************
+; * Strings for PatternWin.c *
+; ****************************
+;
+MSG_PATTERN_TITLE
+
+;Pattern Editor
+;
+;
+MSG_PATTERNS_MEN
+
+;Patterns
+;
+MSG_SIZE_MEN
+
+;Size...
+;
+MSG_EDIT_MEN
+
+;Edit
+;
+MSG_MARK_MEN
+
+;Mark
+;
+MSG_CUT_MEN
+
+;Cut
+;
+MSG_COPY_MEN
+
+;Copy
+;
+MSG_PASTE_MEN
+
+;Paste
+;
+MSG_ERASE_MEN
+
+;Erase
+;
+MSG_UNDO_MEN
+
+;Undo
+;
+MSG_REDO_MEN
+
+;Redo
+;
+MSG_EDITOR_SETTINGS_MEN
+
+;Editor Settings...
+;
+;
+; ***************************
+; * Strings for SaversWin.c *
+; ***************************
+;
+MSG_SAVERS_TITLE
+
+;Savers
+;
+;
+MSG_SF_SEQUENCE_GAD
+
+;Se_quence
+;
+MSG_SF_INSTRUMENTS_GAD
+
+;_Instruments
+;
+MSG_SF_PATTERNS_GAD
+
+;_Patterns
+;
+MSG_SF_NAMES_GAD
+
+;Names
+;
+MSG_ADD_ICON_GAD
+
+;Add I_con
+;
+MSG_MODE_GAD
+
+;_Mode
+;
+MSG_OPTIONS_DOTS_GAD
+
+;Options...
+;
+MSG_NONE_GAD
+
+;None
+;
+MSG_XPK_GAD
+
+;XPK
+;
+MSG_LHA_GAD
+
+;LhA
+;
+;
+MSG_DESCRIPTION
+
+;Description
+;
+MSG_AUTHOR
+
+;Author
+;
+MSG_MAXLENGTH
+
+;Max Length
+;
+MSG_MAXTRACKS
+
+;Max Tracks
+;
+MSG_MAXINSTRUMENTS
+
+;Max Instruments
+;
+MSG_MAXPATTERNS
+
+;Max Patterns
+;
+MSG_MAXPATTLEN
+
+;Max Pattern Length
+;
+MSG_MAXSAMPLELEN
+
+;Max Sample Length
+;
+;
+; **********************
+; * Strings ClearWin.c *
+; **********************
+;
+MSG_CLEAR_TITLE
+
+;Clear Module
+;
+;
+MSG_CLR_SEQUENCE_GAD
+
+;_Sequence
+;
+MSG_CLR_INSTRUMENTS_GAD
+
+;_Instruments
+;
+MSG_CLR_PATTERNS_GAD
+
+;_Patterns
+;
+MSG_CLEARMOD_GAD
+
+;_Clear
+;
+;
+; ***************************
+; * Strings for SampleWin.c *
+; ***************************
+;
+MSG_SAMPLE_TITLE
+
+;Sample Editor
+;
+;
+MSG_RENDER_MEN
+
+;Render
+;
+MSG_POINTS_MEN
+
+;Points
+;
+MSG_LINES_MEN
+
+;Lines
+;
+MSG_FILLED_MEN
+
+;Filled
+;
+;
+; *****************************
+; * Strings for PattSizeWin.c *
+; *****************************
+;
+MSG_PATTSIZE_TITLE
+
+;Pattern Attributes
+;
+;
+MSG_LINES_GAD
+
+;_Lines
+;
+MSG_TRACKS_GAD
+
+;_Tracks
+;
+MSG_DOUBLE_GAD
+
+;_Double
+;
+MSG_HALVE_GAD
+
+;_Halve
+;
+;
+; *************************
+; * Strings for Library.c *
+; *************************
+;
+MSG_SONG_TOO_MANY_TRACKS
+
+;WARNING: The selected saver supports max %lu tracks, but the song has %lu tracks.
+;
+MSG_SONG_TOO_MANY_PATTS
+
+;WARNING: The selected saver supports max %lu patterns; the song has %lu patterns.
+;
+MSG_SONG_TOO_MANY_INSTRS
+
+;WARNING: The selected saver supports max %lu instruments, last instrument is %lu.
+;
+MSG_SONG_TOO_MANY_POS
+
+;WARNING: The selected saver supports max %lu positions, but the song has %lu positions.
+;
+MSG_PATT_LENGTH_INVALID
+
+;WARNING: The length of pattern %ld ($%lx lines) isn't allowed with the selected saver.
+;
+MSG_INSTR_TOO_LONG
+WAARSCHUWING: Instrument %lx is te lang.
+;WARNING: Instrument %lx is too long and will be cropped to %lu bytes.
+;
+MSG_WILL_MODIFY_SONG
+
+;Some modifications need to be performed on this song\n\
+;in order to adapt it to the limitations of the\n\
+;destination format.
+;
+MSG_TRY_REMAPPING_INSTRUMENTS
+
+;Some instruments are placed beyond the limit for\n\
+;the selected format.\n\
+;Remapping the instruments now could help saving\n\
+;all them along with the selected format.
+;
+MSG_SAVING_MODULE
+
+;Saving %s module \"%s\"...
+; the first %s is the format name, the second %s is the song name.
diff --git a/Catalogs/xmodule.cd b/Catalogs/xmodule.cd
new file mode 100644 (file)
index 0000000..3cdbdd9
--- /dev/null
@@ -0,0 +1,1160 @@
+#language english
+#version 1
+;**
+;** XModule.cd 3.9
+;**
+;** Copyright (C) 1995,96 Bernardo Innocenti
+;**
+;
+; **********************************
+; * Strings for all source modules *
+; **********************************
+;
+;
+MSG_NULL (0/0/0)
+
+; This string should remain blank.
+;
+MSG_OK (//)
+Ok
+;
+MSG_UNDERSCORE_USE_GAD (//)
+_Use
+;
+MSG_UNDERSCORE_OK_GAD (//)
+_Ok
+;
+MSG_UNDERSCORE_CANCEL_GAD (//)
+_Cancel
+;
+MSG_YES_OR_NO (//)
+Yes|No
+;
+MSG_RETRY_OR_CANCEL (//)
+Retry|Cancel
+;
+MSG_PROCEED_OR_CANCEL (//)
+Proceed|Cancel
+;
+MSG_CONTINUE (//)
+Continue
+;
+MSG_NO_FREE_STORE (//)
+Insufficient memory.
+;
+MSG_BREAK (//)
+Aborted.
+;
+MSG_ERR_LOAD (//)
+Unable to load \"%s\"
+; %s is the filename. A colon ':' and the explanation of failure will be postpended.
+;
+MSG_CANT_OPEN (//)
+Cannot open file \"%s\"
+; %s is the filename. A colon ':' and the explanation of failure will be postpended.
+;
+MSG_ERROR_READING (//)
+Error reading \"%s\"
+; %s is the filename. A colon ':' and the explanation of failure will be postpended.
+;
+MSG_ERROR_WRITING (//)
+Error writing \"%s\"
+; %s is the filename. A colon ':' and the explanation of failure will be postpended.
+;
+;
+; *****************************
+; * Strings for Compression.c *
+; *****************************
+;
+MSG_DECRUNCHING (//)
+Decrunching...
+;
+MSG_NOTHING_IN_ARC (//)
+Nothing found in archive \"%s\".
+;
+MSG_CANT_LOAD_COMPRESSED (//)
+Unable to load compressed file.
+;
+MSG_ERROR_DECOMPRESSING (//)
+Error decompressing file \"%s\": %s.
+;
+;
+; ********************
+; * Strings for Cx.c *
+; ********************
+;
+MSG_BAD_HOTKEY (//)
+Bad Commodity HotKey description.
+;
+;
+; ***************************
+; * Strings for all loaders *
+; ***************************
+;
+MSG_READING_PATTS (//)
+Reading Patterns...
+;
+MSG_READING_INSTS_INFO (//)
+Reading Instruments Info...
+;
+MSG_READING_INSTS (//)
+Reading Instruments...
+;
+MSG_ERR_CANT_LOAD_PATT (//)
+ERROR: Couldn't load pattern %ld.
+;
+MSG_ERR_CANT_LOAD_INST (//)
+ERROR: Couldn't load instrument %lx.
+;
+MSG_ERR_NO_MEM_FOR_INST (//)
+ERROR: Not enough memory for instrument %lx.
+;
+MSG_ERR_NOT_A_SAMPLE (//)
+ERROR: Instrument %lx is not a sample.
+;
+MSG_SONG_TOO_LONG (//)
+WARNING: Song length exceeds maximum. Will be truncated.
+;
+MSG_SONG_HAS_TOO_MANY_PATT (//)
+WARNING: Song exceeds maximum number of patterns.
+;
+MSG_PATT_TOO_MANY_TRACKS (//)
+WARNING: Pattern %ld has too many tracks. Cropping to %ld tracks.
+;
+MSG_PATT_TOO_MANY_LINES (//)
+WARNING: Pattern %ld has too many lines. Cropping to %ld lines.
+;
+MSG_INVALID_NOTE (//)
+WARNING: Invalid note %ld (Patt %ld Track %ld Line %ld).
+;
+MSG_UNKNOWN_EFF (//)
+Unknown effect: $%lx (Patt %ld Track %ld Line %ld).
+;
+MSG_EXTRA_DATA_AFTER_MOD (//)
+WARNING: Extra data found after valid module: Will be ignored.
+;
+MSG_WRITING_HEADER (//)
+Writing Header...
+;
+MSG_WRITING_PATTS (//)
+Writing Patterns...
+;
+MSG_WRITING_INSTS (//)
+Writing Instruments...
+;
+MSG_WRITING_INSTINFO (//)
+Writing Instruments Info...
+;
+MSG_WRITING_INSTDATA (//)
+Writing Instruments Data...
+;
+MSG_NOTE_TOO_LOW (//)
+WARNING: Note at Patt %ld Track %ld Line %ld is too low.
+;
+MSG_NOTE_TOO_HIGH (//)
+WARNING: Note at Patt %ld Track %ld Line %ld is too high.
+;
+MSG_NO_MEM_TO_HALVE (//)
+WARNING: Not enough memory to halve volume of instrument %lx.
+;
+;
+; *****************************
+; * Strings for Get/SaveMED.c *
+; *****************************
+;
+MSG_READING_MMD (//)
+Loading MMD%lc module...
+; The %lc is the MED format (0, 1, 2, ...)
+;
+MSG_UNSUPPORTED_MMD_FORMAT (//)
+ERROR: Unsupported OctaMED format.
+;
+MSG_WRONG_EFFECT_IN_MMD0 (//)
+WARNING: Effect %lx is not supported in MMD0 format. Use MMD1 or better.
+;
+;
+; ***********************************
+; * Strings for ScreamTrackerHook.c *
+; ***********************************
+;
+MSG_ADLIB_INSTR (//)
+ERROR: Instrument %lx is an ADLib %s.
+; %s is the name of the ADLib instrument (eg: Snare).
+;
+MSG_TRACK_OUT_OF_RANGE (//)
+WARNING: Track %lx is out of range.
+;
+MSG_UNKNOWN_SAMPLE_COMPRESSION (//)
+WARNING: Unknown sample compression for instrument %lx.
+;
+MSG_INST_IS_STEREO (//)
+WARNING: Instrument %lx is a stereo sample.
+;
+MSG_INST_IS_16BIT (//)
+WARNING: Instrument %lx is 16bit: unable to load it.
+;
+;
+; *****************************
+; * Strings for TrackerHook.c *
+; *****************************
+;
+MSG_READING_TYPE_MODULE (//)
+Reading %s module...
+; (%s is the module format)
+;
+MSG_EXCEEDS_64_PATTS (//)
+NOTE: Module exceeds 64 patterns. You need ProTracker 2.3 to play it.
+;
+MSG_MODULE_ID (//)
+Tracker ID: \"%s\"
+;
+MSG_MODULE_HAS_N_CHN (//)
+Module has %lu tracks...
+;
+MSG_SONG_HAS_NO_INSTS (//)
+This file is a song and doesn't contain instruments.
+;
+MSG_EXCEEDS_MAXPAATTS (//)
+WARNING: Module execeeds %ld patterns.
+;
+MSG_PATT_WILL_GROW (//)
+Pattern %ld will grow to 64 lines (was %ld lines long).
+;
+MSG_SPLITTING_PATT (//)
+Splitting pattern %ld (was %ld lines long).
+;
+; **************************
+; * Strings for SaveMIDI.c *
+; **************************
+;
+MSG_CHOOSING_CHANNELS (//)
+Choosing Channels...
+;
+MSG_WRITING_MIDI_TRACKS (//)
+Writing MIDI Tracks...
+;
+MSG_TOO_MANY_CHANNELS (//)
+ERROR: Song requires too many MIDI channels.
+;
+;
+; *********************
+; * Strings for Gui.c *
+; *********************
+;
+MSG_REALLY_QUIT_XMODULE (//)
+Really Quit XModule?
+;
+MSG_CLOSE_ALL_WINDOWS (//)
+Please close all visitor windows\n\
+and then select `Continue'.
+;
+;
+; ***********************
+; * Strings for Instr.c *
+; ***********************
+;
+MSG_UNKNOWN_IFF (//)
+Unknown IFF format %s.
+;
+MSG_ILLEGAL_IFF_STRUCTURE (//)
+Illegal IFF structure.
+;
+MSG_SELECT_RAW_MODE (//)
+Unrecognized instrument format.\n\
+Please select RAW mode.
+;
+MSG_RAW_MODES (//)
+Signed 8bit|Unsigned 8bit|Cancel
+;
+MSG_DATATYPES_ERROR (//)
+DataTypes error: %s.
+; %s is a detailed description of the problem.
+;
+MSG_UNKNOWN_COMPRESSION (//)
+Unknown compression type.
+;
+MSG_SAMPLE_WRONG_SIZE (//)
+%lu bit samples are not supported.
+; %lu is the number of bits per sample.
+;
+MSG_SAMPLE_NOT_MONO (//)
+Samples other than MONO are not supported.
+;
+MSG_SAMPLE_WRONG_NUMBER_OF_CHANNELS (//)
+Samples with %ld channels are not supported.
+;
+MSG_NO_MEMORY_TO_OPTIMIZE_INSTR (//)
+WARNING: insufficient memory to optimize instrument %lx.
+;
+MSG_INSTR_WILL_SHRINK (//)
+Instrument %lx will shrink from %ld to %ld.
+;
+MSG_INSTR_DUPES_REMOVED (//)
+Duplicate instruments found and removed: %lx == %lx.
+;
+MSG_INSTR_UNUSED (//)
+Instrument %lx was never used and it's being removed.
+;
+;
+; **********************
+; * Strings for Misc.c *
+; **********************
+;
+MSG_OPENLIB_VER_FAIL (//)
+Couldn't open \"%s\" version %ld or greater.
+;
+MSG_OPENLIB_FAIL (//)
+Couldn't open \"%s\".
+;
+;
+; ***************************
+; * Strings for Operators.c *
+; ***************************
+;
+MSG_CANT_INSERT_PATT (//)
+Unable to insert pattern: Maximum number of patterns reached.
+;
+MSG_PATT_UNUSED (//)
+Pattern %ld is not used and is beeing deleted.
+;
+MSG_PATT_CUT (//)
+Pattern %ld will be cut at line %ld.
+;
+MSG_PATT_DUPE (//)
+Duplicate patterns found and removed: %ld == %ld.
+; The two %ld are the pattern numbers.
+;
+MSG_SONG_LEN_DIFFERENT (//)
+WARNING: Song lengths are different. Using shorter one.
+;
+MSG_PATT_LEN_DIFFERENT (//)
+WARNING: Different pattern lengths at position %ld. Using shorter one.
+;
+MSG_ERR_INSTR_OVERFLOW (//)
+ERROR: Instruments overflow. Try remapping the instruments.
+;
+;
+; ***********************
+; * Strings for Prefs.c *
+; ***********************
+;
+MSG_BAD_PREFS_VERSION (//)
+Incorrect version of preferences file
+;
+;
+; ****************************
+; * Strings for Requesters.c *
+; ****************************
+;
+MSG_XMODULE_REQUEST (//)
+XModule Request
+; This is the title of requesters put out by XModule.
+;
+MSG_CLONE_WB (//)
+Clone Workbench Screen
+;
+MSG_CLOSE_FILEREQUESTER (//)
+Please close FileRequester\n and then select `Continue'.
+;
+MSG_SELECT_MODULES (//)
+Select Module(s)...
+;
+MSG_SELECT_INSTRUMENTS (//)
+Select Instrument(s)...
+;
+MSG_SELECT_PATTERN (//)
+Select Pattern...
+;
+MSG_SAVE_MODULE (//)
+Save Module...
+;
+MSG_SAVE_INSTRUMENT (//)
+Save Instrument...
+;
+MSG_SAVE_PATTERN (//)
+Save Pattern...
+;
+MSG_FILE_EXISTS (//)
+File \"%s\"\nalready exists.
+;
+MSG_OVERWRITE (//)
+Overwrite|Choose Another|Abort
+;
+;
+; **********************
+; * Strings for Song.c *
+; **********************
+;
+MSG_CLOSE_ALL_SONGS (//)
+Please close all open songs\n\
+and then select `Continue'.
+;
+MSG_UNESPECTED_EOF (//)
+Unespected end of file.
+;
+MSG_MODULE_LOADED_OK (//)
+Module loaded OK.
+;
+MSG_MODULE_SAVED_OK (//)
+Module saved OK.
+;
+MSG_UNKNOWN_SAVE_FORMAT (//)
+ERROR: Unrecognized save format.
+;
+MSG_INVALID_LOOP_REMOVED (//)
+Removed invalid loop for instrument %lx.
+;
+MSG_INVALID_LOOP_FIXED (//)
+Fixed invalid loop for instrument %lx.
+;
+MSG_SONG_HAS_NO_PATTS (//)
+WARNING: Song has no patterns.
+;
+MSG_SONG_HAS_NO_SEQ (//)
+WARNING: Song has no sequence.
+;
+MSG_INVALID_SONG_POS (//)
+WARNING: Song position %ld references pattern %ld, which doesn't exist.
+;
+MSG_UNKNOWN_MOD_FORMAT (//)
+Unable to identify module format.\n\
+(Loading a data file as a module is unwise)
+;
+MSG_SOUND_PRO_CANCEL (//)
+SoundTracker 15|ProTracker|Cancel
+;
+MSG_AUTHOR_UNKNOWN (//)
+Unknown
+;
+MSG_SONG_UNTITLED (//)
+Untitled
+;
+;
+; **********************
+; * Strings for Help.c *
+; **********************
+;
+MSG_AMIGAGUIDE_ERROR (//)
+AmigaGuide error:
+; Note one blank space at the end of this line!
+;
+;
+; ***************************
+; * Strings for PattPrefs.c *
+; ***************************
+;
+MSG_PATTPREFS_TITLE (//)
+Pattern Editor Settings
+;
+;
+MSG_ADVANCE_TRACKS_GAD (//)
+Advance _Tracks
+;
+MSG_ADVANCE_LINES_GAD (//)
+Advance _Lines
+;
+MSG_MAX_UNDO_LEVELS_GAD (//)
+Max _Undo Levels
+;
+MSG_MAX_UNDO_MEM_GAD (//)
+Max Undo _Memory
+;
+MSG_CLIPBOARD_UNIT_GAD (//)
+Cli_pboard Unit
+;
+MSG_SCROLLER_POS_GAD (//)
+_Scroller Position
+;
+MSG_VERT_WRAP_GAD (//)
+_Vertical Wrap
+;
+MSG_HORIZ_WRAP_GAD (//)
+_Horizontal Wrap
+;
+MSG_HEX_LINE_NUMBERS_GAD (//)
+He_x Line Numbers
+;
+MSG_BLANK_ZERO_GAD (//)
+Blank _Zero Digits
+;
+MSG_BACKDROP_GAD (//)
+Backdrop _Window
+;
+MSG_HORIZ_SCROLLER_GAD (//)
+Ho_rizontal Scroller
+;
+MSG_DO_RULER_GAD (//)
+Display Cursor Ruler
+;
+MSG_DO_TINY_LINES_GAD (//)
+Display Tiny Lines
+;
+MSG_EDITOR_FONT_GAD (//)
+_Editor Font
+;
+MSG_BACKGROUND_PEN_GAD (//)
+Background
+;
+MSG_TEXT_PEN_GAD (//)
+T_ext
+;
+MSG_LINES_PEN_GAD (//)
+Li_nes
+;
+MSG_TINY_LINES_PEN_GAD (//)
+Tin_y Lines
+;
+MSG_RIGHT_GAD (//)
+Right
+;
+MSG_LEFT_GAD (//)
+Left
+;
+MSG_OFF_GAD (//)
+Off
+;
+MSG_PATT_TOO_LONG (//)
+ERROR: Pattern would exceed the maximum number of lines.
+;
+;
+; *****************************
+; * Strings for SequenceWin.c *
+; *****************************
+;
+;
+MSG_SEQUENCE_TITLE (//)
+Sequence Editor
+;
+;
+MSG_SEQUENCE_GAD (//)
+Sequence
+;
+MSG_UNDERSCORE_ADD_GAD (//)
+_Add
+;
+MSG_UP_GAD (//)
+Up
+;
+MSG_DOWN_GAD (//)
+Down
+;
+MSG_UNDERSCORE_NAME_GAD (//)
+_Name
+;
+MSG_PATTERNS_GAD (//)
+Patterns
+;
+MSG_UNDERSCORE_UP_GAD (//)
+_Up
+;
+MSG_UNDERSCORE_DOWN_GAD (//)
+_Down
+;
+MSG_UNDERSCORE_INS_GAD (//)
+_Ins
+;
+;
+MSG_UNNAMED (//)
+-- unnamed --
+;
+;
+; ********************************
+; * Strings for InstrumentsWin.c *
+; ********************************
+;
+MSG_INSTRUMENTS_TITLE (//)
+Instruments
+;
+;
+MSG_VOLUME_GAD (//)
+_Volume
+;
+MSG_FINETUNE_GAD (//)
+_FineTune
+;
+MSG_LENGTH_GAD (//)
+Length
+;
+MSG_KIND_GAD (//)
+_Kind
+;
+MSG_EDIT_DOTS_GAD (//)
+_Edit...
+;
+MSG_SAMPLE_GAD (//)
+Sample
+;
+MSG_SYNTH_GAD (//)
+Synth
+;
+MSG_HYBRID_GAD (//)
+Hybrid
+;
+;
+MSG_INSTRUMENTS_MEN (//)
+Instruments
+;
+MSG_LOAD_MEN (//)
+Load...
+;
+MSG_REMAP_MEN (//)
+Remap
+;
+MSG_SAVE_COMPRESSED_MEN (//)
+Save Compressed
+;
+MSG_SAVE_RAW_MEN (//)
+Save Raw
+;
+;
+MSG_EMPTY (//)
+-- empty --
+;
+;
+; *************************
+; * Strings for PlayWin.c *
+; *************************
+;
+MSG_PLAY_TITLE (//)
+Play
+;
+;
+MSG_VOL_GAD (//)
+_Vol
+;
+MSG_POS_GAD (//)
+Pos
+;
+MSG_TIME_GAD (//)
+Time
+;
+MSG_RST_GAD (//)
+_Rst
+; Stands for Reset/Restart
+;
+MSG_PLAYER_INIT_ERR (//)
+Player initialization error: %ld.
+;
+;
+; *****************************
+; * Strings for ProgressWin.c *
+; *****************************
+;
+MSG_PROGRESS_TITLE (//)
+XModule is working...
+;
+MSG_LOG_TITLE (//)
+XModule Log
+;
+;
+MSG_UNDERSCORE_ABORT_GAD (//)
+_Abort
+;
+;
+MSG_PERCENT_DONE (//30)
+%ld of %ld (%ld%% done)
+; This string appears inside the progress window gauge.
+; eg: "5 of 20 (25% done)".
+; Leave that double percent (%%) alone! :-)
+;
+;
+; *****************************
+; * Strings for SongInfoWin.c *
+; *****************************
+;
+MSG_SONGINFO_TITLE (//)
+Song Information
+;
+;
+MSG_UNDERSCORE_NEW_GAD (//)
+Ne_w
+;
+MSG_OPEN_GAD (//)
+_Open...
+;
+MSG_SAVE_GAD (//)
+_Save
+;
+MSG_DEL_GAD (//)
+Del
+;
+MSG_SONG_NAME_GAD (//)
+Song _Name
+;
+MSG_AUTHOR_NAME_GAD (//)
+_Author
+;
+MSG_DEF_TEMPO_GAD (//)
+_Tempo
+;
+MSG_DEF_SPEED_GAD (//)
+S_peed
+;
+MSG_RESTART_GAD (//)
+_Restart
+;
+MSG_LENGHT_GAD (//)
+Length
+;
+MSG_NUM_PATTS_GAD (//)
+Num Patterns
+;
+MSG_NUM_TRACKS_GAD (//)
+Tracks
+;
+MSG_TOT_MOD_SIZE_GAD (//)
+Total Module Size
+;
+MSG_TOT_INST_SIZE_GAD (//)
+Total Instruments Size
+;
+;
+MSG_SONG_MEN (//)
+Song
+;
+MSG_MERGE_SONGS_MEN (//)
+Merge Songs
+;
+MSG_JOIN_SONGS_MEN (//)
+Join Songs
+;
+;
+MSG_JOIN_REQUIRES_TWO_SONGS (//)
+ERROR: Join requires two songs.
+;
+MSG_MERGE_REQUIRES_TWO_SONGS (//)
+ERROR: Merge requires two songs.
+;
+MSG_DISCARD_CURRENT_SONG (//)
+Discard current song?
+;
+;
+; ****************************
+; * Strings for ToolBoxWin.c *
+; ****************************
+;
+MSG_TOOLBOX_TITLE (//)
+ToolBox
+;
+;
+MSG_PLAY_GAD (//)
+Play...
+;
+MSG_SONGS_GAD (//)
+_Songs...
+;
+MSG_PATTERNS_DOTS_GAD (//)
+_Patterns...
+;
+MSG_INSTRUMENTS_GAD (//)
+_Instruments...
+;
+MSG_SEQUENCE_DOTS_GAD (//)
+Se_quence...
+;
+MSG_OPTIMIZATION_GAD (//)
+_Optimization...
+;
+MSG_PROJECT_MEN (//)
+Project
+;
+MSG_NEW_MEN (//)
+New
+;
+MSG_OPEN_MEN (//)
+Open...
+;
+MSG_OPEN_NEW_MEN (//)
+Open New...
+;
+MSG_SAVE_MEN (//)
+Save
+;
+MSG_SAVE_AS_MEN (//)
+Save As...
+;
+MSG_CLEAR_MEN (//)
+Clear...
+;
+MSG_ABOUT_MEN (//)
+About...
+;
+MSG_HELP_MEN (//)
+Help...
+;
+MSG_ICONIFY_MEN (//)
+Iconify...
+;
+MSG_QUIT_MEN (//)
+Quit
+;
+MSG_SETTINGS_MEN (//)
+Settings
+;
+MSG_SAVE_FORMAT_MEN (//)
+Save Format...
+;
+MSG_USER_INTERFACE_MEN (//)
+User Interface...
+;
+MSG_SAVE_ICONS_MEN (//)
+Save Icons
+;
+MSG_CONFIRM_OVERWRITE_MEN (//)
+Confirm Overwrite
+;
+MSG_CONFIRM_EXIT_MEN (//)
+Confirm Exit
+;
+MSG_VERBOSE_MEN (//)
+Verbose Log
+;
+MSG_OPEN_SETTINGS_MEN (//)
+Open Settings...
+;
+MSG_SAVE_SETTINGS_MEN (//)
+Save Settings
+;
+MSG_SAVE_SETTINGS_AS_MEN (//)
+Save Settings As...
+;
+;
+MSG_ABOUT_TEXT (//)
+%s\n\
+A Music Module Processing Utility\n\n\
+\
+%s\n\
+All rights reserved.\n\n\
+\
+Internet: bernie@shock.cosmos.it\n\n\
+FidoNet:  2:332/118.4\n\
+\
+Free CHIP Memory: %ldKB\n\
+Free FAST Memory: %ldKB\n\n\
+Public Screen: %s\n\
+ARexx Port: %s\n\
+Cx HotKey: %s\n\
+Language: %s
+;
+MSG_DEFAULT (//)
+-- Default --
+;
+MSG_DISABLED (//)
+-- Disabled --
+;
+;
+; *********************************
+; * Strings for OptimizationWin.c *
+; *********************************
+;
+MSG_OPTIMIZATION_TITLE (//)
+Module Optimization
+;
+;
+MSG_OPTIMIZE_GAD (//)
+_Optimize
+;
+MSG_REM_UNUSED_PATTS_GAD (//)
+Remove Unused _Patterns
+;
+MSG_REM_DUPLICATE_PATTS_GAD (//)
+Remove _Duplicate Patterns
+;
+MSG_REM_UNUSED_INSTR_GAD (//)
+Remove Unused _Instruments
+;
+MSG_REM_DUP_INSTR_GAD (//)
+Remove Duplicate I_nstruments
+;
+MSG_CUT_AFTER_LOOP_GAD (//)
+Cut Instruments After _Loop
+;
+MSG_CUT_ZERO_TAILS_GAD (//)
+Cut Instrument _Zero Tails
+;
+MSG_CUT_PATTERNS_GAD (//)
+Cut _Breaked Patterns
+;
+MSG_REMAP_INSTRUMENTS_GAD (//)
+_Remap Instruments
+;
+;
+MSG_SAVED_X_BYTES (//)
+Saved %ld bytes (%ld%%)
+;
+;
+; **************************
+; * Strings for PrefsWin.c *
+; **************************
+;
+;
+MSG_PREFS_TITLE (//)
+User Interface Settings
+;
+;
+MSG_PUBLIC_SCREEN_GAD (//)
+_Public Screen
+;
+MSG_DISPLAY_MODE_GAD (//)
+Display _Mode
+;
+MSG_WINDOW_FONT_GAD (//)
+_Window Font
+;
+MSG_LISTVIEW_FONT_GAD (//)
+_ListView Font
+;
+MSG_REQUESTERS_GAD (//)
+_Requesters
+;
+MSG_USE_DATATYPES_GAD (//)
+Use _DataTypes
+;
+MSG_APPICON_GAD (//)
+Put App_Icon
+;
+MSG_REFRESH_GAD (//)
+Refres_h
+;
+MSG_LOG_TO_FILE_GAD (//)
+Log To File
+;
+MSG_LOG_LEVEL_GAD (//)
+_Log Level
+;
+MSG_ASK_AUTOSAVE_GAD (//)
+Confirm _Autosave
+;
+MSG_AUTOSAVE_TIME_GAD (//)
+Autosave Mi_nutes
+;
+MSG_DO_BACKUPS_GAD (//)
+Create _Backups
+;
+MSG_BACKUP_TEMPLATE_GAD (//)
+Bac_kup Template
+;
+MSG_BACKUP_VERSIONS_GAD (//)
+Backup _Versions
+;
+MSG_ASL_GAD (//)
+Asl
+;
+MSG_REQTOOLS_GAD (//)
+ReqTools
+;
+MSG_SMART_GAD (//)
+Smart
+;
+MSG_SIMPLE_GAD (//)
+Simple
+;
+MSG_CLONE_DEF_SCREEN (//)
+--Clone Default Screen--
+;
+;
+; ****************************
+; * Strings for PatternWin.c *
+; ****************************
+;
+MSG_PATTERN_TITLE (//)
+Pattern Editor
+;
+;
+MSG_PATTERNS_MEN (//)
+Patterns
+;
+MSG_SIZE_MEN (//)
+Size...
+;
+MSG_EDIT_MEN (//)
+Edit
+;
+MSG_MARK_MEN (//)
+Mark
+;
+MSG_CUT_MEN (//)
+Cut
+;
+MSG_COPY_MEN (//)
+Copy
+;
+MSG_PASTE_MEN (//)
+Paste
+;
+MSG_ERASE_MEN (//)
+Erase
+;
+MSG_UNDO_MEN (//)
+Undo
+;
+MSG_REDO_MEN (//)
+Redo
+;
+MSG_EDITOR_SETTINGS_MEN (//)
+Editor Settings...
+;
+;
+; ***************************
+; * Strings for SaversWin.c *
+; ***************************
+;
+MSG_SAVERS_TITLE (//)
+Savers
+;
+;
+MSG_SF_SEQUENCE_GAD (//)
+Se_quence
+;
+MSG_SF_INSTRUMENTS_GAD (//)
+_Instruments
+;
+MSG_SF_PATTERNS_GAD (//)
+_Patterns
+;
+MSG_SF_NAMES_GAD (//)
+Names
+;
+MSG_ADD_ICON_GAD (//)
+Add I_con
+;
+MSG_MODE_GAD (//)
+_Mode
+;
+MSG_OPTIONS_DOTS_GAD (//)
+Options...
+;
+MSG_NONE_GAD (//)
+None
+;
+MSG_XPK_GAD (//)
+XPK
+;
+MSG_LHA_GAD (//)
+LhA
+;
+;
+MSG_DESCRIPTION (//)
+Description
+;
+MSG_AUTHOR (//)
+Author
+;
+MSG_MAXLENGTH (//)
+Max Length
+;
+MSG_MAXTRACKS (//)
+Max Tracks
+;
+MSG_MAXINSTRUMENTS (//)
+Max Instruments
+;
+MSG_MAXPATTERNS (//)
+Max Patterns
+;
+MSG_MAXPATTLEN (//)
+Max Pattern Length
+;
+MSG_MAXSAMPLELEN (//)
+Max Sample Length
+;
+;
+; **********************
+; * Strings ClearWin.c *
+; **********************
+;
+MSG_CLEAR_TITLE (//)
+Clear Module
+;
+;
+MSG_CLR_SEQUENCE_GAD (//)
+_Sequence
+;
+MSG_CLR_INSTRUMENTS_GAD (//)
+_Instruments
+;
+MSG_CLR_PATTERNS_GAD (//)
+_Patterns
+;
+MSG_CLEARMOD_GAD (//)
+_Clear
+;
+;
+; ***************************
+; * Strings for SampleWin.c *
+; ***************************
+;
+MSG_SAMPLE_TITLE (//)
+Sample Editor
+;
+;
+MSG_RENDER_MEN (//)
+Render
+;
+MSG_POINTS_MEN (//)
+Points
+;
+MSG_LINES_MEN (//)
+Lines
+;
+MSG_FILLED_MEN (//)
+Filled
+;
+;
+; *****************************
+; * Strings for PattSizeWin.c *
+; *****************************
+;
+MSG_PATTSIZE_TITLE (//)
+Pattern Attributes
+;
+;
+MSG_LINES_GAD (//)
+_Lines
+;
+MSG_TRACKS_GAD (//)
+_Tracks
+;
+MSG_DOUBLE_GAD (//)
+_Double
+;
+MSG_HALVE_GAD (//)
+_Halve
+;
+;
+; *************************
+; * Strings for Library.c *
+; *************************
+;
+MSG_SONG_TOO_MANY_TRACKS (//)
+WARNING: The selected saver supports max %lu tracks, but the song has %lu tracks.
+;
+MSG_SONG_TOO_MANY_PATTS (//)
+WARNING: The selected saver supports max %lu patterns; the song has %lu patterns.
+;
+MSG_SONG_TOO_MANY_INSTRS (//)
+WARNING: The selected saver supports max %lu instruments, last instrument is %lu.
+;
+MSG_SONG_TOO_MANY_POS (//)
+WARNING: The selected saver supports max %lu positions, but the song has %lu positions.
+;
+MSG_PATT_LENGTH_INVALID (//)
+WARNING: The length of pattern %ld ($%lx lines) isn't allowed with the selected saver.
+;
+MSG_INSTR_TOO_LONG (//)
+WARNING: Instrument %lx is too long and will be cropped to %lu bytes.
+;
+MSG_WILL_MODIFY_SONG (//)
+Some modifications need to be performed on this song\n\
+in order to adapt it to the limitations of the\n\
+destination format.
+;
+MSG_TRY_REMAPPING_INSTRUMENTS (//)
+Some instruments are placed beyond the limit for\n\
+the selected format.\n\
+Remapping the instruments now could help saving\n\
+all them along with the selected format.
+;
+MSG_SAVING_MODULE (//)
+Saving %s module \"%s\"...
+; the first %s is the format name, the second %s is the song name.
diff --git a/ClearWin.c b/ClearWin.c
new file mode 100644 (file)
index 0000000..0d217cd
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+**     ClearWin.c
+**
+**     Copyright (C) 1994,95,96 Bernardo Innocenti
+**
+**     Clear panel handling functions.
+*/
+
+#include <intuition/intuition.h>
+#include <intuition/gadgetclass.h>
+#include <libraries/gadtools.h>
+
+#include <proto/exec.h>
+#include <proto/intuition.h>
+#include <proto/gadtools.h>
+#include <proto/xmodule.h>
+
+#include "XModulePriv.h"
+#include "Gui.h"
+
+
+
+/* Gadgets IDs */
+
+enum {
+       GD_ClearGroup0,
+               GD_ClearGroup1,
+                       GD_ClearSequence,
+                       GD_ClearInstruments,
+                       GD_ClearPatterns,
+               GD_ClearPerform,
+
+       Clear_CNT
+};
+
+
+/*****************************/
+/* Local function prototypes */
+/*****************************/
+
+static void ClearPerformClicked (struct WinUserData *wud);
+
+
+
+
+XDEF struct ClearSwitches ClearSwitches = { 1, 1, 1 };
+
+
+
+static LONG ClearArgs[] =
+{
+       VGROUP_KIND, BBFT_RIDGE,
+               CHECKBOX_KIND,  NULL,   MSG_CLR_SEQUENCE_GAD,           (LONG)&ClearSwitches.ClearSeq,          TAG_DONE,
+               CHECKBOX_KIND,  NULL,   MSG_CLR_INSTRUMENTS_GAD,        (LONG)&ClearSwitches.ClearInstr,        TAG_DONE,
+               CHECKBOX_KIND,  NULL,   MSG_CLR_PATTERNS_GAD,           (LONG)&ClearSwitches.ClearPatt, TAG_DONE,
+               ENDGROUP_KIND,
+       BUTTON_KIND,    (LONG)ClearPerformClicked,      MSG_CLEARMOD_GAD,       TAG_DONE,
+       ENDGROUP_KIND
+};
+
+
+
+XDEF LONG ClearWinTags[] =
+{
+       XMWIN_LayoutArgs,       (LONG)ClearArgs,
+       XMWIN_GCount,           Clear_CNT,
+       XMWIN_Title,            MSG_CLEAR_TITLE,
+       XMWIN_WindowFlags,      WFLG_CLOSEGADGET,
+       XMWIN_IDCMPFlags,       CHECKBOXIDCMP | BUTTONIDCMP | IDCMP_CLOSEWINDOW | IDCMP_REFRESHWINDOW,
+       XMWIN_HelpNode,         (LONG)"Clear",
+       TAG_DONE
+};
+
+
+
+GLOBALCALL void UpdateClearSwitches (void)
+{
+       struct WinUserData *wud = WDescr[WID_CLEAR].Wud;
+
+       if (wud && wud->Win)
+               SetGadgets (wud,
+                       GD_ClearSequence,               ClearSwitches.ClearSeq,
+                       GD_ClearInstruments,    ClearSwitches.ClearInstr,
+                       GD_ClearPatterns,               ClearSwitches.ClearPatt,
+                       -1);
+}
+
+
+/*****************/
+/* Clear Gadgets */
+/*****************/
+
+static void ClearPerformClicked (struct WinUserData *wud)
+{
+       struct SongInfo *si;
+       LONG i;
+
+       if (si = xmLockActiveSong (SM_EXCLUSIVE))
+       {
+               if (ClearSwitches.ClearPatt)
+               {
+                       for (i = si->NumPatterns - 1 ; i >= 0 ; i--)
+                               xmRemPattern (si, i, 0);
+
+                       xmAddPatternA (si, NULL);
+               }
+
+               if (ClearSwitches.ClearInstr)
+               {
+                       for (i = 1 ; i <= si->LastInstrument ; i++)
+                               xmRemInstrument (si, i);
+               }
+
+               if (ClearSwitches.ClearSeq)
+               {
+                       xmSetSongLen (si, 1);
+                       si->Sequence[0] = 0;
+               }
+
+               ReleaseSemaphore (&si->Lock);
+       }
+
+       UpdateSongInfo();
+       MyCloseWindow (wud);
+}
diff --git a/CompilerSpecific.h b/CompilerSpecific.h
new file mode 100644 (file)
index 0000000..6041ece
--- /dev/null
@@ -0,0 +1,304 @@
+#ifndef COMPILERSPECIFIC_H
+#define COMPILERSPECIFIC_H
+/*
+**     $VER: CompilerSpecific.h 2.3 (26.10.97)
+**
+**     Copyright (C) 1997 Bernardo Innocenti. All rights reserved.
+**
+**     Compiler specific definitions is here. You can add support
+**     for other compilers in this header. Please return any changes
+**     you make to me, so I can add them to my personal copy of this file.
+**
+**     Here is a short description of the macros defined below:
+**
+**     LIBCALL
+**             Shared library entry point, with register args
+**
+**     HOOKCALL
+**             Hook or boopsi dispatcher entry point with arguments
+**             passed in registers
+**
+**     GLOBALCALL
+**             Attribute for functions to be exported to other modules for
+**             global access within the same executable file.
+**             Usually defined to "extern", but can be overridden for special
+**             needs, such as compiling all modules together in a single
+**             object module to optimize code better.
+**
+**     XDEF
+**             Attribute for symbols to be exported to other modules for
+**             global access within the same executable file.
+**             Usually defined to an empty value.
+**
+**     XREF
+**             Attribute for symbols to be imported from other modules
+**             within the same executable file.
+**             Usually defined to "extern".
+**
+**     INLINE
+**             Please put function body inline to the calling code
+**
+**     STDARGS
+**             Function uses standard C conventions for arguments
+**
+**     ASMCALL
+**             Function takes arguments in the specified 68K registers
+**
+**     REGCALL
+**             Function takes arguments in registers choosen by the compiler
+**
+**     CONSTCALL
+**             Function does not modify any global variable
+**
+**     FORMATCALL(archetype,string_index,first_to_check)
+**             Function uses printf or scanf-like formatting
+**
+**     SAVEDS
+**             Function needs to reload context for small data model
+**
+**     INTERRUPT
+**             Function will be called from within an interrupt
+**
+**     NORETURN
+**             Function does never return
+**
+**     ALIGNED
+**             Variable must be aligned to longword boundaries
+**
+**     CHIP
+**             Variable must be stored in CHIP RAM
+**
+**     REG(reg,arg)
+**             Put argument <arg> in 68K register <reg>
+**
+**     min(a,b)
+**             Return the minimum between <a> and <b>
+**
+**     max(a,b)
+**             Return the maximum between <a> and <b>
+**
+**     abs(a)
+**             Return the absolute value of <a>
+**
+**     _COMPILED_WITH
+**             A string containing the name of the compiler
+*/
+
+#ifdef __SASC
+       /* SAS/C 6.58 or better */
+
+       #define INLINE          static __inline
+       #define STDARGS         __stdargs
+       #define ASMCALL         __asm
+       #define REGCALL         __regcall
+       #define CONSTCALL       /* unsupported */
+       #define FORMATCALL      /* unsupported */
+       #define SAVEDS          __saveds
+       #define INTERRUPT       __interrupt
+       #define NORETURN        /* unsupported */
+       #define ALIGNED         __aligned
+       #define CHIP            __chip
+       #define REG(reg,arg) register __##reg arg
+       #define _COMPILED_WITH  "SAS/C"
+
+       /* For min(), max() and abs() */
+       #define USE_BUILTIN_MATH
+       #include <string.h>
+#else
+#ifdef __GNUC__
+       /* GeekGadgets GCC 2.7.2.1 or better */
+
+       #define INLINE          static inline
+       #define STDARGS         __attribute__((stkparm))
+       #define ASMCALL         /* nothing */
+       #define REGCALL         /* nothing */
+       #define CONSTCALL       __attribute__((const))
+       #define FORMATCALL(a,s,f)       __attribute__((format(a,s,f)))
+       #define SAVEDS          __attribute__((saveds))
+       #define INTERRUPT       __attribute__((interrupt))
+       #define NORETURN        __attribute__((noreturn))
+       #define ALIGNED         __attribute__((aligned(4)))
+       #define REG(reg,arg) arg __asm(#reg)
+       #define _COMPILED_WITH  "GCC"
+
+       #define min(a,b)        (((a)<(b))?(a):(b))
+       #define max(a,b)        (((a)>(b))?(a):(b))
+       #define abs(a)          (((a)>0)?(a):-(a))
+
+       /* Inline versions of some str*() and mem*() functions
+        */
+       #define _ANSI_SOURCE
+       #include <string.h>
+       #undef _ANSI_SOURCE
+
+       INLINE STDARGS size_t strlen (const char *src)
+               { const char *tmp = src; while (*tmp) tmp++; return tmp - src; }
+
+       INLINE STDARGS int memcmp (const void *src, const void *dest, size_t n)
+       {
+               while (n--)
+               {
+                       if (*((char *)src) != *((char *)dest))
+                               return (*((char *)src) - *((char *)dest));
+                       ((char *)src)++;
+                       ((char *)dest)++;
+               }
+               return 0;
+       }
+
+       INLINE STDARGS void * memset (void *m, int c, size_t n)
+       {
+               void *r = m;
+               n++;
+               while (--n > 0)
+                       *(((unsigned char *) m)++) = (unsigned char) c;
+               return r;
+       }
+
+       /* GCC produces code which calls these two functions
+        * to initialize and copy structures and arrays.
+        *
+        *      INLINE STDARGS void bzero (void *buf, size_t len)
+        *              { while (len--) *((char *)buf)++ = 0; }
+        *
+        *      INLINE STDARGS void bcopy (const void *src, void *dest, size_t len)
+        *              { while (len--) *((char *)dest)++ = *((const char *)src)++; }
+        */
+
+#else
+#ifdef __STORM__
+       /* StormC 2.00.23 or better */
+       #define INLINE          __inline
+       #define STDARGS         /* nothing */
+       #define ASMCALL         /* nothing */
+       #define REGCALL         register
+       #define CONSTCALL       /* unsupported */
+       #define FORMATCALL      /* unsupported */
+       #define SAVEDS          __saveds
+       #define INTERRUPT       __interrupt
+       #define NORETURN        /* unsupported */
+       #define ALIGNED         /* unsupported */
+       #define CHIP            __chip
+       #define REG(reg,arg) register __##reg arg
+       #define _COMPILED_WITH  "StormC"
+
+       #define min(a,b)        (((a)<(b))?(a):(b))
+       #define max(a,b)        (((a)>(b))?(a):(b))
+       #define abs(a)          (((a)>0)?(a):-(a))
+
+       #define _INLINE_INCLUDES
+       #include <string.h>
+#else
+#ifdef __MAXON__
+       /* Maxon C/C++ 3.0 */
+
+       #define INLINE          static inline
+       #define STDARGS         /* ? */
+       #define ASMCALL         /* ? */
+       #define REGCALL         /* ? */
+       #define CONSTCALL       /* unsupported */
+       #define FORMATCALL      /* unsupported */
+       #define SAVEDS          /* unsupported */
+       #define INTERRUPT       /* unsupported */
+       #define NORETURN        /* unsupported */
+       #define ALIGNED         /* unsupported */
+       #define REG(reg,arg)    register __##reg arg
+       #define _COMPILED_WITH  "Maxon C"
+
+       /* For min(), max() and abs() */
+       #define USE_BUILTIN_MATH
+       #include <string.h>
+
+       #error Maxon C compiler support is untested. Please check all the above definitions
+#else
+#ifdef _DCC
+       /* DICE C 3.15 */
+
+       #define INLINE          static __inline
+       #define STDARGS         __stdargs
+       #define ASMCALL         /* nothing */
+       #define REGCALL         /* ? */
+       #define CONSTCALL       /* unsupported */
+       #define FORMATCALL      /* unsupported */
+       #define SAVEDS          __geta4
+       #define INTERRUPT       /* unsupported */
+       #define NORETURN        /* unsupported */
+       #define ALIGNED         __aligned
+       #define REG(reg,arg)    __##reg arg
+       #define _COMPILED_WITH  "DICE"
+
+       #define min(a,b)        (((a)<(b))?(a):(b))
+       #define max(a,b)        (((a)>(b))?(a):(b))
+       #define abs(a)          (((a)>0)?(a):-(a))
+
+       #error DICE compiler support is untested. Please check all the above definitions
+#else
+#ifdef AZTEC_C
+       /* Aztec/Manx C */
+
+       #define INLINE          static
+       #define STDARGS         /* ? */
+       #define ASMCALL         /* ? */
+       #define REGCALL         /* ? */
+       #define CONSTCALL       /* unsupported */
+       #define FORMATCALL      /* unsupported */
+       #define SAVEDS          __geta4
+       #define INTERRUPT       /* unsupported */
+       #define NORETURN        /* unsupported */
+       #define ALIGNED         __aligned
+       #define REG(reg,arg)    __##reg arg
+       #define _COMPILED_WITH  "Manx C"
+
+       #define min(a,b)        (((a)<(b))?(a):(b))
+       #define max(a,b)        (((a)>(b))?(a):(b))
+       #define abs(a)          (((a)>0)?(a):-(a))
+
+       #error Aztec/Manx C compiler support is untested. Please check all the above definitions
+#else
+       #error Please add compiler specific definitions for your compiler
+#endif
+#endif
+#endif
+#endif
+#endif
+#endif
+
+
+/* CONST_STRPTR is a typedef made by a patched version of <exec/types.h>.
+ * Passing "const char *" parameters will only work if the OS protos are
+ * patched accordingly, otherwise you will get a lot of compiler warnings
+ * for const to volatile conversions.
+ *
+ * Using "const" where it is appropriate helps the compiler optimizing
+ * code better, so this mess is probably worth it. I wish one day the OS
+ * headers will come with support for the const keyword.
+ */
+#ifndef _CONST_STRPTR_DEFINED
+typedef char *CONST_STRPTR;
+#endif
+
+
+/* Special function attributes */
+
+#define LIBCALL                ASMCALL SAVEDS
+#define HOOKCALL       ASMCALL SAVEDS
+#ifdef __cplusplus
+       #define GLOBALCALL extern "C"
+#else
+       #define GLOBALCALL
+#endif
+
+/* special variable attributes */
+#define XDEF
+#define XREF extern
+
+
+/* AROS Compatibility: IPTR is a type which can store a pointer
+ * as well as a long integer.
+ */
+#ifndef IPTR
+#define IPTR LONG
+#endif /* IPTR */
+
+
+#endif /* !COMPILERSPECIFIC_H */
diff --git a/Compress.c b/Compress.c
new file mode 100644 (file)
index 0000000..5ba53e6
--- /dev/null
@@ -0,0 +1,269 @@
+/*
+**     Compress.c
+**
+**     Copyright (C) 1994,96,97 Bernardo Innocenti
+**
+**     Compression/Decompression handling functions.
+*/
+
+#include <exec/memory.h>
+#include <utility/hooks.h>
+#include <xpk/xpk.h>
+
+#include <proto/exec.h>
+#include <proto/dos.h>
+#include <proto/powerpacker.h>
+#include <proto/xpkmaster.h>
+#include <proto/xmodule.h>
+
+#include "XModulePriv.h"
+#include "Gui.h"
+
+
+#define CTYPE_LHA              1
+#define CTYPE_XPK              2
+#define CTYPE_POWERPACKER      3
+
+
+/* static struct Library *PPBase = NULL; */
+static struct Library *XpkBase = NULL;
+
+
+XDEF UBYTE LhACommand[64] = "LhA >NIL: e -x0 -q \"%s\"";
+XDEF UBYTE TmpDir[PATHNAME_MAX] = "T:XModuleTmp";
+XDEF UBYTE LhAFilter[64] = "~(#?readme#?|#?txt#?|#?display#?|#?fileid#?)";
+
+
+
+static LONG HOOKCALL XPKProgressFunc (REG(a0,struct Hook *hook), REG(a1,struct XpkProgress *pr))
+{
+       return (DisplayProgress (pr->xp_UCur, pr->xp_ULen));
+}
+
+
+
+static struct Hook XPKProgressHook =
+{
+       { NULL, NULL },
+       XPKProgressFunc,
+       NULL,
+       0
+};
+
+
+
+GLOBALCALL BPTR DecompressFile (CONST_STRPTR name, UWORD type)
+
+/* This function will try to decompress the given file and store
+ * it in TmpDir.  If TmpDir does not exist, it will be created.
+ * The decompressed file is then locked and returned.
+ * A return value of NULL means failure.  Call DecompressFileDone()
+ * when you are done with the decompressed file.
+ */
+{
+       struct AnchorPath *ap;
+       BPTR ret = 0;
+       BPTR dir, olddir;
+       LONG err = 0;
+       UBYTE FullName[PATHNAME_MAX];
+
+
+       OpenProgressWindow();
+
+       DisplayAction (MSG_DECRUNCHING);
+
+       /* Find the full path name of the given file */
+       {
+               BPTR lock;
+
+               if (lock = Lock (name, ACCESS_READ))
+               {
+                       if (!NameFromLock (lock, FullName, PATHNAME_MAX))
+                               err = IoErr();
+                       UnLock (lock);
+               }
+               else err = IoErr();
+       }
+
+       if (!err)
+       {
+               /* Try to lock or create TmpDir */
+
+               if (!(dir = Lock (TmpDir, ACCESS_READ)))
+               {
+                       if (dir = CreateDir (TmpDir))
+                               if (!(ChangeMode (CHANGE_LOCK, dir, ACCESS_READ)))
+                               {
+                                       UnLock (dir);
+                                       dir = NULL;
+                               }
+               }
+
+               if (dir)
+               {
+                       olddir = CurrentDir (dir);
+
+                       switch (type)
+                       {
+                               case CTYPE_LHA:
+                               {
+                                       UBYTE buf[64+PATHNAME_MAX];
+
+                                       SPrintf (buf, LhACommand, FullName);
+                                       if (!SystemTagList (buf, NULL))
+                                       {
+                                               if (ap = AllocMem (sizeof (struct AnchorPath) + PATHNAME_MAX, MEMF_CLEAR))
+                                               {
+                                                       ap->ap_Strlen = PATHNAME_MAX;
+
+                                                       if (!(err = MatchFirst (LhAFilter, ap)))
+                                                       {
+                                                               if (!(ret = Lock (ap->ap_Buf, ACCESS_READ)))
+                                                                       err = IoErr();
+                                                       }
+
+                                                       MatchEnd (ap);
+                                                       FreeMem (ap, sizeof (struct AnchorPath) + PATHNAME_MAX);
+                                               }
+                                               else err = ERROR_NO_FREE_STORE; /* Fail AllocMem() */
+
+                                       }
+                                       else err = IoErr(); /* Fail SystemTagList() */
+
+                                       break;
+                               }
+
+                               case CTYPE_XPK:
+                               {
+                                       UBYTE dest[PATHNAME_MAX];
+                                       UBYTE errstring[XPKERRMSGSIZE];
+
+                                       if (!(XpkBase = OpenLibrary ("xpkmaster.library", 2L)))
+                                       {
+                                               CantOpenLib ("xpkmaster.library", 2L);
+                                               CloseProgressWindow();
+                                               return 0;
+                                       }
+
+                                       strcpy (dest, TmpDir);
+                                       if (AddPart (dest, "XPKTmp", PATHNAME_MAX))
+                                       {
+                                               if (XpkUnpackTags (
+                                                       XPK_InName,             FullName,
+                                                       XPK_OutName,    dest,
+                                                       XPK_GetError,   errstring,
+                                                       XPK_ChunkHook,  &XPKProgressHook,
+                                                       // XPK_TaskPri, ThisTask->pr_Task.tc_Node.ln_Pri-1,
+                                                       TAG_DONE))
+                                               {
+                                                       xmDisplayMessage (XMDMF_ERROR | XMDMF_USECATALOG,
+                                                               (APTR)MSG_ERROR_DECOMPRESSING, FilePart (FullName),
+                                                               errstring);
+                                               }
+                                               else ret = Lock (dest, ACCESS_READ);
+                                       }
+
+                                       CloseLibrary (XpkBase); XpkBase = NULL;
+                                       break;
+                               }
+
+/*                             case CTYPE_POWERPACKER:
+
+                                       if (!(PPBase = OpenLibrary ("powerpacker.library", 0L)))
+                                       {
+                                               CantOpenLib ("powerpacker.library", 0L);
+                                               CloseProgressWindow();
+                                               return 0;
+                                       }
+
+                                       xmDisplayMessageA (XMDMF_INFORMATION,
+                                               "PowerPacker compressed files are not supported yet.", NULL);
+
+                                       CloseLibrary (PPBase); PPBase = NULL;
+*/
+                               default:
+                                       break;
+                       }
+
+                       CurrentDir (olddir);
+                       UnLock (dir);
+               }
+               else err = IoErr(); /* Fail CreateDir() */
+       }
+
+       /* Report error */
+
+       if (err)
+       {
+               if (err == ERROR_NO_MORE_ENTRIES)
+                       xmDisplayMessage (XMDMF_ERROR | XMDMF_USECATALOG,
+                               (APTR)MSG_NOTHING_IN_ARC, name);
+               else
+                       xmDisplayMessageA (XMDMF_DOSFAULT | XMDMF_USECATALOG,
+                               (APTR)MSG_CANT_LOAD_COMPRESSED, NULL);
+       }
+
+       if (!ret) DecompressFileDone();
+
+       CloseProgressWindow();
+
+       return ret;
+}
+
+
+
+GLOBALCALL void DecompressFileDone (void)
+
+/* This call releases all resources got by DecompressFile(). */
+{
+       BPTR dir, olddir;
+       struct FileInfoBlock *fib;
+
+       if (dir = Lock (TmpDir, ACCESS_READ))
+       {
+               olddir = CurrentDir (dir);
+
+               if (fib = AllocDosObject (DOS_FIB, NULL))
+               {
+                       if (Examine (dir, fib))
+                       {
+                               /* Delete all files in the temp directory */
+                               while (ExNext (dir, fib))
+                                       DeleteFile (fib->fib_FileName);
+                       }
+
+                       FreeDosObject (DOS_FIB, fib);
+               }
+
+               CurrentDir (olddir);
+               UnLock (dir);
+       }
+
+       DeleteFile (TmpDir);
+}
+
+
+
+GLOBALCALL LONG CruncherType (BPTR file)
+{
+       union
+       {
+               LONG fileid;
+               struct
+               {
+                       UWORD dummy;
+                       ULONG prefix;
+               } lha;
+       } id;
+
+       if (Read (file, &id, sizeof (id)) != sizeof (id))
+               return 0;
+
+       if ((id.lha.prefix >> 8) == '-lh')
+               return CTYPE_LHA;
+
+       if (id.fileid == 'XPKF' || id.fileid == 'PP20' || id.fileid == 'PX20')
+               return CTYPE_XPK;
+
+       return 0;
+}
diff --git a/CustomClasses.c b/CustomClasses.c
new file mode 100644 (file)
index 0000000..f70a1d5
--- /dev/null
@@ -0,0 +1,626 @@
+/*
+**     CustomClasses.c
+**
+**     Copyright (C) 1995,96,97 Bernardo Innocenti
+**
+**     Special custom BOOPSI classes.
+*/
+
+#include <exec/memory.h>
+#include <utility/tagitem.h>
+#include <graphics/gfxbase.h>
+#include <devices/inputevent.h>
+
+#include <intuition/intuition.h>
+#include <intuition/classes.h>
+#include <intuition/classusr.h>
+#include <intuition/gadgetclass.h>
+#include <intuition/icclass.h>
+#include <intuition/imageclass.h>
+
+#include <proto/exec.h>
+#include <proto/graphics.h>
+#include <proto/intuition.h>
+#include <proto/utility.h>
+
+#include "CustomClasses.h"
+#include "XModulePriv.h"
+#include "Gui.h"
+
+/* Per object instance data */
+struct ScrollButtonData
+{
+       /* The number of ticks we still have to wait
+        * before sending any notification.
+        */
+       ULONG TickCounter;
+};
+
+
+
+/* Function prototypes */
+
+static LIBCALL ULONG ScrollButtonDispatcher (
+       REG(a0, Class *cl),
+       REG(a2, struct Gadget *g),
+       REG(a1, struct gpInput *gpi));
+
+static ULONG HOOKCALL VImageDispatcher (
+       REG(a0, Class *cl),
+       REG(a2, struct Image *im),
+       REG(a1, struct opSet *ops));
+
+static void NotifyAttrChanges  (Object *o, struct GadgetInfo *gi, ULONG flags, Tag attr1, ...);
+static void DrawPlayImage              (struct RastPort *rp, UWORD width, UWORD heigth);
+static void DrawStopImage              (struct RastPort *rp, UWORD width, UWORD heigth);
+static void DrawForwardImage   (struct RastPort *rp, UWORD width, UWORD heigth);
+static void DrawRewindImage            (struct RastPort *rp, UWORD width, UWORD heigth);
+static void DrawPickImage              (struct RastPort *rp, UWORD width, UWORD height);
+static void DrawVImage                 (struct impDraw *imp, struct Image *im, struct BitMap *bm);
+
+
+
+/* tagcall stub for OM_NOTIFY */
+static void NotifyAttrChanges (Object *o, struct GadgetInfo *gi, ULONG flags, Tag attr1, ...)
+{
+       DoSuperMethod (OCLASS(o), o, OM_NOTIFY, &attr1, gi, flags);
+}
+
+
+/*
+**     ScrollButtonClass
+**
+**     Parts of the code have been inspired by ScrollerWindow 0.3 demo
+**     Copyright © 1994 Christoph Feck, TowerSystems.
+**
+**     Subclass of buttongclass.  The ROM class has two problems, which make
+**     it not quite usable for scrollarrows.  The first problem is the missing
+**     delay.  Once the next INTUITICK gets send by input.device, the ROM
+**     class already sends a notification.  The other problem is that it also
+**     notifies us, when the button finally gets released (which is necessary
+**     for command buttons).
+**
+**     We define a new class with the GM_GOACTIVE and GM_HANDLEINPUT method
+**     overloaded to work around these problems.
+*/
+
+static LIBCALL ULONG ScrollButtonDispatcher (
+       REG(a0, Class *cl),
+       REG(a2, struct Gadget *g),
+       REG(a1, struct gpInput *gpi))
+
+/* ScrollButton Class Dispatcher entrypoint.
+ * Handle BOOPSI messages.
+ */
+{
+       struct ScrollButtonData *bd = (struct ScrollButtonData *) INST_DATA(cl, g);
+
+       switch (gpi->MethodID)
+       {
+               case GM_GOACTIVE:
+                       /* May define an attribute to make delay configurable */
+                       bd->TickCounter = 3;
+
+                       /* Notify our target that we have initially hit. */
+                       NotifyAttrChanges ((Object *)g, gpi->gpi_GInfo, 0,
+                               GA_ID, g->GadgetID,
+                               TAG_DONE);
+
+                       /* Send more input */
+                       return GMR_MEACTIVE;
+
+               case GM_HANDLEINPUT:
+               {
+                       struct RastPort *rp;
+                       ULONG retval = GMR_MEACTIVE;
+                       UWORD selected = 0;
+
+                       /* This also works with classic (non-boopsi) images. */
+                       if (PointInImage ((gpi->gpi_Mouse.X << 16) + (gpi->gpi_Mouse.Y), g->GadgetRender))
+                       {
+                               /* We are hit */
+                               selected = GFLG_SELECTED;
+                       }
+
+                       if (gpi->gpi_IEvent->ie_Class == IECLASS_RAWMOUSE && gpi->gpi_IEvent->ie_Code == SELECTUP)
+                       {
+                               /* Gadgetup, time to go */
+                               retval = GMR_NOREUSE;
+                               /* Unselect the gadget on our way out... */
+                               selected = 0;
+                       }
+                       else if (gpi->gpi_IEvent->ie_Class == IECLASS_TIMER)
+                       {
+                               /* We got a tick.  Decrement counter, and if 0, send notify. */
+
+                               if (bd->TickCounter) bd->TickCounter--;
+                               else if (selected)
+                               {
+                                       NotifyAttrChanges ((Object *) g, gpi->gpi_GInfo, 0,
+                                               GA_ID, g->GadgetID,
+                                               TAG_DONE);
+                               }
+                       }
+
+                       if ((g->Flags & GFLG_SELECTED) != selected)
+                       {
+                               /* Update changes in gadget render */
+                               g->Flags ^= GFLG_SELECTED;
+                               if (rp = ObtainGIRPort (gpi->gpi_GInfo))
+                               {
+                                       DoMethod ((Object *) g, GM_RENDER, gpi->gpi_GInfo, rp, GREDRAW_UPDATE);
+                                       ReleaseGIRPort (rp);
+                               }
+                       }
+                       return retval;
+               }
+
+               default:
+                       /* Super class handles everyth