This machine does not exist yet, but I have decided to write a design document on it, in order to highlight some of my thoughts. It's an attempt to get a tracker that doesn't click, doesn't kill the attack of percussion and resamples properly unlike MTrk and UTrk.
- High quality output with no sound artifacts
- Easy to use
- Fairly decent performance overhead
- Works in the current version of Buzz (with clone compatibility as an added bonus)
- Once the project has taken shape and has matured, it will become open-souce
- The most commonly used commands will be turned into global parameters or (only if it really makes sense) a per-channel parameter. This will make the pattern editor rather bloated though. We're trying to keep parameters as global rather than per-channel in order to reduce screen space consumption a bit.
Need to have features
- Support for all 16 bit int, 24 bit int, 32 bit float uncompressed mono/stereo .wav files.
- Virtual channels and intelligent Global and Track handling. If you play a long sample three times in a row, e.g. C-D-E, you will hear all three. If you then use a "volume slide down" command, you will hear all three samples fade out. To do this, each virtual channel must remember what physical channel started it, and react to any commend on that physical channel.
- take care that 1 sample can be active with the same note on multiple voices..
- An intelligent method of avoiding clicks. When switching to or from audio that has lots of treble, no de-clicking needs to take place at all. (Maybe the tracker can decide? If not, give the user an easy way to enable/disable declicking.) Also, declicking can be done by fading the previously playing sound to silence over 0.5 to 5 ms, before the new sample even starts playing, if we can predict when that happens.
- All commands should exist in two versions placed at adjacent numbers so that it is easy to remember both: Sticky and temporary. Temporary commands (even command numbers) affect the tick or local area they're applied to. Sticky commands (same number but +1) are active until you specifically stop it. An example of this could be "vibrato": Let's say this command is called "14", then the permanent way to enable vibrato would be 14+1 = the "15" command.
- This tracker must be able to handle sample offset, positive/negative note-delay and probability on the same note.
- Different resampling algorithms: Fast, Medium, Good (aliasing free). This setting must be stored in a global way, so that if you move Buzz to a new PC, you can easily change this setting for all songs at once.
- Better envelope controls. I want a "volume decay" command where you can change both the length (in milliseconds) and the decay curve (see graphics).
- When all volume calculations and manipulations (such as setting volume, randomizing volume etc.) are done, the volume must by multiplied by itself. This is because the linearity of human perception of volume. -12 dB sounds way closer to "half volume" than -6 dB.
- When panning far to one side, panning should be 3 dB louder in that side to compensate for lost amplitude. Also, panning should be switchable to use the Haas effect using some kind of global parameter (same sort of global parameter as used for choosing Resampling quality). This means that sound coming from the left side hits the left ear before the right ear. The delay is 35 ms at it's most extreme.
Nice to have features
- Being able to handle any combination of commands.
- MIDI support
- Support for Wavetable features like multisample (currently broken..) and Envelopes (currently not really user friendly..)
- Rudimentary Sample Editing functionality in some GUI
- High quality pitch-Shifting and time-ttreching (in addition to the high quality resampler that is a must)
- Support for all .wav formats
Suggested parameters and commands
- Decay length in milliseconds (maximum value is default and means no decay)
- Decay curve shape (see above image) goes from a very logaritmic low slope to a very high slope. The default is not linear but a "normal" logaritmic decay (the middle curve on the decay curve image.)
- Chord probability. Works like the the "Probability" command (15), with the exception that the same random number is used for all tracks. This way, you can use Probability on an entire chord, and either the entire chord is played, or it is not. 00=Never plays, 80=Plays 50% of the times, FF=All notes always play.
- Note (well duh!)
- Sample number. Not setting this means re-using the last set sample number for this channel. This is needed because of PeerControl machines.
- Volume. Setting this without playing a note will change the volume of the previously playing sample(s) to the current volume. Remember all virtual channels when coding this.
- Effect command (Yes, I really think we can do with only one because all commands now exist in "permanent" versions.)
- Effect value
- 02 xx Slide up xx notches for this tick
- 03 xx Keep sliding up xx notches
- 04 xx Slide down xx notches for this tick
- 05 xx Keep sliding down xx notches
- 06 xy Vibrato, where x=speed, y=depth
- 07 xy Vibrato until stopped, where x=speed, y=depth
- 08 xx Panning, 0=left, 80=middle, FF=right (temporary does not make sense here)
- 09 xx Same as 08
- 10 xx Sample offset, 00=start, 80=middle of sample, FF=end of sample
- 11 xx Same as 10, but affects all notes played on this track from now on
- 12 xx Note delay. 01=-50% of a tick, 80=no delay, FF=50% of a tick delay (Yes you can do negative note delay now)
- 13 xx Same as above, but the effect stays on for this track until you issue a "13 80" command.
- 14 xx Probability. 00=never, 80=50% of the times, FF=always
- 15 xx Same as 12, but affects all notes played from now on
- 18 xx Loop fit. xx is the number of ticks the waveform's loop should take to complete. If you change the tempo, the frequency is adjusted accordingly, so that the loop still fits (like mtrk's 12 command)
- 19 xx Same as above, but stays on for all future samples in this track.
- 20 xx Randomize volume by xx.
- 21 xx Same as above, but effects stays on forever until you use "21 00"
- 22 xx Randomize note delay by xx.
- 23 xx Same as above, but effects stays on forever until you use "23 00"
- 24 xx Randomize pitch by xx.
- 25 xx Same as above, but effects stays on forever until you use "25 00"
- 30 xx Retrig samples. xx is the amount of retrigs per tick. A value of "3" will play the sample three times.
- 31 xx Retrig all played samples from now on until we use the "31 01" command to reset things.
- C, C#, D, D#... offsets just like MTrk for peer control microtuning stuff (who was it that made this system? I forgot, but it's interesting and cool.)
Up for discussions
- Change most commonly used commands into real parameters and only keep the obscure commands as commands (commands is an ancient concept anyway, and PXP can hide/show relevant things anyway.)
- Pick a list of essential and nice to have parameters / commands from http://www.buzzchurch.com/viewtopic.php?t=292 and http://www.buzzchurch.com/viewtopic.php?t=176