mirror of
https://github.com/tildearrow/furnace.git
synced 2024-12-05 18:57:27 +00:00
78 lines
4 KiB
Markdown
78 lines
4 KiB
Markdown
# PowerNoise instrument editor
|
|
|
|
the PowerNoise instrument editor consists of two tabs.
|
|
|
|
## LFSR-based synthesis
|
|
|
|
PowerNoise employs LFSR-based synthesis for the noise channels, using linear-feedback shift registers for sound generation.
|
|
|
|
a linear-feedback shift register is one method used for random number generation.
|
|
it works by shifting a sequence of binary numbers (bits), taking the last bit into the output. then one of the bits is either pushed back into the register, or combined with another, doing a XOR (exclusive or) operation and then being pushed back.
|
|
|
|
think of it as a conveyor carrying glass bottles. each bottle may be empty or carrying water.
|
|
the bottle at the end is taken. if there's water, then the output is 1. if it's empty, the output is 0.
|
|
depending on the LFSR configuration:
|
|
- a bottle is pushed into the conveyor. it is either empty or filled with water depending on the bottle at a specific position in the conveyor (this is called a "tap"), or
|
|
- two bottles at specific positions ("taps") are looked at and combined as follows:
|
|
- if the bottles are identical, an empty bottle is pushed.
|
|
- if one bottle has water but the other is empty, a water bottle is pushed.
|
|
the process is repeated indefinitely.
|
|
|
|
PowerNoise uses either one or two taps for the LFSR, configurable via the Control macro.
|
|
|
|
the LFSR must be initialized before it can produce sound. the Load LFSR macro allows you to do so.
|
|
|
|
by default the LFSR is configured to produce square waves, by having a single tap in position 1 and an alternating LFSR pattern.
|
|
|
|
## Macros (noise)
|
|
|
|
- **Volume**: volume sequence.
|
|
- **Arpeggio**: pitch sequence.
|
|
- **Panning (left)**: output level for left channel.
|
|
- **Panning (right)**: output level for right channel.
|
|
- **Pitch**: fine pitch.
|
|
- **Phase Reset**: trigger reloading the LFSR.
|
|
- **Control**: channel settings:
|
|
- **slope AM**: when enabled, this channel's output and the slope channel go through amplitude modulation.
|
|
- **tap B**: enables use of two taps for the LFSR.
|
|
- **Tap A Location**: sets the position of the first tap.
|
|
- **Tap B Location**: sets the position of the second tap.
|
|
- **Load LFSR**: allows you to load the LFSR with a specific pattern.
|
|
|
|
## PowerNoise tab
|
|
|
|
this tab allows you to change the base octave - important when you have set a longer LFSR pattern.
|
|
|
|
## PowerNoise (slope) instrument editor
|
|
|
|
this channel has its own instrument type, as it does not use LFSR-based synthesis but instead generates saw waves.
|
|
|
|
it uses a custom algorithm which will be (roughly) described below.
|
|
|
|
the slope channel uses two "portions" - each with length, offset, invert and clip parameters.
|
|
the channel alternates between these portions as it is cycled.
|
|
|
|
on every cycle, the offset of the current portion is either added or subtracted into the accumulator (depending on the invert parameter), effectively behaving like a multiplier.
|
|
if the clip parameter is enabled, this will make sure the accumulator doesn't go past 0 or 127 (depending on the invert parameter, again). otherwise, the accumulator will be ANDed with 127.
|
|
once an amount of cycles set by the portion length parameter have elapsed, the channel switches into the other portion.
|
|
|
|
the current value of the accumulator is output.
|
|
|
|
## Macros (slope)
|
|
|
|
- **Volume**: volume sequence.
|
|
- **Arpeggio**: pitch sequence.
|
|
- **Panning (left)**: output level for left channel.
|
|
- **Panning (right)**: output level for right channel.
|
|
- **Pitch**: fine pitch.
|
|
- **Control**: channel settings:
|
|
- **clip A**: sets clip parameter of first portion.
|
|
- **clip B**: sets clip parameter of second portion.
|
|
- **reset A**: resets the first portion.
|
|
- **reset B**: resets the second portion.
|
|
- **invert A**: sets invert parameter of first portion.
|
|
- **invert B**: sets invert parameter of second portion.
|
|
- **Portion A Length**: sets the duration of the first portion.
|
|
- **Portion B Length**: sets the duration of the second portion.
|
|
- **Portion A Offset**: sets the accumulator speed of the first portion.
|
|
- **Portion B Offset**: sets the accumulator speed of the second portion.
|