306 lines
14 KiB
Plaintext
306 lines
14 KiB
Plaintext
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 <reserved> 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 <reserved> (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 <reserved>
|
||
|
||
|
||
|
||
|
||
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 <reserved>
|
||
|
||
|
||
|
||
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 <reserved>
|
||
|
||
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.
|
||
|