From: husberg@proffa.cc.tut.fi (Husberg Fredrik) Newsgroups: alt.binaries.sounds.utilities Subject: Re: Playemd: newest version & EMD module format specs Date: 24 Aug 1994 14:14:53 GMT Organization: Tampere University of Technology, Computing Centre Dirk / ELASTIK husberg@proffa.cc.tut.fi ===================================================================== EMD module/song format for (A)dvanced 16-(B)it (T)racker ABT ===================================================================== Last update 14.8.1994 --------------------------------------------------------------------- Note! This is NOT the final version of the EMD-module format. There will be some minor changes in the near future (like new features) but they are always placed to those entries and that is the reason why they are not going to affect playing of these old EMDs with future versions of ABT. This file has been written in hurry and because of that there may be some mistakes in this file. If you have questions concerning EMD or ABT please contact: Dirk/Elastik Internet: husberg@lehtori.cc.tut.fi husberg@proffa.cc.tut.fi Snailmail: Koulutie 10 SF-36200 Kangasala Finland --------------------------------------------------------------------- What is EMD? It's new sample based sound/music module format. The letters E,M and D come from the words Extended MOD. EMD-module format is much like the normal MOD but with new features and it's designed to be used with the ABT, Advanced 16Bit Tracker made by Kari Visala and Mikko Blomqvist. Here is the short description of the current EMD format, which should help you to use EMDs freely in your own projects. PLEASE, NO MODIFICATIONS ------------------- EMD-file structure: ------------------- OFFSET 0 Header: ================= size description -------------------------------------------------------------------------- 4 bytes 'EMOD' , these four bytes are used to identify an EMD-file 1 byte Version number of the module 4 high order bits = major version 4 low order bits = minor version for example version 1.0 -> 00010000b 8 bytes (for later use..) OFFSET 13 Module-info part: ============================ size description -------------------------------------------------------------------------- 32 bytes Name of the song (32 chars, no any ending chracters) IBM-ascii 1 byte Number of the instruments 2 bytes Length of the pattern list 1 byte Number of the patterns-1 (0 = there is only 1 pattern) 32 bytes Values of the pan positions of the channels in the beginning of the song. (0-full left, 15-full right) byte/channel 2 bytes Starting tempo, default=125 bpm bpm = beats per minute (8 rows in pattern = 1 beat) 1 byte 0 = module 1 = song ( no sample wave-data stored to this file) 1 byte 0 = normal patterns 1 = packed patterns :-) 1 byte Number of channels (1..32) 1 byte This byte is only for modules: 0 = Samples are stored in normal 16-bit signed format (like WAV) 1 = Samples are in coded format Coding of the samples: This next process has been done to every single byte of sample raw data when module is saved: (so, if you want to uncode samples, do the steps backwards) 1. step first and last bit of byte changed 2. step neg Here is the code I use to uncode these: mov al,[byte of sample data] mov bl,al and bl,10000000b shr bl,7 mov bh,al and bh,00000001b shl bh,7 and al,01111110b add al,bl add al,bh mov [sample data],al ; uncoded byte saved The reason for coding those samples was that we didn't want that everyone would be able to rip our 16 bit samples straight from our asm'94 compo-modules, but I thought that this file format description should be complete and so I included uncoding info. This feature won't have any future use. 9 bytes OFFSET 96 Sample info part: ============================ This part of the file contains all settings and info for the samples. Sample wave-data is not here. One sample takes 250 bytes of space and they are saved to the module consecutive. So, the size of this part is number of instruments * 250 bytes size description -------------------------------------------------------------------------- 1 byte Number of the instrument in pattern data (1-99) 4 bytes Length of the sample in bytes 32 bytes Name of the sample (no any ending characters) IBM-ascii 12 bytes File name of the sample (used with song files) format: XXXXXXXX.XXX 72 bytes Breakpoint information: ( 18*4 bytes ) 18 breakpoints: 4 bytes = Offset from the beginning of the sample in words So, if sample is 50000 bytes long, then 25000 in breakpoints is the end of the sample. 2 consecutive breakpoints = 1 loop (9 loops) 9 bytes Directions of the loops 1 byte/loop : 0 = no loop 1 = forward loop 2 = bi-directional loop 1 byte Active loop of the sample in the beginning of the song : 0 = no loop on (default) 1..9 = loop # 108 bytes ADSR values (9 different ADSR for each instrument) (9*12 bytes) 1 ADSR value: 4 bytes offset(place) of the decay point 4 bytes offset(place) of the sustain point 1 byte Attack value ( always in the start of the sample) 1 byte Decay value 1 byte Sustain value 1 byte Release value ( always in the end of the sample) ADSR control for samples isn't used by ABT in any way. Only the space is reserved for these values. It is very likely that ABT will never use this feature in the future because of the limitations of the module-style music and these bytes could be replaced by some other data. 1 byte Active ADSR number 1-9 (0= no ADSR) 2 bytes overall volume of the sample in the beginning of the song value from 0 to 4095. 1 byte finetune+128 ( Default=128, player converts this value to a signed byte, -128..127: 0 = normal finetune. -64 = halfnote downwards 64 = halfnote upwards 1 byte midi on/off, 0 = normal GUS sample 1 = midi instrument 1 byte midi channel+1, 0...16 0 -> none, 1 -> channel 0, ... , 16 -> channel 15 1 byte midi preset instrument number 0 -> no preset instrument choosed from the ABT, note is played on synthesizer with choosed instrument 1 byte Direct load on/off 1 = instrument is loaded directly to gusdram 0 = instrument only in EMS in the start of the song 3 bytes OFFSET 96+250*inst# Pattern list: ================================== Here is the play order of patterns. Length of this part is in the module info part. One pattern takes 1 byte of memory and because of that song can only contain 255 different patterns. Numbers of the patterns are stored here so that the first byte is the number of the first played pattern and so on... OFFSET 96+250*inst#+pattlstsize Patterns: =========================================== This part of the file contains all data for the patterns. Patterns are stored here so that the first pattern here is the pattern marked with 0 in the patternlist, second is pattern 1 and so on. Size of a pattern is 13+channel#*pattern_length*5 bytes. size description -------------------------------------------------------------------------- 8 bytes Name of the pattern in IBM-ascii format with no ending character 1 byte Length of the pattern (how many rows, default=64) 4 bytes Here is some kind of pseudo-code presenting the way ABT stores patterns to EMD file: for y=1 to pattern_length for x=1 to #channels 1 byte Note = 0..255, 0 = no note, 1 = C-1 and so on... If pattern-packing is enabled in the moduleinfo part: 255 = because note,sample#,effect and params would all be zeros, program saves only one byte here (255) and those other 4 bytes aren't saved. 1 byte Number of the sample, 0=empty instrument, only stops playing sample 1 byte Effect command 1-99, 0 = no effect 1 byte Parameter 1 for the effect 1 byte Parameter 2 for the effect next x next y OFFSET XXXX Channel volumes: ============================== Here are the beginning volumes for each channel. One volume takes one byte, which is from 0 to 255 (default=255,max) and 32 channels are always stored. So, the size of this part is always 32 bytes. OFFSET XXXX Raw wave data of samples: ======================================= Only modules have this part of an EMD-file, in songs there is no sample raw data. All samples are stored here without any marks between them. Samples are stored so that the first sample here has the smallest number. All data is signed 16-bit, which is same as 16-bit wav files. Sample data can also be in coded format (read the module-info part). End of EMD-file. ======================================================================== Currently supported effect commands of ABT: ======================================================================== There will be more effect commands in the near future, but here are all the basic commands for ABT, which are already ready (midi efx-commands aren't here yet) : Effect command is a number between 1 and 99. One effect can have maximum 2 parameters, both 0-99, or one parameter from 0 to 9999 (par1*100+par2). Efx# Description and parameters ---------------------------------------------------------------------------- 1 Set volume 0-4095 (values is exponential) 11 Set linear volume 0-511 3 Set tempo 0-???? (beats per minute, 125=default, 8 rows = beat) 5 Set pan-value for a channel: param1=channel#(0-31), if param1>31 , then current channel (where the efx-command is) will be used for effect. param2=pan-value from 0(left)-15(right) 17 Break pattern: This efx-command jumps to the selected row of next pattern in the song. (next row after efx isn't played) param1=row# of next pattern 18 Position jump: Changes the song position and the row# played next. param1=which pattern in pattern list (0=first) param2=which row 2 Volume slide: param1&2=new volume (0-4095) (slide is exponential) 82 Set length of a volume slide: param1=how many rows volume slide will take if tempo isn't changed. (0 is also 1 row) This variable is independent for each of the channels. 6 Pitch up: param1=How many halfnotes upward, param2=length of bend in rows with current tempo (0 is same as 1) 7 Pitch down: Same as pitch up, but downwards 13 Load&remove sample from gusdram: param1=number of the instrument to be loaded throught DMA (0=no sample loaded) param2=which instrument is unloaded from the gusdram (0=no instrument unloaded) 22 Set frequency: If this efx-command is on the same row with note, note isn't played, but only frequency of currently playing sample is changed to the given note. 15 Effect channel play: Plays unloaded sample from EMS throught DMA. ( This efx-command isn't used yet) 84 Set Vibrato waveform: param1: 0=sine, 1=saw, 2=sqr, 3=ramp down 4 Vibrato: param1=Depth 0-99 (63=halfnote to both directions) param2=speed of the vibrato 0-99: (param2/5)Hz 1/5Hz - 20Hz 34 Vibrato off 19 Arpeggio: middle note = basenote+param1*halfnote high note = basenote+param2*halfnote Major : 190407 Minor : 190307 89 Set speed of the arpeggio param1=how many notes played during one row of pattern. (default=3, the whole chord played on every row of pattern) (0 is same as 3) 9 Tremolo (always sine) param1=depth/4 -> Volume can varies from 0 to 400 in both directions. param2=speed of tremolo(same as vibrato) 38 Tremolo off 24 Note delay: param1:delay 0-99, "100"=next row Note: All the effects that control the frequency of the sound can be used simultaneously with effects that control the volume.