------------------------------------------------------------------------------------------------ TheTracker, 'testing', instructions and workfile, updated okt, 1st '98 - (w) by Groepaz/Hitmen ------------------------------------------------------------------------------------------------ CONTENTS: - intro - HyHo! - whats new - limitations - known bugs - main screen - sid display - track - blocks - instruments screen - digis - instruments - filter settings - preferences screen - latest problems - to do ----------------------------------------------------------------------------------------------- Intro ----------------------------------------------------------------------------------------------- Notice this is not a finished tool, however... it was spread for you to check out and to have a chance to tell me your ideas, comments, complaints.... 8) i thought keeping internal tools for myself aint to cool these days and i guess this way i will be able to make it even cooler in the end ;=) If you have comments, suggestions, questions, wild ideas or whatever, READ the TO DO section and tell me what to add there so i wont forget :=) ... also some of your test 'results' instruments/Patterns that is ;)))) are welcome ;) at this state of development, freeze the shit or save mem from $0800 to $d000 - restart at $2800 I know the EDITOR doesnt contain any useful stuff yet, but for now it serves its purpose which is editing/testing some data in the player the PLAYER is still pretty limited for now, also due to the memory reorganizing shit, but the missing features/effects will be added one after the other. With any new test-version there prolly will always be additions in both the player and editor, check the 'whats new' section for recent changes This file does always contain latest changes on both the editor and player, but may always cover a lot of features which are not implemented yet, just to have it all written down somewhere so i dont forget about the feature YOU requested :)))) - if you find something here thats obviously WRONG, please tell me so i can correct it... PLEASE notice the editor does no range checking in any way for now, so take care of it yourself, if theres some strange data in the pattern/table/whatever, it wont be whise to modify it, it may be part of the code ;))) i'll try to organize the memory as soon as the player comes close to its final state ... thanx for testing, m8 ... "... finally it will kick ass, i promise ;)" gpz/hit groepaz@geocities.com [pReZz SpAc3] ;=) ----------------------------------------------------------------------------------------------- Hy's and Ho's ! ;=) ----------------------------------------------------------------------------------------------- Some greets must fly to ... GRG/Shape and Zyron/F4CG for checking this piece of junk and sending some interisting suggestions and ideas ... Dont stop ;=) AMJ/Side-b for pointing me to the docs on how to build that simple midi interface. ----------------------------------------------------------------------------------------------- whats new ----------------------------------------------------------------------------------------------- v0.10 - Pitch-FX added - switched to 1 framed player for a while because of easier debugging.... this will sooner or later change again - started cleaning up all the junk from the editor code, so adding features will be much easier in the future - got some nice docs about MIDI, its quite easy so i guess there will *definetly* be some MIDI-support sooner or later (wouldnt it be just crazy to create your tunes on a real keyboard? ;=) v0.0f - you may be happy to know that i decided to make the editor somewhat more useful before i continue on the player itself... - playing/entering notes via keyboard added... somewhat fucked though for now ;=) although notes are beeing played in all 3 voices they will only be entered at cursor position, this will ofcoz change l8r... - some keys added/changed v0.0e - waveform-table added - memory-organizing has been almost done, if you cant deal with the limitations below, complain NOW 'coz i will add the save/load shit soon and after that KEEP the format of the data file for a while so you can load your tune with future versions... - made the main-menue, mainly to make the KILL function accessable ;=) - recoded the sample player, faster responding oszilloscope code (not that anyone NEEDS that, but it looks nice anyway ;=) v0.0d - a simple pulse sweep was added - rewrote keyboard handler, actually made it usable ;=) it's prepared for later multi-key recording as well, so i hope it was worth all the hazzle with it... v0 - a first crappy version was spread to some ppl ----------------------------------------------------------------------------------------------- Limitations in this Test-Version (don't exceed these limits!) ----------------------------------------------------------------------------------------------- max track-length is $ff (including $ff) $40 blocks with a length of $22 bytes (incl $ff mark) ($10 notes) $40 digi-blocks with a length of $11 bytes ($10 steps) $40 filter-blocks with a length of $11 bytes (including $ff, > $10 steps) $20 instruments $20 filter definitions $20 fx tables with a length of $20 bytes (including $ff end-mark) $20 digi-instruments - max nmi speed is about $a0 (ca 6khz) note: there exists NO block/instrument/table whatever with the number $00 ! (for eg blocks are numbered $01...$40 and NOT $00..$3f - got it? ;=) keep this in mind, in some cases (eg in the track) an accidently entered $00 will crash tha shit ;=) ----------------------------------------------------------------------------------------------- known bugs ----------------------------------------------------------------------------------------------- - again: NO range checking anywhere yet (need to finish organizing memory), so you are virtually able to scroll around in the code and modify it, set unrealistic nmi speeds etc... - only way to enter a specific pattern is to enter its number in the track, start/continue play, stop in the pattern and enter it... kinda annoying for now, i know...... this will change when the editor code has been cleaned up .... - fast-forward is somewhat fucked up.... whatever, i will track down that nasty bug l8r, if ya manage to crash the shit, just restart at $2800 - Notes played with the Keyboard actually dont exactly sound like if the were played back by the player (certain fx routines behave somewhat different) - i thinks its ok for now though so this is also subject to be fixed later.... ----------------------------------------------------------------------------------------------- (X) these features are not supported yet ----------------------------------------------------------------------------------------------- The Main Editor Screen ----------------------------------------------------------------------------------------------- 1st section, SID monitor this display mostly represents the current state of all SID registers taken from the players internal buffers +- Voice1,2,3 Envelope, Pulse, Frequency ! GATE xxx ADSR xxxx xxxx xxxx OSC3 xxx <- Oscillator3, read from SID TEST xxx PULS xxx xxx xxx ENV3 xx <- Envelope3, " WAVE xxx FREQ xxxx xxxx xxxx 3OFF x <- Voice3 off bit SYNC xxx _scope digichannel_ MVOL x <- Main Volume RING xxx ^^^^^^^^^^^^^^^^^^^ MSPD x <- Tune Speed FILT xxx TYPE xxx CUT xxxx RESO x ! ! ! ! ! ! ! +-- Filter Resonance ! ! +------------ Filter Cutoff Frequency ! +-------------------- Filter Type Bits (Hi/Band/Lo) +------------------------- Voice 1,2,3-Gate Trigger Bit, Test/Lock Bit, Wave nibble, Oscillator Sync Bit, Oscillator Ring Bit, Filter Enabled Bit note: if ya switch the keyboard-mode (space) the keyboard layout and some other info will be displayed here... just try it ;) 2nd section, the Track monitor headline: xx -- xx xx ON xx xx KB xx x xx xx ! ! ! ! ! ! ! ! ! ! Track Counter Voice1 --------+ ! ! ! ! ! ! ! ! +-- Track Counter Filters Voice Mode (off/play/rec+play) -+ ! ! ! ! ! ! ! Current Instrument, Voice1 --------+ ! ! ! ! ! +----- Track Counter Digi Channel Track Counter Voice2 -----------------+ ! ! ! +-------- Voice3 off bit Current Instrument, Voice2 -----------------+ ! +---------- Current Instrument, Voice3 +---------------- Track Counter Voice3 track editor: x-xx-xxx+x-xx-xxx+x-xx-xxx-x+xx+xx ! ! !!! ! ! !!! ! ! !!! ! ! ! Pattern Transpose, Voice1 --+ ! !!! ! ! !!! ! ! !!! ! ! +-- Pattern Number, Filters Pattern Number, Voice1 --------+ !!! ! ! !!! ! ! !!! ! +----- Pattern Number, Digis Voice1 Filter Enable ------------+!! ! ! !!! ! ! !!! +-------- Voice3 off bit (X) Voice1 Ringmod Enable ------------+! ! ! !!! ! ! !!! Voice1 Sync Enable ----------------+ ! ! !!! ! ! !!! ! ! !!! ! ! !!! Voice2 ------------------------------+--+-+++ ! ! !!! ! ! !!! Voice3 ---------------------------------------+--+-+++ - voice1/2/3,filter and digi track have their own counters, you may vary your pattern and track lengths as you like. 3rd section, Pattern editor xx-xxx xx-xxx xx-xxx xx xx ! ! ! ! ! ! ! ! Instrument, Voice1 --+ ! ! ! ! ! ! +--- Number of Filter FX definition $ff Blockend ! ! ! ! ! +------- Number of Sample Instrument Note, Voice1 -----------+ ! ! ! ! --- release(waveoff) ! ! ! ! === hold(waveon) ! ! ! ! END Blockend ! ! ! ! ! ! ! ! Voice2 ----------------------+--+ ! ! Voice3 ------------------------------+--+ Keys: <- : switch screen on/off F1 : Init Tune and start playing F3 : Stop playing F5 : continue playing F7 : fast forward Return : toggle Track/Block Space : toggle keyboard mode this will switch to piano-style keyboard layout to play/enter notes. notice that the keys not covered by the piano-keys will still function as usual C= + O : Switch Octave for Keyboard C= + 1..5 : Voice Mode -- : voice always silent on : 'normal' mode, notes from the patterns are beeing played and ya can enter some when the cursor is over the note-row kb : voice used for multi-key record (existing notes are still beeing played) C= + I : to instrument/fx screen C= + M : to main menue Cursor-Keys : Move around +/- : inc/dec value under cursor C= + +/-: inc/dec tune main speed 0...f : enter value = : in patterns: enter 'hold' command delete : in patterns: delete note (enter 'note-off' command) ---------------------------------------------------------------------------------------------- The Instrument Screen ---------------------------------------------------------------------------------------------- Samples: -------- DIGI#xx START xxxx STOP xxxx SPEED xx ! ! ! ! ! ! ! +--- nmi-playback speed (see below) ! ! +------------- end of sample in memory ! +----------------------- start of sample in memory +--------------------------------- sample number - during testing phase, you can load samples manually ... theres free space from 1000-2000 - Format of the samples is FOUR bit unsigned raw, and only the low nibbles of the bytes are used (for speed advantage), (the high nibble MUST be zero! <= NOT by now, so just use common 4bit samples, ill later let you load/convert usual nibble packed samples) - max playback rate is about 6 kHz. ($a0 speed) with 8-speed playback speed/pitch in percent, related to a sample which was originally sampled at 11.025khz (44,1khz sample resampled to 25%) speedbyte/nmispeed/playback pitch $ff 3863 Hz $fc 3909 Hz $f6 4005 Hz $f0 4105 Hz $eb 4192 Hz $e5 4302 Hz $e0 4398 Hz $db 4498 Hz $d6 4604 Hz $d2 4691 Hz $cd 4806 Hz $c9 4901 Hz $c5 5001 Hz $c1 5104 Hz $bd 5213 Hz $ba 5297 Hz $b6 5413 Hz $b3 5504 Hz 5512 Hz ; 100% $b1 5566 Hz $b0 5598 Hz $ad 5695 Hz $aa 5795 Hz $a7 5899 Hz $a4 6007 Hz 6063 Hz ; 110% 6615 Hz ; 120% $80 7697 Hz 8269 Hz ; 150% 11025 Hz ; 200% note about using samples: you may have noticed that i didnt implement the samples in a tracker-style way, and i dont really want to either, for a few reasons: 1st of all i made the sample voice because i liked having some decent drum sounds in the first place without having to waste one beautyful sid-voice, and for those one doesnt really need to play different pitches at all. On the other hand for a cool melodic instrument you had to use a few different samples anyway, so i dont think that's a real disadvantage, even if its maybe a bit more tricky to handle. Instruments: ------------ INST#x DRUM x HARD x STAK x FILT xx ! ! ! ! ! ! ! ! ! +---- (X) filter settings for instrument ($00= use track filters) ! ! ! +------------ (X) 'stakkato' notes, perform waveon/off immediatly ! ! +------------------- (X) 'hard' retrigger, reinit test bit 3 frames before note ! +-------------------------- (X) sound is drum sound, always plays fixed frequency from ! the 'TUNE xxxx' setting below +--------------------------------- Instrument Number WAVEON xx WAVEOFF xx - Wave during note is hold/after it was released SPD xx TAB#xx [xx xx xx xx xx xx xx]xx ! ! ! ! ! ! ! +-- postion in table ! ! +-------------- waveon table ! +--------------------------- waveon table number ($00 table off) +---------------------------------- table speed ($01 max frame rate) PULSE xxx ADC xxx START xxx STOP xxx ! ! ! ! ! ! ! +---- Pulse Count Stop ! ! +------------- Pulse Count Start ! +----------------------- Pulse ADC ($00 pulse-sweep off) +------------------------------- instrument Pulse (initial when table is used) SPD xx TAB#xx [xxxx xxxx xxxx xxxx ]xx ! ! ! ! ! ! ! +-- (X) postion in table ! ! +-------------- (X) Pulse table ! +--------------------------- (X) Pulse table number +---------------------------------- (X) table speed ($01 max frame rate/$00 table off) ADSR xxxx --- instrument ADSR (initial when table is used) SPD xx TAB#xx [xxxx xxxx xxxx xxxx ]xx ! ! ! ! ! ! ! +-- (X) postion in table ! ! +-------------- (X) ADSR table ! +--------------------------- (X) Pulse table number +---------------------------------- (X) table speed ($01 max frame rate/$00 table off) TUNE xxxx ADC xx START xxxx STOP xxxx ! ! ! ! ! ! ! +--- Frequency Count Stop ! ! +-------------- Frequency Count Start ! +------------------------ Frequency ADC ($00 freq sweep off) +-------------------------------- instrument detune, fixed frequency on drum instruments SPD xx VIB#xx [xxxx xxxx xxxx xxxx ]xx ! ! ! ! ! ! ! +-- (X) postion in table ! ! +-------------- (X) Frequency table ! +--------------------------- (X) Frequency table number +---------------------------------- (X) table speed ($01 max frame rate/$00 table off) SPD xx ARP#xx [xx xx xx xx xx xx xx]xx ! ! ! ! ! ! ! +-- postion in table ! ! +-------------- Arpeggio table (halftone steps) ! +--------------------------- Arpeggio table number +---------------------------------- (X) table speed ($01 max frame rate/$00 table off) Filter-FX --------- FILT#xx MODE xxx FREQ xxxx RESO x ! ! ! ! ! ! ! +------ Strength of filter fx (initial when fx is used) ! ! +-------------- Filter CutOff frequency (initial when fx is used) ! +------------------------ Filter Pass Mode +-------------------------------- Number of Filter definition table FREQ ADC xxxx START xxxx STOP xxxx ! ! ! ! ! +------ Filter Frequency Count Stop ! +----------------- Filter Frequency Count Start +--------------------------- Filter Frequency ADC SPD xx TAB#xx [xxxx xxxx xxxx xxxx ]xx ! ! ! ! ! ! ! +-- (X) postion in table ! ! +-------------- (X) Filter Frequency ! +--------------------------- (X) Filter Frequency table number +---------------------------------- (X) table speed ($01 max frame rate/$00 table off) RESO ADC x START x STOP x ! ! ! ! ! +-------------- (X) Filter Reso Count Stop ! +--------------------- (X) Filter Reso Count Start +----------------------------- (X) Filter Reso ADC SPD xx TAB#xx [xx xx xx xx xx xx xx]xx ! ! ! ! ! ! ! +-- (X) postion in table ! ! +-------------- (X) Filter Reso ! +--------------------------- (X) Filter Reso table number +---------------------------------- (X) table speed ($01 max frame rate/$00 table off) Keys: <- : switch screen on/off F1 : Init Tune and start playing F3 : Stop playing F5 : continue playing F7 : fast forward C= + I : back to track/pattern editor Cursor-Keys (right shift ONLY!) : Move around +/- : inc/dec value under cursor c= +/- : inc/dec tune main speed 0...f : enter value RETURN : toggle menue level SPACE : toggle keyboard mode C= + O : Switch Octave for Keyboard ---------------------------------------------------------------------------------------------- Preferences Screen ---------------------------------------------------------------------------------------------- Keys: RETURN : go to editor k : kill + a : all (all of the following...) s : song (tracks+blocks) d : digis (SETTINGS only, samples remain in memory) f : filtersets (filtersettings) i : instruments (instruments+fx tables) ---------------------------------------------------------------------------------------------- Latest Problems ---------------------------------------------------------------------------------------------- * How to implement the 'glide/slide/portamento' things? Generally i came to a solution, it may just be interisting if it would actually be useful ;) so a slide would be like this: 25*c-1 '25' is slide speed (80... may be negative) '*' is the command to start the slide 'c-1' is the note to start with well, actually this should be in ANY way flexible, as the slide could be started at any time, during a holded note, with the start of a note etc... you could use it in the pattern at any position. BUT theres a drawback in this method! As the slide uses the byte, where you normally define the instrument (to hold the slide speed) it will always use the actual instrument. or, in other words, IF you want to play the slide with a different instrument then you used before in that voice, you need ONE note free before the slide, so you could make a construction like... 01 c-1 00 d-1 00 e-1 ...etc 00 c-2 02 --- <-- free note needed to change the instrument before the slide 25*c-1 ...etc So well... in my opinion its no real disadvantage when composing, and a BIG advantage for me when coding the player 'coz i can keep up with my 2bytes per note structure AND avoiding things like having a slide command in a line ONLY (so the player must skip the line and read the next as well) ... well, i hope this will be ok for all. * Changing the Layout well, i have to change the tracker-layout slightly for a few reasons (like faster/shorter player code as well as nicer handling) ... so a sid-voice will look like this 02 ON 01 (aktual position/voice on,off/loop pointer) 0 01 000 --- 0 02 000 --- 0 03 000 0 ff 000 02 20 01 (aktual instrument/pattern length/pattern speed) - no more $ff needed at the end of patterns 02 00--- 03 01f#2 04 00--- 05 02f-2 --- 06 00=== --- 07 00=== 08 00--- 09 00--- 0a 00--- | | | | | +- note/command | +---- instrument/command data +-------- position sad but true but changing this requires changing both editor and player code, so it'll take a while... (i am sorry but that will also delay the save-option somewhat again...) ---------------------------------------------------------------------------------------------- TO DO: ---------------------------------------------------------------------------------------------- instruments: default settings - drum sound (always fixed frequency) - default filters - stakkato notes (perform Wave on/off) - force ADSR retrigger (perform Wave off/on) - hard restart (set/clear testbit 3 frames before note) effects on Pulse: - table for pulse - speed-byte effects on Envelope (ADSR) - table for Envelope - speed-byte effects on Frequency - vibrato (table) - speed-byte for arpeggios - speed-byte for vibrato Filter fx: - freq-table - speed-byte for freq-table - reso count up/down - reso table - speed-byte for reso-table Different Modes for table-based fx - count up pointer - count up pointer, triggered by a voice - pointer is OSC3 - pointer is ENV3 - last byte $fe stops fx - last byte $ff loops table Different Modes for counter-based fx - setting instrument in pattern resets counter to initial value - count up/down - count up/down, triggered by a voice - count down, triggered by a voice - count up, triggered by a voice - adc is OSC3 - adc is ENV3 Track: -loop command - c= + 1..5 switch voices-modes - start playing from any position - let one create any loop to be played Blocks: -slide/glide/portamento -row numbering in the block editor preferences-screen: - let one edit the raster-table for the player (how many calls to player per frame) - let one deactive certain sound fx in the player to save rastertime, maybe an automatic function that scans your instruments for used fx - load samples - load/save tune