Contents
Savage Beeper Engine
This engine provides two tone channels and one drum channel with a total of five percussion sounds. The tone channels have a variety of effects available: Glissando, skew, XOR, ornamentation (arpeggios) and an FX tone generator for generating additional sound effects when combined with the other effects settings.
Special thanks are due to Barmaley_M for doing the painstaking work of reverse engineering this complex engine, and to Shiru for translating his work to English so that I could make use of it in Beepola.
Effects
All of the effects can be applied to both channel 1 and channel 2
as required, however there are some interactions between the channels when
effects are applied to both channels simultaneously, or more than one effect
is applied to a channel at one time. Values for each effect are entered in
hexadecimal (00 to FF) in the appropriate editor column, with a value of 00
turning the effect off. The "FX" column is boolean and speficies whether the
sound effect generator should be on or off for the selected row.
Glissando Effect
Glissando causes the pitch of a note to slide downwards at the specified
rate. The main limitation of this effect is that it will automatically stop
when a new note appears on either channel. If glissando and
ornamentation are combined on a single row, the glissando effect is only
applied to the first note of the arpeggio.
One interesting use of this effect is to create "falling pitch" drum sounds, using a high glissando value such as FF, together with a high pitch note in the top octave, perhaps also coupled with a skew effect. Because these effects appear in a tone channel, that can be used alongside other percussion effects in the drum channel.
Skew and Skew XOR Effects
Skew affects the timbe of all subsequent notes in the channel by
skewing the frequency of one of the two tone generators for the channel,
to produce a more complex waveform. The XOR column has a value that is XORed
with the skew parameter on every row, and this result becoming the new skew
value for that row.
The skew and xor columns can be used freely in either channel without affecting the timbre of the notes in the other channel, and can be used with either glissandi or ornamentation effects without any adverse effects.
Skew and xor values of 00 produce a simple square-wave tone.
Ornament Effect
The ornamentation column allows one of up to 31 user-defined
arpeggios to be selected for the current, and all subsequent, notes in the
channel. Ornaments are defined in the ornament editor as a sequence of
offsets (in semitones) from the root note, and a single ornament may contain
up to 255 offset values. However, the total number of offsets
defined across all ornaments used in a song must also not exceed 255. So you
could have 31 ornaments of 8 notes or fewer, but only 4 ornaments of 64
notes in length, or 1 of 255 notes in length.
Ornament notes are played at duty cycle of 50Hz. An ornament value of 00 specifies "ornament off" or "no ornament".
The use of ornaments on one channel has a fairly profound effect on the sound of notes in the other channel, creating a 50Hz buzz on the second channel if no ornament. Different ornaments can be used on each channel simultaneously, which can sometimes mask the 50Hz buzz.
Ornaments and glissandi don't really work together, since the ornament is disabled as soon as the second note of the ornament is played (regardless of whether the ornament is on the same channel as the glissando or not).
FX Column
The FX column is boolean - it can be either on or off for a
given row. Switching the FX generator on has a dramatic effect for the
note on which it occurs, which can be used along with the other effects
columns to generate a range of synthesised drum effects, and various
siren/whistle/phaser-type effects. The FX generator behaves differently for each
of the 2 channels, and the channel with FX set to "On" can have its sound modified
considerably by whatever sound is being generated on the other channel.
Some
examples of the many effects that can be generated are:-
Description | Chan 1 | Glis | Skew | Xor | Orn | FX | Chan 2 | Glis | Skew | Xor | Orn | FX |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Bass Drum | F-2 | 09 | -- | -- | -- | On | --- | -- | -- | -- | -- | -- |
Car Accelerating | C-1 | FF | -- | -- | -- | On | --- | -- | -- | -- | -- | -- |
Siren | --- | -- | -- | -- | -- | -- | C-3 | -- | -- | -- | -- | On |
Creaking Door | --- | -- | -- | -- | -- | -- | C-2 | FF | -- | -- | -- | On |
Long Wave Radio | C-5 | -- | -- | -- | -- | -- | G-5 | FF | -- | -- | -- | On |
You are encouraged to experiment!
General
A song may contain up to 127 unique patterns, and each
pattern may contain up to 126 notes per channel. The tempo and length of
each pattern may be set individually.
The lowest valid note value is C-1 and the highest is B-5. However the bottom three notes of octave 1 are significantly detuned (more than a semitone each) - this is how the frequency table from the original engine was laid out, and it has been decided to preserve the sound of the original engine fully by keeping these values. No other significant detuning appears to be present.
Useful POKEs/Addresses
58 bytes into the player routine is a LD HL,nn instruction
which points to the start of the song data. Therefore, to select
a different song to play:-
10 LET PlayerAddr = 60000
20 LET SongAddr = 62000
30 POKE PlayerAddr+59,SongAddr - 256 * INT(SongAddr / 256)
40 POKE PlayerAddr+60,INT(SongAddr / 256)