squeekerplus
Folders and files
| Name | Name | Last commit date | ||
|---|---|---|---|---|
parent directory.. | ||||
******************************************************************************** SQUEEKER PLUS by utz 07'2016 * www.irrlichtproject.de ******************************************************************************** ABOUT ===== Squeeker Plus is a 1-bit/beeper engine for the Sinclair ZX Spectrum. It is based on an original concept developed by zilogat0r for his Squeeker beeper engine. FEATURES ======== - 4 tone channels, mixed PFM/PWM synthesis - 2 interrupting click drums - per-tick duty cycle envelopes - channels 1 and 2 can play fixed-pitch noise instead of square waves - channel 4 can use a fast pitch slide for drum simulation - mixing at approx. 9511 Hz. REQUIREMENTS ============ The following tools are required to use the xm2octode2k16 utility - an XM tracker, for example Milkytracker (http://milkytracker.org) or OpenMPT (http://openmpt.org) - pasmo or a compatible Z80 assembler (http://pasmo.speccy.org) pasmo must be installed in your search path, or must reside within the squeekerplus folder. COMPOSING MUSIC =============== You can use the included XM template to compose music for Squeeker Plus. However, this will only give a very rough approximation of how the music will sound on an actual ZX Spectrum, even more so since not all of the engine's features can be simulated properly in the template. Also, Squeeker Plus has The following restrictions apply: - The number of channels is fixed. - The BPM value is fixed. The Speed value can be changed, however. - Only the provided samples may be used; instruments can be cloned however (see below). - All other effects are ignored, except for the following: Bxx - set loop point E5x - set detune (only effective for the current note, ignored if set without a note trigger) Fxx - set Speed (= number of ticks per row, xx <= $1f). It is reset to the global value at the beginning of a new pattern. - Click drums should be used in channel 5/6. Only one click drum can be active on a given pattern row. - Click drums and the noise instrument have their pitch fixed at C-4. A duty cycle envelope can be applied to tone, noise, and pitch slide instruments. This can be done in two ways: 1) By setting a value in the volume column ($40 is assumed if no value is set). 2) By enabling the volume envelope in the instrument settings. This method will override setting the duty via the pattern volume column. Envelope looping and sustain are not supported. Note that running all channels with high duty cycle values will cause the engine to overload, effectively decreasing overall sound quality. Very low duty cycle settings may mute the current note. The actual threshold at which dropouts will occur depends on the note frequency. In order to use multiple duty cycle envelopes, you will want to clone the provided sample instruments. To do so, simply load one of the provided .xi instruments into a free instrument slot. You may rename cloned instruments, but you may not change the sample data. The click drums cannot be cloned, and must remain in slots 1 and 2. CONVERTING ========== Running one of the provided compile scripts will convert your .xm file into a .tap file that you can then load on a ZX Spectrum or an emulator. compile.sh/.cmd will accept the following optional parameters, in this exact order: -t "song title" -c "composer name" -a address* Example: compile.cmd -t "My Song" -c "Great Musician" This will create a BASIC screen which reads "My Song by Great Musician". Alternatively, you can use interactive-compile.cmd/.sh to interactively set these parameters. *The compile address will default to 32768 ($8000), but can be set to any other location in uncontended RAM. MUSIC DATA ========== The music data for Squeeker Plus is split in three sections: Sequence, patterns, and duty cycle envelopes. The sequence section must come first. It consists of a list of pointers to the patterns, in the order in which they are meant to be played. The list must be terminated with a 0-word. Also, a label named "loop" must be present; this specifies the location the player will loop to once it has completed the sequence. The shortest possible sequence section is thus: loop dw pattern0 dw 0 After the sequence section, patterns and duty cycle sections will follow in arbitrary order (even mixing the two is possible). Patterns consist of one or more rows of note data. The rows are constructed as follows: 1) speed + control byte A The speed is given as (ticks*256). Set bits in the control byte have the following effect: bit 0 - skip freq/env reload for ch1 bit 2 - skip freq/env reload for ch2 bit 6 - end of pattern bit 7 - skip freq/env reload for ch3 On the first row of a pattern, control byte A is always 0, ie. all channel frequencies and envelope pointers must be set. 2) noise enable control ch1/2 The high byte sets noise for ch1, the low byte sets noise for ch2. $cb to enable noise, $00 to disable it. 3) frequency ch1 4) envelope pointer ch1 5) freq ch2 6) env ch2 7) freq ch3 8) env ch3 9) control byte B The high byte is always 0. the bits in the low byte have the following effect: bit 0 - enable pitch slide ch4 bit 2 - trigger click drum 1 (kick) bit 6 - skip freq/env reload for ch4 bit 7 - trigger click drum 2 (hihat) 10) freq ch4 11) env ch4 Each entry is one word long. Entries 1, 2, and 9 are mandatory, the rest is optional, their presence depending on the control bytes. If control byte A is $40, no further data follows for this pattern. Duty-cylce envelopes consist of one or more single-byte entries with values between $00 and $40. They must be terminated with a $80 byte. The shortest valid envelope is thus env1 db $40,$80