++ ++ Hello ByteRaver, ++ ++ 8bitbubsy typing here. Your MODFIL11.TXT is probably ++ great, but let me fix some errors. OK, let's go! ++ plusplus (++) means MY adds to the lines. ++ ++ http://www.16-bits.org ++ // For more info -> erlandvo@hotmail.com // Hello Thunder, // // ByteRaver / TNT / NO_ID aka Erland Van Olmen (erlandvo@hotmail.com) // typing here. Your MODFIL10.TXT file was a *GREAT* help for me (my // .MOD loader is now better than the one of FT2, CP 2.0 or Inertia // Player! ;) still, while I was programming, I made some corrections and // completed the text here and there. You might as well find it usefull, // even if the original file was released quite some time ago... // Anyway, each time you see "//", it's an annotation from me. // BTW, I wrote a MOD player for the GUS as well as for the SoundBlaster // PRO II (Interpolation & volume amplify are provided for better sound // quality); the source code has been released through Hornet. // (www.hornet.org, file tnt-mp??.zip, first file was tnt-mp10.zip) A DOC // describing the principles of digital mixing is included. // Source code of the player is Pascal, only the mixer is written in 386+ // Real mode assembler. // // Bye, sorry for my awful English, hope to hear from you. // // ByteRaver. MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ Public file MODFIL10.TXT - Version 1.0 - by Thunder Introduction _______________________________ What this file attempts to do is describe the MOD format in detail and elaborate on the 'effects' that are possible. This is the first version of this file, so if there are mistakes (and I expect at least a couple), please let me know. This information was compiled from a variety of sources, many of them anonymous, so I will thank them all, and they hopefully know who they are. I would like to keep this file up to date. It will be posted as 'MODFILxx.TXT' or 'MODFILxx.ZIP', where 'xx' is the version number (MODFIL10.TXT being the first release). I assume that you have some prior knowledge of some 'technical' terms, including: sample, channel (or voice), frequency, logarithmic vs. linear volume, byte, word, long integer, and hexadecimal format. It also assumes that you know something about the machine that you are programming on. If you do not know these things, this file will NOT teach you them. Refer to other sources before going further. I am a PC programmer, so I cannot elaborate on particular procedures, routines, methodologies, or tricks that can be performed on other architechtures. I have written routines for the Gravis UltraSound, which is probably the easiest sound card (on the PC anyway) to write MOD routines for. I disclaim everything in this file. This information is for your use personally, but I don't care if you give it to everyone else on the planet. I would like the file to stay intact, and if you use the information a 'hello' to me in your program's credits would be nice. If the information is wrong or gives you problems or damages your equipment or person, tough luck. I am not responsible for anything you DO with this information. If you have additions, corrections, clarification or questions about this information or this file, you can send them to me through the internet to 'kurt.kennett@gravis.com' or 'kurtt@sfu.ca'. Here is an overview of what is in this file: 1 General 2 File Format 2.1 Song Name 2.2 Sample Information 2.3 Number of patterns in song 2.4 Song end jump position 2.5 Pattern table 2.6 File format tag 2.7 Patterns 2.8 Sample data _______________________________________________________________________ 1 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ 3 Playing the files 3.1 Timing 3.2 Periods 3.3 Fine-Tuning 3.4 Effects 3.5 Other information 4 Period and Volume tables 1.0 General ___________________________________________ Files with the extension '.MOD' are sequenced music files. The file format has it's roots in the Commodore Amiga computer (ugh!). These files use different digital 'samples' played at various frequencies to create three octaves of 'notes' for that sample. In addition to different 'notes', there are a large number of 'effects' which can be done to produce variations on the different notes. There are many variations on the MOD format. Since the format originated on the Commodore Amiga computer, the files were geared towards a machine with 4 voices. These days, with a GUS (Gravis UltraSound), you have 32 independent voices. If you are programming for a sound board or device that has only 1 or 2 digital voices, you will have to mix together the 4 to 8 output channels into those voices. I will not go into this process here, since I do not have experience with it (you don't need to mix on the GUS). If someone would like to mail me a TEXT explaination of how to do the mixing, I will include it in this file. I DO NOT WANT CODE -- learn how to write english. The earliest versions of the MOD format used a maximum of 15 instruments and had 4 channels. Through some modifications in format, a 'newer' standard emerged, with a maximum of 31 instruments and up to 8 channels. You can tell what format of file you are working with by a four-character tag field. The programs that are used to play these files on the Amiga are called 'Noisetracker', 'Soundtracker', and 'Protracker'. // There is also a (well-known) program called 'StarTrekker'. See section // 2.6 (format tag fields) for more info. 2.0 File Format _______________________________ What follows is a description of a file broken down in a field-by-field format. This is just a general description. Please see the following subsections for a detailed description of what each field is and what it means. 'Big-End Word' refers to the word format on the Amiga. A 2-byte integer value is a word. On the Amiga, this value has the internal representation HHLL, where HH means the high-order byte and LL means the low-order byte. The Intel chips (inside PCs) use a LLHH format for their words. This means that if you are writing routines for the PC, you have to flip the high and low order bytes to retrieve meaningful values. _______________________________________________________________________ 2 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ Just to piss off all the C programmers, I'm going to start the file offset at 1 instead of 0. // ?! Something against C programmers ;-) ? (I'm both, but above all C...) +-----------------(in bytes) | v Offset Length Format Description ======== ======== ========= ============= 1 20 Chars Title of the song. If the title is not a full 20 chars in length, it will be null- terminated. 21 22 Chars Sample 1 name. If the name is not a full 22 chars in length, it will be null terminated. 43 2 Big-End Sample 1 length in 2-byte words. Multiply Word this value by 2 to get the length of the sample in bytes. 45 1 SNibble Sample 1 finetune. 46 1 Byte Sample 1 linear volume. 47 2 Big-End Sample 1 repeat offset in 2-byte words. Word Multiply this value by 2 to get the position in bytes. 49 2 Big-End Sample 1 repeat length in 2-byte words. Word Multiply this value by 2 to get the length in bytes. 51 30 Sample 2 information. Same format. 81 30 Sample 3 information Same format. . There will either be 15 or 31 sample information blocks. . See the format tag field below for a description of how . to find out how many instruments there are. We'll go on . the assumption that there are 31 instruments in the file. 921 30 Sample 31 information. 951 1 Byte Number of patterns in SONG as played. 952 1 Byte Song end jump position. 953 128 Bytes Pattern Table. These list up to 128 pattern numbers and the order they should be played in. 1081 4 Chars File format tag. 1085 ... Pattern and Sample data. Please see pattern section and sample section for more information. // The old NST format contains only 15 samples (instead of 31). Further it // doesn't contain a file format tag (id). So Pattern data offset is at // 20+15*30+1+1+128. // If the file looks like plain garbage, e.g. you can't find any valid // sample-size value, sample-name string (should be alfanumeric), ID // field, ... the file may be compressed with PowerPacker 2.0 // To check this, look for the FIRST 4 bytes of the file. If this "string" // reads "PP20" the .MOD file is compressed with PowerPacker... // Use pp20unp.exe to decompress the file (it's included with the source // of my MOD Player, which you can get at: // www.Hornet.org/music/programs/players/tnt-mpXX.zip // (XX = version nr, 1st version = 10) _______________________________________________________________________ 3 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ 2.1 Song Name _______________________________ This data is pretty self-representative. This is a C 'string' that is null-terminated (i.e. ASCII character 0 is put at the end of the text is the text does not fill up the entire field). Some module writers use this field and the instrument name fields to write 'hello' messages to their friends or dedications instead of giving names to the song or it's samples. I in no way discourage this. // As sample names are usually used for messages, the song title field // effectively holds the song title (in 99.9% of the cases ;-)) 2.2 Sample Information _______________________________ Based on the format tag field, there can be 15 or 31 sampled instruments for the song. These days it is rare to run into an 'older' format song with only 15 instruments. Please see the 'File format tag' field for more information on how to determine how many samples there are in a file. The first field in a sample information block is the sample's name. As was mentioned above, these names are frequently used by the composer to say hello to his or her friends. Again, I in no way discourage this. If the sample name begins with a '#' character (ASCII $23 (35)) then this is assumed not to be an instrument name, and is probably a message. The second field is the sample length in words. Once again, since this is a 680x0 word, the bytes have the order HHLL, and you have to swap them to use the word on PCs. The first 2 bytes of the sample are used by the Amiga players for repeat information, and therefore are NOT part of the playable data. Therefore, if this field is evaluated to a length of less than 3 bytes, there is NO sample. The third field is the sample's initial finetune value. The lower four bits represent a signed nibble (-8..7). Each finetune step changes the note 1/8th of a semitone. This is implemented by switching to a different table of period-values for each finetune value. See section 3.2 for a discussion of fine-tuning. The fourth field is the sample's playback volume. These are LINEAR values that range from 0 to 64, with 64 being maximum volume. If you are implementing a MOD player, remember to check if you need to use logarithmic volumes. 'Decibel' is a logrithmical unit, which represents how we feel sound intensity. The volume and decibel value table for conversions is on the next page. _______________________________________________________________________ 4 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ Volume Decibel Value Volume Decibel Value ------------------------- ------------------------ 64 0.0 32 -6.0 63 -0.1 31 -6.3 62 -0.3 30 -6.6 61 -0.4 29 -6.9 60 -0.6 28 -7.2 59 -0.7 27 -7.5 58 -0.9 26 -7.8 57 -1.0 25 -8.2 56 -1.2 24 -8.5 55 -1.3 23 -8.9 54 -1.5 22 -9.3 53 -1.6 21 -9.7 52 -1.8 20 -10.1 51 -2.0 19 -10.5 50 -2.1 18 -11.0 49 -2.3 17 -11.5 48 -2.5 16 -12.0 47 -2.7 15 -12.6 46 -2.9 14 -13.2 45 -3.1 13 -13.8 44 -3.3 12 -14.5 43 -3.5 11 -15.3 42 -3.7 10 -16.1 41 -3.9 9 -17.0 40 -4.1 8 -18.1 39 -4.3 7 -19.2 38 -4.5 6 -20.6 37 -4.8 5 -22.1 36 -5.0 4 -24.1 35 -5.2 3 -26.6 34 -5.5 2 -30.1 33 -5.8 1 -36.1 0 Minus infinity The reason for the table starting at 0 dB as the convention from taperecorders of having 0 dB as the optimal recording condition, and displaying anything worse as a negative number. Please see section 4.0 for a complete linear volume format for Gravis' UltraSound. The fifth field in the sample information block is the sample repeat start offset. Once this sample has been played completely from beginning to end, if the repeat length (next field) is greater than two bytes it will loop back to this position in the sample and continue playing. Once it has played for the repeat length, it continues to loop back to the repeat start offset. This means the sample continues playing until it is told to stop. The last, or sixth field in the sample information is the repeat length. A sample is only looped if this value is greater than 2 bytes. See the preceeding paragraph for more information on looping. _______________________________________________________________________ 5 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ 2.3 Number of patterns in song _______________________________ This byte represents the number of patterns which are played in the entire SONG. This is NOT the number of patterns in the FILE. The file may contain (theoretically) up to 256 patterns, whereas the song is just a selection of those patterns. If I have 30 patterns in my file, and I just want to play patterns 6, 12, 3, 7, and 8 in that order, this byte will have the value 5. 2.4 Song end jump position _______________________________ Historically, this byte has been used for many purposes. Most commonly in the newer format it has been used to signify if a song is to be repeated indefinitely. Some game programs have background music which never ends. If this byte is less than 127, then it specifies the position in the pattern table to jump to when the last pattern has been played. If this byte is greater than or equal to 127, the song ends. 2.5 Pattern table _______________________________ This 128 byte block lists the order that patterns in the file should be played in. Only the number of bytes specified by the number of patterns in the song (see section 2.3) can be considered valid. If the song is to play patterns 6, 0, 12, 11, 21, and 10 in that order, then the table will have those 6 values as the first 6 bytes: Pattern Table Position ---> 0 1 2 3 4 5 6 ---------> 127 |---|---|---|---|---|---|---|---...---|---| |006|000|012|011|021|010| ????????? | |---|---|---|---|---|---|---|---...---|---| One of the effects which is possible (see section 3.4) is a position jump. The argument to this effect is where to jump to in the PATTERN TABLE. This does NOT specify which PATTERN to jump to. In a particular pattern there are 64 lines. These lines are played in order from 0 to 63. When the end of a pattern is reached, playing continues with the next pattern in the pattern table, unless the current pattern is the last one. If the current pattern IS the last one, check the song end jump position (see section 2.4) to see if the song loops to a certain position in the pattern table. Another one of the effects which is possible (see section 3.4) is a pattern break. If this effect is encountered, playing immediately jumps to the first line of the next pattern. // The effect $D will always skip to the next pattern, but NOT always to // the first line of the next pattern (in the table). See the description // of the effect for more information. _______________________________________________________________________ 6 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ 2.6 File format tag _______________________________ This is the most controversial field in the file. This field has been the most 'ravaged', with many people using it in non-standard ways for their own purposes. There are a few standard tags which you can find here which tell you DEFINITELY what file format the file is, but there are many more non-standard tags. This makes the job of deciding what format a MOD is a difficult one. I will attempt to describe the known formats below. If you know of one I miss, please let me know. 'M.K.', 'FLT4', 'M!K!', '4CHN' : 4 channels, 31 instruments '6CHN' : 6 channels, 31 instruments '8CHN', 'OCTA' : 8 channels, 31 instruments // Another annotion about these tag fields: here you got some other fields. // If you don't want to support them in your player, you should at least de- // tect them. All these MODs have of course 31 instruments. // 'FLT4', 'FLT8': Startrekker 4/8 channel file. ('FLT6' doesn't exists) // 'CD81' : Falcon 8 channel MODs // '2CHN' : FastTracker 2 Channel MODs // 'yyCH' where yy can be 10, 12, .. 30, 32: FastTracker yy Channel MODs // 'yyCH' where yy can be 11, 13, 15: TakeTracker 11, 13, 15 channel MODs // 'TDZx' where x can be 1, 2 or 3: TakeTracker 1, 2, 3 channel MODs // 'xCHN' where x can be 5, 7 or 9: TakeTracker 5, 7, 9 channel MODs // // Thanks must go to Inertia for most of these extra tag fields. // // All these formats, except for the FLT8 format, are *EXACTLY* the same as // the standard M.K. 4 channel format; the only difference is the size of // one pattern. The size of one pattern is calculated w/ the following // "formula": // (Nr_Of_Channels shl 8) // // ( Nr_Of_Channels shl 8 <====> Nr_Of_Channels*4*64 // ^ ^^ // | || // Note length: 4 bytes -----+ || // Lines/patttern: 64 ---------++ // ) // The tag '4CHN' doesn't exists. // // Some extra information about the "FLT8" -type MOD's: // // These MOD's have 8 channels, still the format isn't the same as the // other 8 channel formats ("OCTA", "CD81", "8CHN"): instead of storing // ONE 8-track pattern, it stores TWO 4-track patterns per logical pattern. // i.e. The first 4 channels of the first logical pattern are stored in // the first physical 4-channel pattern (size 1kb) whereas channel 5 until // channel 8 of the first logical pattern are stored as the SECOND physical // 4-channel pattern. Got it? ;-). // If you convert all the 4 channel patterns to 8 channel patterns, do not // forget to divide each pattern nr by 2 in the pattern sequence table! Other information that is found in this field can be assumed to be somebody's attempt at protection, or some other information that was used in the 'older' file format. If you can't find any of the above information, it is best to assume that it's a 4 channel file. As for how many instruments there are, check the bytes at location 471 in the file. If there is text there (ASCII $20-$7E (32-126)), then you can probably assume it's a 31-instrument file. Otherwise, it's an older 15 instrument file. // The method described above works lovely! 2.7 Patterns _______________________________ There can be any number of patterns in the file. They are stored after the file header and before the sample data. There are USUALLY less than 64, but the maximum is not limited - if the file tag is 'M!K!' there are definitely more than 64 patterns. // The nr of patterns is limited to 128 (from 0 to 127). The patterns are stored sequentially (i.e. the first pattern is #0, the second pattern is #1, etc.). An individual pattern is made up of 64 'lines', stored sequentially (i.e. line 0 to line 63). Each 'line' is comprised of a note for each channel. Each 'note' is made up of 4 bytes, so depending on the number of channels in the file, there are 16, 24, or 32 bytes per line. // there are nr_channels*4 bytes per line. That is: minimum 4, max. 128 For a four-channel file there are (4 bytes * 4 channels * 64 lines) =1024 bytes of information per pattern. To find out the number of patterns in a particular file, calculate the length of 'header' information and add to it the lengths of all samples that are mentioned in the sample information blocks. Subtract this number from the file's total size and divide by the number just computed (1024) to get the number of patterns in the file. // The method described above is not the best method to find out how many // patterns are stored in the MOD; it will fail if the MOD contains garbage // at the end of the file. A much better method is to scan through the // pattern sequence table to find the highest value. Be sure to scan ALL // the values (128 of them) and to increment the highest pattern nr once, // because the patterns are numbered from zero... // e.g. if the highest pattern nr you could find in the table is 16, there // are 16+1=17 patterns. _______________________________________________________________________ 7 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ As mentioned above, each note is stored as 4 bytes. The information held by these bytes has format shown below. How you display the contents of the 4 bytes in a player is up to you. There is NO standard way to do this. Byte 1 Byte 2 Byte 3 Byte 4 --------- --------- --------- --------- 7654-3210 7654-3210 7654-3210 7654-3210 wwww XXXX xxxxxxxxx yyyy ZZZZ zzzzzzzzz wwwwyyyy ( 8 bits) : sample number XXXXxxxxxxxx (12 bits) : sample 'period' ZZZZzzzzzzzz (12 bits) : effect and argument The sample number refers to a sample specified in the sample information block. Please see sections 2.2 and 2.8 for more information on the samples. The sample 'period' corresponds to a delay value on an Amiga computer. Note that on an Intel processor, you have to order these 12 bits as 'XXXX0000xxxxxxxx' to read the value as a word. Please see sections 3.2 // NO! You should use XXXXxxxxxxxx instead of XXXX0000xxxxxxxx // (I came on it whilst programming my own player.) and 3.3 for more information on how to use these values. The effect is an effect number and an argument for the effect. Please see section 3.4 for a discussion of the effects and how to implement them. 2.8 Sample data _______________________________ The sample data follows all of the patterns. After you have finished reading the pattern data, there will be just enough data left in the file for all of the instruments specified in the sample information section. The samples are stored sequentially from sample 1 to sample 31. The sample's data is in 8-bit two's compliment format, so if it needs to be in another format for your sound device to play it, don't forget to convert (UltraSound users: you don't need to convert the data when downloading). As was mentioned in section 2.2, the first 2 bytes of the sample are used by the Amiga MOD players for repeat information, and therefore are NOT part of the playable data. PC users do not have to do anything with these two bytes. // Hum, I got wrong results when I skipped these two bytes. When I treated // them as sample data, everything went fine... Dunno why. // So I suggest you don't care about it. // (especially chiptunes sounded really wrong) _______________________________________________________________________ 8 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ 3.0 Playing the files _______________________________ Section 3 deals with playing MOD files. Specifically, it deals with playing them on PC hardware - hopefully a Gravis UltraSound. The Ultrasound is ideal for this and many other types of sound and song processing, and is exceptionally easy to program. Gravis makes available an SDK (Software Development Kit) which has both C, C++, and (by the end of November) Borland Pascal versions. If you are programming a MOD player for other hardware, you may still be able to use this information for reference. 3.1 Timing _______________________________ If lines are played sequentially, then how long should the player wait between successive lines? On the Amiga, the amount of time a note spends on a channel before the next note is started is calculated by using some complex formulas based on the PAL color carrier frequency. I will not try to bore you with the details of these calculations here, and if you wan't them, email me. A song can be played at a speed ranging from 1 to 127, where the speed specifies how many 'ticks' before playing the next sample. A tick is supposed to happen every .02 seconds, which gives 50 ticks per second. At the start of a line all samples specified on that line are started, samples playing are modified, speed is changed, etc. Some effects require that changes be made to a sample playing on a channel during the course of a line. For example, the retrigger effect re-starts a sample at a certain tick within a line. If the song is playing at speed 6 and the effect specifies a retrigger on the 4th tick: Time Tick 0.00 1 - start all samples and effects 0.02 2 0.04 3 0.06 4 - retrigger sample here 0.08 5 0.10 6 ------------ 0.00 1 - start next line . . Unless a speed is specified on the first line of the first pattern, the song should start playing at speed 6. Please see section 3.4, effect $F, for more information on changes in speed. _______________________________________________________________________ 9 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ 3.2 Periods _______________________________ MOD players use a technique called frequency shifting to produce different 'notes' of the same sample. If I play a sample at 10 KHz, it will sound one octave higher if I double the frequency to 20 KHz, and one octave lower if I halve the frequency to 5 KHz. Since there are 12 notes per octave on a keyboard (these are called half-steps), each frequency corresponds to one twelfth root of two (~1.05946) times the frequency of it's predecessor (to the left). Therefore, if the C-1 frequency (the note of C in octave 1) is 4144 Hz then: Note: C-1 C#1 D-1 ... C-2 ... Freq: 4144 4390 4651 ... 8288 ... The Amiga playing routines were written to run off different interrupts for different Amiga computers, based on whether the machine was a PAL or NTSC machine. The 'period' values are measures which are used in calculating how much data to send to each of the 4 Amiga channels per second (thereby specifying the frequency or pitch of the output). For PC programmers, you don't have to worry about this that much. The thing to remember is that a 'magic number' divided by twice the period value will give the rate (frequency) to play the sample at. Here are the magic numbers and the corresponding formulae. I don't know which number is better to use - It doesn't make a huge difference. PAL Value NTSC Value =========== ============ 7093789.2 7159090.5 SampleRate = -------------- SampleRate = -------------- Period * 2 Period * 2 // On a GUS, you need to divide the above calculated frequency by a cer- // tain "frequency divisor". The value of this divisor depends on the // number of channels you allocated on the GUS. Here you have the official // divisors: // freq_divisors[19] = ( // 44.100, frequency divisor using 14 active voices (or less) // 41.160, frequency divisor using 15 active voices // 38.587, frequency divisor using 16 active voices // 36.317, frequency divisor using 17 active voices // 34.300, frequency divisor using 18 active voices // 32.494, frequency divisor using 19 active voices // 30.870, frequency divisor using 20 active voices // 29.400, frequency divisor using 21 active voices // 28.063, frequency divisor using 22 active voices // 26.843, frequency divisor using 23 active voices // 25.725, frequency divisor using 24 active voices // 24.696, frequency divisor using 25 active voices // 23.746, frequency divisor using 26 active voices // 22.866, frequency divisor using 27 active voices // 22.050, frequency divisor using 28 active voices // 21.289, frequency divisor using 29 active voices // 20.580, frequency divisor using 30 active voices // 19.916, frequency divisor using 31 active voices // 19.293 frequency divisor using 32 active voices // ); // // If you multiply these values by 1000 (e.g. 44100 instead of 44.100), // you get the mixing rate of the GUS. As you see, the quality drops badly // using 32 active voices... // // (BTW: Don't try to allocate less than 14 voices.) // Thus the frequency you should pass to the GUS is calculated as follows: // // gus_freq = (7093789.2 / (2 * period)) / freq_divisors[nr_of_voices-14]; To determine what frequency to play a sample at, look up the specified period value in a table based on the finetune setting (see section 3.3 for more information on fine-tuning). If the period is 0, then the previous period used on that channel is used. As an example, let's look at the period table for finetune 0. The notes that are possible in each octave are: C C# D D# E F F# G G# A A# B Octave 1: 856, 808, 762, 720, 678, 640, 604, 570, 538, 508, 480, 453 Octave 2: 428, 404, 381, 360, 339, 320, 302, 285, 269, 254, 240, 226 Octave 3: 214, 202, 190, 180, 170, 160, 151, 143, 135, 127, 120, 113 Octave 0:1712,1616,1525,1440,1357,1281,1209,1141,1077,1017, 961, 907 Octave 4: 107, 101, 95, 90, 85, 80, 76, 71, 67, 64, 60, 57 If I was requested to play a sample at period 302, I would scan through the period table until I hit that value. At that point, I know that the note is called 'F#2', F-sharp in octave 2. I calculate the playback frequency by doing the calculations on the next page. _______________________________________________________________________ 10 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ PAL Value NTSC Value =========== ============ 7093789.2 7159090.5 ----------- = 11745 Hz ----------- = 11853 Hz 302 * 2 302 * 2 ++ ++ Nope, PAL clock is 709379.0 Calc: (28.37516MHz osc / 4) * 1000000 ++ NTSC clock is 7159090.0 Calc: (28.63636MHz osc / 4) * 1000000 ++ ++ The PAL color carrier clock is 4.43361875, not 4.43361825. ++ This is what made 7093789.2 popular in all .MOD docs. ++ There are normally only three octaves (1 to 3) used in playing songs. Octaves 0 and 4 are NOT standard. Some songs may use the values though, and it's nice if your player can handle them. Full period tables for all finetunes are listed in section 4. If you wish to sample sounds to include in MOD files, remember that the data must be stored in 8-bit 2's complement format. There is NO standard sample rate when creating the samples. Most often the samples are done on the rate corresponding to period C-3 (around 16.5 KHz), and sometimes drums are sampled at A-3 (around 28 KHz). If sample number is specified on a channel (sample #0), then the last // (SampleNr is not zero) sample used on that channel will be remembered if new notes come along. Only one sample may play on a channel at a time, so playing a new sample will cancel an old one - even if there is no actual sample data for the new sample (a 'silent' sample). However, if you are constructing a MOD file of your own and you use a "silent" sample it is polite to set its default volume to 0. If you have some memory (around 2k or so) to spare, you could make up a table of words indexed by period value. The value of the word at the index of a period is the corresponding frequency that the sample should be played at. This saves you from having to calculate the frequencies over and over again. If you still don't get what I'm talking about here: I have a array of words, one for each period from the lowest (around 50) // Normal Maximum Period = 907 // Normal Minimum Period = 108 // Extended Maximum Period = 1814 // Extended Minimum Period = 54 // // Extended: when using octaves 0 & 4 // See the V-E-R-Y end of this file for a complete list of Period values, // EXTENDED octaves included. // // If you want VERY extended octaves, you'll have to use different // formulas. to the highest (around 1712). I precalculate the contents of this table so that at index 302 (the period for note F#2), there is the value 11853, the frequency to use to get the note F#2. Therefore, when my player runs accross this value and needs to know what frequency to play the sample at, I simply look up the value in the table directly - no calculations. If you still don't get what I'm talking about, you're screwed. 3.3 Fine-Tuning _______________________________ Fine-tuning is a minor adjustment on how an instrument sounds. This is implemented by small changes in the period values. The finetune value for a sample specifies the adjustment on the period values for that instrument. A fine-tune can also be specified for a specific instrument by an effect, at which point the value in the effect will override the one in the sample information block. _______________________________________________________________________ 11 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ The value in the sample information block is a signed nibble (4 bits, signed 2's complement). Therefore, the values that can be found have the following corresponding finetunes: Value: 0 1 2 3 4 5 6 7 8 9 A B C D E F Finetune: 0 +1 +2 +3 +4 +5 +6 +7 -8 -7 -6 -5 -4 -3 -2 -1 Section 4.0 specifies period values for all finetunes for octaves 1 to 3. You could use these values in creating your array of frequency words (see the end of section 3.2). 3.4 Effects _______________________________ As was mentioned in section 2.7, the 4 bytes for a note have the following format: Byte 1 Byte 2 Byte 3 Byte 4 --------- --------- --------- --------- 7654-3210 7654-3210 7654-3210 7654-3210 wwww XXXX xxxxxxxxx yyyy ZZZZ zzzzzzzzz wwwwyyyy ( 8 bits) : sample number XXXXxxxxxxxx (12 bits) : sample 'period' ZZZZzzzzzzzz (12 bits) : effect and argument Again, how you display this information in a player is up to you. I have seen a zillion different formats. I have described what the sample number and period refer to. Here, we will look at the effects that are possible. At this point in time, the Amiga Protracker MOD player (version 2.3A/ 3.01) has 28 effects. Some of these effects are redundant or not possible on some PC sound cards. I will describe the effects and how they are implemented on the Amiga. PC programmers will have to adapt the effects they wish to implement on their own. All numbers are stated in hexadecimal. For the discussion of the effects, we will look at the 'effect and argument' part of the 4 bytes in the following way: Bit number: $CBA987654321 Mentioned above as: ZZZZzzzzzzzz We will use: ZZZZxxxxyyyy There are two types of effects, standard and extended. All effects use the ZZZZ portion to declare the effect number. Standard effects use the xxxx and yyyy portions as one or two arguments, either as an 8-bit value when taken together in the form xxxxyyyy or as 2 nibbles xxxx and yyyy. Extended effects have the ZZZZ effect number $E. They use the xxxx portion to declare the extended effect number and the only the yyyy portion as an argument. _______________________________________________________________________ 12 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ Here are the possible standard effects: ----------------------------------------------------------------------- # Effect name Uses Arguments as ----------------------------------------------------------------------- 0 Arpeggio xxxx yyyy 1 Slide Up xxxxyyyy 2 Slide Down xxxxyyyy 3 Tone Portamento xxxxyyyy 4 Vibrato xxxx yyyy 5 Tone Portamento + Volume Slide xxxx yyyy 6 Vibrato + Volume Slide xxxx yyyy 7 Tremolo xxxx yyyy 8 Set Panning Position xxxxyyyy 9 Set SampleOffset xxxxyyyy A VolumeSlide xxxx yyyy B Position Jump xxxxyyyy C Set Volume xxxxyyyy D Pattern Break xxxxyyyy E *Extended Effects see below F Set Speed xxxxyyyy // The "SET SPEED" command is also used to set extended speed: BPM. And here are the possible extended effects: --------------------------------- # Effect name --------------------------------- E0 Set Filter E1 FineSlide Up E2 FineSlide Down E3 Glissando Control E4 Set Vibrato Waveform E5 Set FineTune E6 Set/Jump to Loop E7 Set Tremolo Waveform E8 NOT USED E9 Retrig Note EA Fine VolumeSlide Up EB Fine VolumeSlide Down EC NoteCut ED NoteDelay EE PatternDelay EF Invert Loop A description of each effect and how it is implemented is given on the following pages. Once again, all values are given in hexadecimal unless otherwise stated. _______________________________________________________________________ 13 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ ----------------------------------------------------------------------- 0: Arpeggio ----------------------------------------------------------------------- If a note as an effect number of 0, it is only an arpeggio if there is at least one non-zero argument. When there is at least one valid argument, this effect means to play the note specified, then the note+xxxx half- steps, then the note+yyyy half-steps, and then return to the original note. These changes are evenly spaced within the time for a line to be played at the current speed. This effect is usually used to simulate chords (where a major chord is the note+4 half steps and the note+7 half-steps). This does not work very well on most samples. This can also be used to produce a heavy vibrato. Here is an example of this effect: Note C-3, xxxx=4, yyyy=7 this will attempt to produce a C-major chord. At the beginning of a line the C-3 note is played, then at 1/3 of the way through the line the note is retriggered at E-3, 2/3 of the way through it is retriggered at G-3, and at the beginning of the next line (if there are no new notes to be played on the channel), it is retriggered at C-3 again. This presents a minor problem for timing, since you have to keep track of the arpeggio during the course of playing a line. What you could do is use a timer differently, or set up another timer that independently tracks the timing of the arpeggio. // There is a little error in the above information. So here's how you // should implement Arpeggio on the PC: // - at tick nr 0 (the tick the effect is encountered whilst updating the // note info ( = whilst playing another line)): set a counter to 0, and // keep the values xxxx & yyyy handy. // => play the actual note. // - at tick nr 1 (the first tick that occurs after updating a line: // STILL PLAY THE ACTUAL NOTE - AND THEN update ( increment) the counter. // - the following ticks: // // if (counter mod 3) = 0 then play actual note // if (counter mod 3) = 1 then play actual note + xxxx // if (counter mod 3) = 2 then play actual note + yyyy // increment counter // end of effect. // // GOT IT? // As far as I know, PC-players don't care about the "timing problem" // mentioned above. ----------------------------------------------------------------------- 1: Slide up (Portamento Up) ----------------------------------------------------------------------- This effect will slide up the frequency (decrease the period) of the sample being played on the channel by xxxxyyyy notes for every tick that occurs during the line. You usually cannot slide past note B-3 unless you have implemented octave 4 (NON-STANDARD!). The number of ticks that occur per line is set with effect $F, the set speed command. Since the slide rate depends on the speed, be careful if you set are composing a MOD when you change the speed. An example of this effect is: Note C-3, xxxxyyyy = 2, playing at speed 3. At the beginning of the line the sample is started at period C-3. At the first tick, the period is decremented by 2 (the frequency is increased). At the second tick, the period is again decremented by 2. At the beginning of the next line, if there is not a new note to be played the period is again decremented by 2. _______________________________________________________________________ 14 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ ----------------------------------------------------------------------- 2: Slide down (Portamento Down) ----------------------------------------------------------------------- This effect will slide down the frequency (increase the period) of the sample being played on the channel by xxxxyyyy tones for every tick that occurs during the line. You usually cannot slide below note C-1 unless you have implemented octave 0 (NON-STANDARD!). The number of ticks that occur per line is set with effect $F, the set speed command. Since the slide rate depends on the speed, be careful if you set are composing a MOD when you change the speed. An example of this effect is: Note C-3, xxxxyyyy = 2, playing at speed 3. At the beginning of the line the sample is started at period C-3. At the first tick, the period is incremented by 2 (the frequency is decreased). At the second tick, the period is again incremented by 2. At the beginning of the next line, if there is not a new note to be played the period is again incremented by 2. ----------------------------------------------------------------------- 3: Slide to note ----------------------------------------------------------------------- This effect will slide a note being played on a channel to a specified note. The parameter xxxxyyyy will states the speed at which a slide will occur. For each tick that occurs during the line, the period currently being played is altered by the number of notes specified. The number of ticks that occur per line is set with effect $F, the set speed command. Since the slide rate depends on the speed, be careful if you set are composing a MOD when you change the speed. An example of this effect is: Slide to note C-2, xxxxyyyy = 2, playing at speed 3. At the beginning of the line the current frequency for the sample is altered to be 2 notes closer to C-2. At the first tick, the same alteration occurs, changing the period to form a note even closer to C-2. The same occurs for each tick after that. This effect continues until another effect is started or the specified frequency is reached. If a slide rate is not specified (xxxxyyyy is zero) then the last slide rate used on the channel is used again. ----------------------------------------------------------------------- 4: Vibrato ----------------------------------------------------------------------- Vibrato means to "oscillate the sample pitch using a particular waveform with amplitude yyyy notes, such that (xxxx * speed)/64 full oscillations occur in the line". The waveform to use in vibrating is set using effect E4 (see below). By placing vibrato effects on consecutive lines, the vibrato effect can be sustained for any length of time. If either xxxx or yyyy are 0, then values from the most recent prior vibrato will be used. _______________________________________________________________________ 15 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ An example is: Note C-3, with xxxx=8 and yyyy=1 when speed=6. This will play tones around C-3, vibrating through D-3 and B-2 to C-3 again (amplitude - yyyy - is 1), with (8*6)/64 = 3/4 of a full oscillation per line. Please see effect E4 for the waveform to use for vibrating. ----------------------------------------------------------------------- 5: Continue effect 3:'Slide to note', but also do Volume slide ----------------------------------------------------------------------- This effect will change the volume of a channel while a tone portamento (effect 3) is taking place. The values xxxx or yyyy specify the speed of the volume change. If xxxx is nonzero the volume is increased, and if yyyy is nonzero the volume is decreased. It is illegal for both xxxx and yyyy to be non-zero. You cannot slide past 64 or below 0. As an example, take the xxxx to be set to 3. This means that at the beginning of the line, the current volume of the channel is increased by 3. The volume is increased again for every tick on this line and the lines following (until there is a new effect). Once again, the volume cannot slide up past 64. ----------------------------------------------------------------------- 6: Continue effect 4:'Vibrato', but also do Volume slide ----------------------------------------------------------------------- This effect will change the volume of a channel while a vibrato (effect 4) is taking place. The values xxxx or yyyy specify the speed of the volume change. If xxxx is nonzero the volume is increased, and if yyyy is nonzero the volume is decreased. It is illegal for both xxxx and yyyy to be non-zero. You cannot slide past 64 or below 0. As an example, take the yyyy to be set to 2. This means that at the beginning of the line, the current volume of the channel is decreased by 2. The volume is decreased again for every tick on this line and the lines following (until there is a new effect). Once again, the volume cannot slide down below 0. ----------------------------------------------------------------------- 7: Tremolo ----------------------------------------------------------------------- Temolo means to "oscillate the sample volume using a particular waveform with amplitude yyyy*(speed-1), such that (xxxx*speed)/64 full oscillations occur in the line". The waveform to use to oscillate is set using the effect E7 (see below). By placing tremolo effects on consecutive lines, the tremolo effect can be sustained for any length of time. If either xxxx or yyyy are 0, then values from the most recent prior tremolo will be used. The usage of this effect is similar to that of effect 4:Vibrato. ----------------------------------------------------------------------- 8: This effect is not used. // Command 8: Set FINE Panning. // Even if the AMIGA PROTracker does not support it, this effect is used // by modern MOD's and supported by nearly all modern PC MOD player rou- // tines. Here it is: // // xxxxyyyy = panning position. (0=Most left, 255=most right.) ----------------------------------------------------------------------- _______________________________________________________________________ 16 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ ----------------------------------------------------------------------- 9: Set sample offset ----------------------------------------------------------------------- This effect allows you to start a sample from a specified position rather than the normal beginning position. Multiply the value xxxxyyyy by 512 // !! N O !! Don't multiply by 512. You should multiply by 256 ($100). to get the position in bytes from the beginning of the sample where playback should start. If no sample is specified with the effect, but one is currently playing on the channel, then the sample currently playing is retriggered to offset specified. An example is instrument 2 being played at note C-3, with xxxxyyyy=$23. This would make playback of the sample start at offset $23*$200 = $4600. // $23*$100 = $2300 ... This effect gives a rough range to play the sample from. // WARNING!!! if the effect argument is 0, the effect should be IGNORED! // !! Note that if the effect is out of range (e.g. if it tries to jump // beyond the end of the sample) NO NOTE WILL BE PLAYED! Some players // even stop playback! ++ ++ Bullshit, 9xx has its own memory. ++ 900 plays the sample at 9xx_memory*0x100. ++ Also, there's a weird 9xx bug in the ProTracker sources, but I won't ++ talk about it here. ++ ----------------------------------------------------------------------- A: Volume slide ----------------------------------------------------------------------- This effect will change the volume of all samples being played on a channel. The values xxxx or yyyy specify the speed of the volume change. If xxxx is nonzero the volume is increased, and if yyyy is nonzero the volume is decreased. It is illegal for both xxxx and yyyy to be non- zero. You cannot slide past 64 or below 0. As an example, take the yyyy to be set to 3. This means that at the beginning of the line, the current volume of the channel is decreased by 3. The volume is decreased by 3 again for every tick on this line and the lines following (until there is a new effect). Once again, the volume cannot slide down below 0. // When performing a vol. slide, you have to start decreasing the volume // at the tick that follows the line that was just played. // Same remark for the portamento effects ($1, $2, $3 and $5) ----------------------------------------------------------------------- B: Position Jump ----------------------------------------------------------------------- This effect xxxxyyyy parameter specifies a position in the pattern table that playback should jump to after this line. Legal values are in the range of the number of patters that are supposed to be in the song (see section 2.3). Values outside this range should be ignored. // NO! Legal values are supposed to be less or equal than the length of // the pattern sequence (the length of the song in patterns). If the value // is higher than 127, it's corrupt. If it's higher than the songlength, // you may or may not restart the MOD. ++ ++ If you do Bxx where xx is order_num or more, then it simply jumps ++ to order 0. ++ And yes, I have tested this in ProTracker. ++ ----------------------------------------------------------------------- C: Set volume ----------------------------------------------------------------------- Effect C will set the volume on a channel to the setting specified by the xxxxyyyy value. Legal volumes are in the range of 0 to 64. An attempt to set the volume to a higher value than 64 will just set it to 64. I don't think we really need an example for this effect. _______________________________________________________________________ 17 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ ----------------------------------------------------------------------- D: Pattern Break ----------------------------------------------------------------------- This effect is equivalent to a position jump to the next pattern in the pattern table, with the arguments xxxx*10+yyyy specifying the line within that pattern to start playing at. Note that this is NOT xxxx*16+yyyy. // WARNING! This is !NASTY! You _DO_ need to recalculate the value!! For example, the effect with arguments xxxx=0, yyyy=0 would simply jump to the first line in the next pattern in the pattern table after playing the current line. With arguments xxxx=1 and yyyy=6 would jump to the 16th line of the next pattern in the pattern table after playing the current line. ----------------------------------------------------------------------- E0: Set filter on/off ----------------------------------------------------------------------- This sets a hardware sound filter to ON (if yyyy is 0) or OFF (if xxxx is nonzero). If your sound device has built-in filters, you should ignore this effect command. This effect is primarily used on Amiga 500 and 2000 computers to dick around with the hardware filter. ----------------------------------------------------------------------- E1: Fineslide up ----------------------------------------------------------------------- This effect functions just like effect 1, except that the frequency of the sample is only modified once. At the beginning of a line, whatever frequency is being played on a channel is incremented by yyyy notes. This effect does NOT continue on the lines following. You cannot slide the frequency above the note B-3 (unless you implement octave 4 : NON- STANDARD!). An example here would be effect E, xxxx=1 (the extended effect number), yyyy=3. This would slide the current frequency up three notes at the beginning of the line. ----------------------------------------------------------------------- E2: Fineslide down ----------------------------------------------------------------------- This effect functions just like effect 2, except that the frequency of the sample is only modified once. At the beginning of a line, whatever frequency is being played on a channel is decremented by yyyy notes. This effect does NOT continue on the lines following. You cannot slide the frequency below the note C-1 (unless you implement octave 0 : NON- STANDARD!). An example here would be effect E, xxxx=1 (the extended effect number), yyyy=2. This would slide the current frequency down two notes at the beginning of the line. _______________________________________________________________________ 18 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ ----------------------------------------------------------------------- E3: Set glissando on/off ----------------------------------------------------------------------- The argument yyyy to this effect specifies whether the glissando effect is ON (yyyy is 1) or OFF (yyyy is 0). If glissando is on, then the 'Slide to note' will slide a half note at a time. Otherwise, it will perform the default smooth slide. ----------------------------------------------------------------------- E4: Set vibrato waveform ----------------------------------------------------------------------- This effect means to set the waveform appearance for succeeding 'vibrato' effects. There are currently four possible appearances for the wave, each with a possible 'retrigger'. Two cycles are shown below for each type of waveform: yyyy Waveform Name Retriggered No Retrigger ---------- ------------------- ----------- ------------ /\ /\ Sine (default) 0 4 \/ \/ |\ |\ Ramp down 1 5 \| \| ,-, ,-, Square 2 6 '-' '-' ????????? Random 3 7 A "retriggered" waveform will be reset to the start of a cycle at the beginning of each new note. If a wave is selected "without retrigger", the previous waveform will be continued. Waveforms are usually retriggered. ++ ++ Neither "Random" nor the waveform retrigger stuff is used in ++ ProTracker and its replayer. Just a note if you want 100% ++ ProTracker accuracy, for whatever reason. ++ This means that only 0x00..0x02 is valid in ProTracker. ++ ----------------------------------------------------------------------- E5: Set finetune value ----------------------------------------------------------------------- This effect command sets the finetune value for the current instrument to the signed nibble value yyyy. This value overrides the value found in the sample information block at the beginning of the MOD file. The new finetune remains until changed by another E5 effect. Value: 7 6 5 4 3 2 1 0 F E D C B A 9 8 Finetune to set: +7 +6 +5 +4 +3 +2 +1 0 -1 -2 -3 -4 -5 -6 -7 -8 This effect is implemented by storing period values for all possible finetunes, and simply switching to a different table of periods when this effect is encountered. See section 3.3 for more information. Section 4 lists the period tables for finetunes for octaves 1 to 3. _______________________________________________________________________ 19 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ ----------------------------------------------------------------------- E6: Loop pattern ----------------------------------------------------------------------- This effect allows a section of a pattern to be 'looped', or played through, a certain number of times in succession. If the effect argument yyyy is zero, the effect specifies the loop's start point. Otherwise, it specifies the number of times to play this line and the preceeding lines from the start point. If no start point was specified in the current pattern being played, the loop start defaults to the first line in the pattern. Therefore, you cannot loop through multiple patterns. An example: On line 3, the effect E6 is encountered, with yyyy=0. This specifies that line 3 is the beginning of a loop in this pattern. Down on line 52, the effect E6 is encountered again, with yyyy=2. This means to jump back and play the lines from line 3 to line 52 again twice more before continuing with the rest of the pattern. ----------------------------------------------------------------------- E7: Set tremolo waveform ----------------------------------------------------------------------- Line command E4, this sets the waveform appearance for succeeding 'tremolo' (volume) effects. There are currently four possible appearances for the wave, each with a possible 'retrigger'. Two cycles are shown below for each type of waveform: yyyy Waveform Name Retriggered No Retrigger ---------- ------------------- ----------- ------------ /\ /\ Sine (default) 0 4 \/ \/ |\ |\ Ramp down 1 5 \| \| ,-, ,-, Square 2 6 '-' '-' ????????? Random 3 7 A "retriggered" waveform will be reset to the start of a cycle at the beginning of each new note. If a wave is selected "without retrigger", the previous waveform will be continued. Waveforms are usually retriggered. ++ ++ Neither "Random" nor the waveform retrigger stuff is used in ++ ProTracker and its replayer. Just a note if you want 100% ++ ProTracker accuracy, for whatever reason. ++ This means that only 0x00..0x02 is valid in ProTracker. ++ ----------------------------------------------------------------------- E8: This effect is not used. ----------------------------------------------------------------------- // Command $E8: Set (Rough) Panning. (also called MTM panning) // yyyy = panning value. $0 = most left, $F = most right. // (use this one on a GUS (MAX)) // // Same remarks as above (command $8). // It was introduced by ZZPlay or something like that. // FastTracker 2.06 (released februari '96) doesn't support this command. // (Use command $8 instead) _______________________________________________________________________ 20 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ ----------------------------------------------------------------------- E9: Retrigger sample ----------------------------------------------------------------------- Effect E9 allows you to re-trigger a specified sample at a particular note after yyyy ticks during the line. For example, say note C-3 is specified, with yyyy=2 when the speed is currently 6. This would mean that at the beginning of the line the specified sample is started, and after two ticks it is restarted. This continues until the beginning of the next line. This effect is used mostly with samples of hi-hats. ----------------------------------------------------------------------- EA: Fine volume slide up ----------------------------------------------------------------------- This effect increments the volume of a particular channel once at the beginning of the line by yyyy points. There is no continuation of the slide on successive lines or for other notes. You cannot slide above volume 64. ----------------------------------------------------------------------- EB: Fine volume slide down ----------------------------------------------------------------------- This effect is just like effect EA, except the volume is decremented rather than incremented by the value yyyy. There is no continuation of the slide on successive lines or for other notes. You cannot slide below volume 0. ----------------------------------------------------------------------- EC: Cut sample ----------------------------------------------------------------------- This effect sets the volume of the sample which is playing to 0 after yyyy ticks in the current line. This has the effect of stopping a sample abruptly. An example here is to play the note C-2, with effect EC and argument yyyy=3, when the speed is 6. The sample is started at note C-2 at the beginning of the line, and after the third tick of 6 in that line, the volume on the channel is set to 0 (cutting it off). Note that if yyyy is 0, nothing will be heard. ----------------------------------------------------------------------- ED: Delay sample ----------------------------------------------------------------------- This effect delays the start of a sample until tick yyyy in the current line. For example, if note C-2 is played, with effect ED and argument yyyy=3 when the speed is 6. The note C-2 will be triggered at the 3rd tick after the start of the line. The purpose of this effect is to delay the start of a sample for a VERY short amount of time. _______________________________________________________________________ 21 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ ----------------------------------------------------------------------- EE: Delay pattern ----------------------------------------------------------------------- This effect forces a small delay in a pattern in between successive lines. All notes and effects continue during this delay. The argument yyyy specified the number of line-equivalent time slices to wait before resuming playback. For example, if effect EE is encountered with speed being 6 and argument yyyy=4, then the next line will be delayed 24 ticks before it is executed. ----------------------------------------------------------------------- EF: Invert loop ----------------------------------------------------------------------- This effect is used on the Amiga to play samples backward at a specified speed. It is not really feasible to implement on other architechtures, and it is not used that often. // He're some (useless?) spec's anyway: // // Cmd EF. Invert Loop [Speed:$0-$F] // --------------------------------- // Usage: $EF + Invertspeed // This command will need a short loop // ($10,20,40,80 etc. bytes) to work. // It will invert the loop byte by byte. // Sounds better than funkrepeat... // Example: C-300EF8 Set invspeed to 8. // To turn off the inverting, set // invspeed to 0, or press ctrl + Z. // // (I've stolen this from another doc, obviously written by an AMIGA-dude.) ----------------------------------------------------------------------- F: Set speed ----------------------------------------------------------------------- This effect changes the speed of playback so that xxxxyyyy ticks occur during every line, starting on the NEXT line. The initial speed (before any 'set speed' effects are encountered) should be set to 6. A value of xxxxyyyy=0 should technically cause playback to stop, but this value is commonly ignored as garbage. // FT2, THE reference on PC, does NOT ignore the effect F00 as garbage, // but effectively stops playback. Note that this is a Tracker and not a // player. ++ ++ F00 stops the playback on ProTracker too. ++ Valid values for speed setting in this manner are 1 to 31. If a value is read that is above 31, it means to set a modified speed based on beats per minute, where 4 lines are 1 beat. This means that if I try to set the speed to 42, I am specifying 42 beats per minute, or 42*4=168 lines per minute. You then have to figure out how long to spend on a particular line. // Here is a useful "formula" which gives you the nr of ticks that should // occur in one second: // Nr_Of_Ticks_per_second = bpm*0.4 // // You can cause the timer to call IRQ 8 exact that nr of times a second // w/ the following neat procedure: // // Procedure TimerSpeedup(Speed: Word); // Begin // Port[$43] := $36; // Port[$40] := Lo(Speed); // Port[$40] := Hi(Speed); // end; // // Yeah, TP code.... // to get 50 ticks/second, do the following: // TimerSpeedUp(1193182 / (125*0.4)); {125*0.4=50; 125=default BPM value.} // // Another thing: If you dunno what IRQ's are, stop reading this DOC RIGHT // NOW. You are wasting you're time. If multiple set speed effects are performed on a single line, then the effects on the higher-numbered channels have precedence over the effects on the lower-numbered channels. // Be careful, a "SET SPEED" command does NOT override a "SET BPM" command, // even if these effects use the same effect nr ($F). // (A "SET BPM" command also doesn't override a "SET SPEED" command). This effect has the largest number of implementations and is particular to the number of effects that a particular file player supports. // That is, some MOD's have to be played as if BPM changes were ordinary // Speed changes (BLANK TIMING). There is no way to detect such type of MOD's // other than the date of the file as far as I know... // Example of such a module: "Klisje paa Klisje" (Email me if you want it) // These modules are extremely rare... // Anyway, I guess you don't need such a MOD to implement a vBlank timing // option ;-). 3.5 Other information _______________________________ If you're sound device is able to provide stereo output (like the UltraSound), then you need to know what the balance for each channel should be. Channels 1 and 4 are left, and 2 and 3 are right. // The other channels (if they are any) have the same "balance": // Channels 5 and 8 are left, and 6 and 7 are right, And so on... // Anyway, whilst programming (composing) a MOD, just set the balance of // each channel with the $8?? command. (On a PC of courz) If you are programming for the UltraSound, it is best not to shove the balances all the way over to the left or to the right. Try a value of 2 // ^--------- Especially when using headphones. for channels 1 and 4 and a value of 13 for channels 2 and 3. If you don't like it - change it. _______________________________________________________________________ 22 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ 4.0 Period and Volume tables _______________________________ Here are the period tables for the different fine-tune values: // see the end of the file for a completer list (5 ocataves instead of 3) 856,808,762,720,678,640,604,570,538,508,480,453 : C-1 to B-1 Finetune 0 428,404,381,360,339,320,302,285,269,254,240,226 : C-2 to B-2 Finetune 0 214,202,190,180,170,160,151,143,135,127,120,113 : C-3 to B-3 Finetune 0 850,802,757,715,674,637,601,567,535,505,477,450 : C-1 to B-1 Finetune +1 425,401,379,357,337,318,300,284,268,253,239,225 : C-2 to B-2 Finetune +1 213,201,189,179,169,159,150,142,134,126,119,113 : C-3 to B-3 Finetune +1 844,796,752,709,670,632,597,563,532,502,474,447 : C-1 to B-1 Finetune +2 422,398,376,355,335,316,298,282,266,251,237,224 : C-2 to B-2 Finetune +2 211,199,188,177,167,158,149,141,133,125,118,112 : C-3 to B-3 Finetune +2 838,791,746,704,665,628,592,559,528,498,470,444 : C-1 to B-1 Finetune +3 419,395,373,352,332,314,296,280,264,249,235,222 : C-2 to B-2 Finetune +3 209,198,187,176,166,157,148,140,132,125,118,111 : C-3 to B-3 Finetune +3 832,785,741,699,660,623,588,555,524,495,467,441 : C-1 to B-1 Finetune +4 416,392,370,350,330,312,294,278,262,247,233,220 : C-2 to B-2 Finetune +4 208,196,185,175,165,156,147,139,131,124,117,110 : C-3 to B-3 Finetune +4 826,779,736,694,655,619,584,551,520,491,463,437 : C-1 to B-1 Finetune +5 413,390,368,347,328,309,292,276,260,245,232,219 : C-2 to B-2 Finetune +5 206,195,184,174,164,155,146,138,130,123,116,109 : C-3 to B-3 Finetune +5 820,774,730,689,651,614,580,547,516,487,460,434 : C-1 to B-1 Finetune +6 410,387,365,345,325,307,290,274,258,244,230,217 : C-2 to B-2 Finetune +6 205,193,183,172,163,154,145,137,129,122,115,109 : C-3 to B-3 Finetune +6 814,768,725,684,646,610,575,543,513,484,457,431 : C-1 to B-1 Finetune +7 407,384,363,342,323,305,288,272,256,242,228,216 : C-2 to B-2 Finetune +7 204,192,181,171,161,152,144,136,128,121,114,108 : C-3 to B-3 Finetune +7 907,856,808,762,720,678,640,604,570,538,504,480 : C-1 to B-1 Finetune -8 453,428,404,381,360,339,320,302,285,269,254,240 : C-2 to B-2 Finetune -8 226,214,202,190,180,170,160,151,143,135,127,120 : C-3 to B-3 Finetune -8 900,850,802,757,715,675,636,601,567,535,505,477 : C-1 to B-1 Finetune -7 450,425,401,379,357,337,318,300,284,268,253,238 : C-2 to B-2 Finetune -7 225,212,200,189,179,169,159,150,142,134,126,119 : C-3 to B-3 Finetune -7 894,844,796,752,709,670,632,597,563,532,502,474 : C-1 to B-1 Finetune -6 447,422,398,376,355,335,316,298,282,266,251,237 : C-2 to B-2 Finetune -6 223,211,199,188,177,167,158,149,141,133,125,118 : C-3 to B-3 Finetune -6 887,838,791,746,704,665,628,592,559,528,498,470 : C-1 to B-1 Finetune -5 444,419,395,373,352,332,314,296,280,264,249,235 : C-2 to B-2 Finetune -5 222,209,198,187,176,166,157,148,140,132,125,118 : C-3 to B-3 Finetune -5 ...continues on next page... _______________________________________________________________________ 23 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ 881,832,785,741,699,660,623,588,555,524,494,467 : C-1 to B-1 Finetune -4 441,416,392,370,350,330,312,294,278,262,247,233 : C-2 to B-2 Finetune -4 220,208,196,185,175,165,156,147,139,131,123,117 : C-3 to B-3 Finetune -4 875,826,779,736,694,655,619,584,551,520,491,463 : C-1 to B-1 Finetune -3 437,413,390,368,347,338,309,292,276,260,245,232 : C-2 to B-2 Finetune -3 219,206,195,184,174,164,155,146,138,130,123,116 : C-3 to B-3 Finetune -3 868,820,774,730,689,651,614,580,547,516,487,460 : C-1 to B-1 Finetune -2 434,410,387,365,345,325,307,290,274,258,244,230 : C-2 to B-2 Finetune -2 217,205,193,183,172,163,154,145,137,129,122,115 : C-3 to B-3 Finetune -2 862,814,768,725,684,646,610,575,543,513,484,457 : C-1 to B-1 Finetune -1 431,407,384,363,342,323,305,288,272,256,242,228 : C-2 to B-2 Finetune -1 216,203,192,181,171,161,152,144,136,128,121,114 : C-3 to B-3 Finetune -1 The Amiga uses linear volumes from 0 to 64. The volume table specified below lists the logarithmic volume to use on the UltraSound for each of the 65 settings in order to get a linear spread. If you need volumes for another sound device, you will have to find them elsewhere. 0 | 0 1 | 1750 17 | 2332(*) 33 | 3469 49 | 3528 2 | 2503 18 | 3240 34 | 3473 50 | 3532 3 | 2701 19 | 3248 35 | 3478 51 | 3534 4 | 2741 20 | 3256 36 | 3481 52 | 3538 5 | 2781 21 | 3263 37 | 3484 53 | 3543 6 | 2944 22 | 3271 38 | 3489 54 | 3545 7 | 2964 23 | 3279 39 | 3492 55 | 3549 8 | 2981 24 | 3287 40 | 3495 56 | 3552 9 | 3000 25 | 3294 41 | 3499 57 | 3556 10 | 3017 26 | 3303 42 | 3502 58 | 3558 11 | 3034 27 | 3310 43 | 3506 59 | 3563 12 | 3052 28 | 3317 44 | 3509 60 | 3565 13 | 3070 29 | 3325 45 | 3513 61 | 3570 14 | 3207 30 | 3458 46 | 3517 62 | 3573 15 | 3215 31 | 3462 47 | 3520 63 | 3577 16 | 3224 32 | 3466 48 | 3524 64 | 3580 // (*) this value should be 3232 I think. ;-) // Note that w/ a GUS you can't use these values immediately: you have to // multiply them by max. 18.2; 16 seems to be the "ideal" maximum value. // (when multiplying by 18.2 the GUS will overload very fast: you'll start // Hearing crackle). Happy coding! -Thunder // One final remark: a big reward to THUNDER for writing the marvelleous DOC // in E N G L I S H (understandable prose). Thank You VERY MUCH! _______________________________________________________________________ 24 // Here you have a more complete list of the period values; extended octaves // are included. Sorry THUNDER, I was far too lazy to put "//" 's before the // whole damn' table... PeriodTable: array[0..15, 0..59] of Word = ( (1712, 1616, 1524, 1440, 1356, 1280, 1208, 1140, 1076, 1016, 960 , 906, 856 , 808 , 762 , 720 , 678 , 640 , 604 , 570 , 538 , 508 , 480 , 453, 428 , 404 , 381 , 360 , 339 , 320 , 302 , 285 , 269 , 254 , 240 , 226, 214 , 202 , 190 , 180 , 170 , 160 , 151 , 143 , 135 , 127 , 120 , 113, 107 , 101 , 95 , 90 , 85 , 80 , 75 , 71 , 67 , 63 , 60 , 56 ), (1700, 1604, 1514, 1430, 1348, 1274, 1202, 1134, 1070, 1010, 954 , 900, 850 , 802 , 757 , 715 , 674 , 637 , 601 , 567 , 535 , 505 , 477 , 450, 425 , 401 , 379 , 357 , 337 , 318 , 300 , 284 , 268 , 253 , 239 , 225, 213 , 201 , 189 , 179 , 169 , 159 , 150 , 142 , 134 , 126 , 119 , 113, 106 , 100 , 94 , 89 , 84 , 79 , 75 , 71 , 67 , 63 , 59 , 56 ), (1688, 1592, 1504, 1418, 1340, 1264, 1194, 1126, 1064, 1004, 948 , 894, 844 , 796 , 752 , 709 , 670 , 632 , 597 , 563 , 532 , 502 , 474 , 447, 422 , 398 , 376 , 355 , 335 , 316 , 298 , 282 , 266 , 251 , 237 , 224, 211 , 199 , 188 , 177 , 167 , 158 , 149 , 141 , 133 , 125 , 118 , 112, 105 , 99 , 94 , 88 , 83 , 79 , 74 , 70 , 66 , 62 , 59 , 56 ), (1676, 1582, 1492, 1408, 1330, 1256, 1184, 1118, 1056, 996 , 940 , 888, 838 , 791 , 746 , 704 , 665 , 628 , 592 , 559 , 528 , 498 , 470 , 444, 419 , 395 , 373 , 352 , 332 , 314 , 296 , 280 , 264 , 249 , 235 , 222, 209 , 198 , 187 , 176 , 166 , 157 , 148 , 140 , 132 , 125 , 118 , 111, 104 , 99 , 93 , 88 , 83 , 78 , 74 , 70 , 66 , 62 , 59 , 55 ), (1664, 1570, 1482, 1398, 1320, 1246, 1176, 1110, 1048, 990 , 934 , 882, 832 , 785 , 741 , 699 , 660 , 623 , 588 , 555 , 524 , 495 , 467 , 441, 416 , 392 , 370 , 350 , 330 , 312 , 294 , 278 , 262 , 247 , 233 , 220, 208 , 196 , 185 , 175 , 165 , 156 , 147 , 139 , 131 , 124 , 117 , 110, 104 , 98 , 92 , 87 , 82 , 78 , 73 , 69 , 65 , 62 , 58 , 55 ), (1652, 1558, 1472, 1388, 1310, 1238, 1168, 1102, 1040, 982 , 926 , 874, 826 , 779 , 736 , 694 , 655 , 619 , 584 , 551 , 520 , 491 , 463 , 437, 413 , 390 , 368 , 347 , 328 , 309 , 292 , 276 , 260 , 245 , 232 , 219, 206 , 195 , 184 , 174 , 164 , 155 , 146 , 138 , 130 , 123 , 116 , 109, 103 , 97 , 92 , 87 , 82 , 77 , 73 , 69 , 65 , 61 , 58 , 54 ), (1640, 1548, 1460, 1378, 1302, 1228, 1160, 1094, 1032, 974 , 920 , 868, 820 , 774 , 730 , 689 , 651 , 614 , 580 , 547 , 516 , 487 , 460 , 434, 410 , 387 , 365 , 345 , 325 , 307 , 290 , 274 , 258 , 244 , 230 , 217, 205 , 193 , 183 , 172 , 163 , 154 , 145 , 137 , 129 , 122 , 115 , 109, 102 , 96 , 91 , 86 , 81 , 77 , 72 , 68 , 64 , 61 , 57 , 54 ), (1628, 1536, 1450, 1368, 1292, 1220, 1150, 1086, 1026, 968 , 914 , 862, 814 , 768 , 725 , 684 , 646 , 610 , 575 , 543 , 513 , 484 , 457 , 431, 407 , 384 , 363 , 342 , 323 , 305 , 288 , 272 , 256 , 242 , 228 , 216, 204 , 192 , 181 , 171 , 161 , 152 , 144 , 136 , 128 , 121 , 114 , 108, 102 , 96 , 90 , 85 , 80 , 76 , 72 , 68 , 64 , 60 , 57 , 54 ), (1814, 1712, 1616, 1524, 1440, 1356, 1280, 1208, 1140, 1076, 1016, 960, 907 , 856 , 808 , 762 , 720 , 678 , 640 , 604 , 570 , 538 , 508 , 480, 453 , 428 , 404 , 381 , 360 , 339 , 320 , 302 , 285 , 269 , 254 , 240, 226 , 214 , 202 , 190 , 180 , 170 , 160 , 151 , 143 , 135 , 127 , 120, 113 , 107 , 101 , 95 , 90 , 85 , 80 , 75 , 71 , 67 , 63 , 60 ), (1800, 1700, 1604, 1514, 1430, 1350, 1272, 1202, 1134, 1070, 1010, 954, 900 , 850 , 802 , 757 , 715 , 675 , 636 , 601 , 567 , 535 , 505 , 477, 450 , 425 , 401 , 379 , 357 , 337 , 318 , 300 , 284 , 268 , 253 , 238, 225 , 212 , 200 , 189 , 179 , 169 , 159 , 150 , 142 , 134 , 126 , 119, 112 , 106 , 100 , 94 , 89 , 84 , 79 , 75 , 71 , 67 , 63 , 59 ), (1788, 1688, 1592, 1504, 1418, 1340, 1264, 1194, 1126, 1064, 1004, 948, 894 , 844 , 796 , 752 , 709 , 670 , 632 , 597 , 563 , 532 , 502 , 474, 447 , 422 , 398 , 376 , 355 , 335 , 316 , 298 , 282 , 266 , 251 , 237, 223 , 211 , 199 , 188 , 177 , 167 , 158 , 149 , 141 , 133 , 125 , 118, 111 , 105 , 99 , 94 , 88 , 83 , 79 , 74 , 70 , 66 , 62 , 59 ), (1774, 1676, 1582, 1492, 1408, 1330, 1256, 1184, 1118, 1056, 996 , 940, 887 , 838 , 791 , 746 , 704 , 665 , 628 , 592 , 559 , 528 , 498 , 470, 444 , 419 , 395 , 373 , 352 , 332 , 314 , 296 , 280 , 264 , 249 , 235, 222 , 209 , 198 , 187 , 176 , 166 , 157 , 148 , 140 , 132 , 125 , 118, 111 , 104 , 99 , 93 , 88 , 83 , 78 , 74 , 70 , 66 , 62 , 59 ), (1762, 1664, 1570, 1482, 1398, 1320, 1246, 1176, 1110, 1048, 988 , 934, 881 , 832 , 785 , 741 , 699 , 660 , 623 , 588 , 555 , 524 , 494 , 467, 441 , 416 , 392 , 370 , 350 , 330 , 312 , 294 , 278 , 262 , 247 , 233, 220 , 208 , 196 , 185 , 175 , 165 , 156 , 147 , 139 , 131 , 123 , 117, 110 , 104 , 98 , 92 , 87 , 82 , 78 , 73 , 69 , 65 , 61 , 58 ), (1750, 1652, 1558, 1472, 1388, 1310, 1238, 1168, 1102, 1040, 982 , 926, 875 , 826 , 779 , 736 , 694 , 655 , 619 , 584 , 551 , 520 , 491 , 463, 437 , 413 , 390 , 368 , 347 , 328 , 309 , 292 , 276 , 260 , 245 , 232, 219 , 206 , 195 , 184 , 174 , 164 , 155 , 146 , 138 , 130 , 123 , 116, 109 , 103 , 97 , 92 , 87 , 82 , 77 , 73 , 69 , 65 , 61 , 58 ), (1736, 1640, 1548, 1460, 1378, 1302, 1228, 1160, 1094, 1032, 974 , 920, 868 , 820 , 774 , 730 , 689 , 651 , 614 , 580 , 547 , 516 , 487 , 460, 434 , 410 , 387 , 365 , 345 , 325 , 307 , 290 , 274 , 258 , 244 , 230, 217 , 205 , 193 , 183 , 172 , 163 , 154 , 145 , 137 , 129 , 122 , 115, 108 , 102 , 96 , 91 , 86 , 81 , 77 , 72 , 68 , 64 , 61 , 57 ), (1724, 1628, 1536, 1450, 1368, 1292, 1220, 1150, 1086, 1026, 968 , 914, 862 , 814 , 768 , 725 , 684 , 646 , 610 , 575 , 543 , 513 , 484 , 457, 431 , 407 , 384 , 363 , 342 , 323 , 305 , 288 , 272 , 256 , 242 , 228, 216 , 203 , 192 , 181 , 171 , 161 , 152 , 144 , 136 , 128 , 121 , 114, 108 , 101 , 96 , 90 , 85 , 80 , 76 , 72 , 68 , 64 , 60 , 57 ));