Beepola Help



Keyboard commands

Beeper Engines

Compiling Songs

Ripping Songs

*.bbsong file format



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.

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!

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)