[BGM] Update placeholder ADSR names to reflect actual function
This commit is contained in:
parent
961c1344eb
commit
5babc200f2
|
@ -20,10 +20,10 @@ var channel_pan := PoolByteArray() # Reversed from MIDI
|
|||
var channel_octave := PoolByteArray()
|
||||
var channel_transpose := PoolByteArray()
|
||||
var channel_fine_tuning := PoolRealArray()
|
||||
var channel_adsr_attack := PoolByteArray()
|
||||
var channel_adsr_decay := PoolByteArray()
|
||||
var channel_adsr_sustain := PoolByteArray()
|
||||
var channel_adsr_release := PoolByteArray()
|
||||
var channel_adsr_attack_rate := PoolByteArray()
|
||||
var channel_adsr_decay_rate := PoolByteArray()
|
||||
var channel_adsr_sustain_level := PoolByteArray()
|
||||
var channel_adsr_sustain_rate := PoolByteArray()
|
||||
var channel_noise_freq := PoolByteArray()
|
||||
var channel_noise_on := PoolByteArray()
|
||||
var channel_pan_lfo_rate := PoolByteArray()
|
||||
|
@ -63,10 +63,10 @@ func _init(tracks: Array, instrument_map: Dictionary):
|
|||
self.channel_octave.append(5)
|
||||
self.channel_transpose.append(0)
|
||||
self.channel_fine_tuning.append(1.0)
|
||||
self.channel_adsr_attack.append(0)
|
||||
self.channel_adsr_decay.append(0)
|
||||
self.channel_adsr_sustain.append(0)
|
||||
self.channel_adsr_release.append(0)
|
||||
self.channel_adsr_attack_rate.append(0)
|
||||
self.channel_adsr_decay_rate.append(0)
|
||||
self.channel_adsr_sustain_level.append(0)
|
||||
self.channel_adsr_sustain_rate.append(0)
|
||||
self.channel_noise_freq.append(0)
|
||||
self.channel_noise_on.append(0)
|
||||
self.channel_pan_lfo_rate.append(0)
|
||||
|
@ -182,14 +182,14 @@ func play_channel(channel: int, time_offset: float = 0.0) -> int:
|
|||
self.channel_instrument_idx[channel] = event[1]
|
||||
player.stream = self.inst_map[self.channel_instrument_idx[channel]]
|
||||
# TODO - grab instrument envelope
|
||||
EventType.ADSR_ATTACK:
|
||||
self.channel_adsr_attack[channel] = event[1]
|
||||
EventType.ADSR_DECAY:
|
||||
self.channel_adsr_decay[channel] = event[1]
|
||||
EventType.ADSR_SUSTAIN:
|
||||
self.channel_adsr_sustain[channel] = event[1]
|
||||
EventType.ADSR_RELEASE:
|
||||
self.channel_adsr_release[channel] = event[1]
|
||||
EventType.ADSR_ATTACK_RATE:
|
||||
self.channel_adsr_attack_rate[channel] = event[1]
|
||||
EventType.ADSR_DECAY_RATE:
|
||||
self.channel_adsr_decay_rate[channel] = event[1]
|
||||
EventType.ADSR_SUSTAIN_LEVEL:
|
||||
self.channel_adsr_sustain_level[channel] = event[1]
|
||||
EventType.ADSR_SUSTAIN_RATE:
|
||||
self.channel_adsr_sustain_rate[channel] = event[1]
|
||||
EventType.ADSR_DEFAULT: # TODO - grab instrument envelope
|
||||
pass
|
||||
EventType.TEMPO:
|
||||
|
|
|
@ -11,10 +11,10 @@ class NoteEvent:
|
|||
var instrument: int
|
||||
var pitch: int
|
||||
var velocity: float
|
||||
var adsr_attack: int
|
||||
var adsr_decay: int
|
||||
var adsr_sustain: int
|
||||
var adsr_release: int
|
||||
var adsr_attack_rate: int
|
||||
var adsr_decay_rate: int
|
||||
var adsr_sustain_level: int
|
||||
var adsr_sustain_rate: int
|
||||
|
||||
|
||||
class TrackCurve: # built-in Curve class is too restrictive for this
|
||||
|
@ -145,10 +145,10 @@ static func render_channels(tracks: Array, inst_map: Array, debug_name := 'none'
|
|||
var current_octave := 5
|
||||
var current_transpose := 0
|
||||
# var current_velocity := 100
|
||||
var current_adsr_attack := 0
|
||||
var current_adsr_decay := 0
|
||||
var current_adsr_sustain := 0
|
||||
var current_adsr_release := 0
|
||||
var current_adsr_attack_rate := 0
|
||||
var current_adsr_decay_rate := 0
|
||||
var current_adsr_sustain_level := 0
|
||||
var current_adsr_sustain_rate := 0
|
||||
|
||||
# First, check if it ends in a GOTO, then store the program counter of the destination
|
||||
var infinite_loop_target_program_counter = -1
|
||||
|
@ -194,10 +194,10 @@ static func render_channels(tracks: Array, inst_map: Array, debug_name := 'none'
|
|||
note_event.instrument = current_instrument
|
||||
note_event.pitch = note # pitch_idx #* curve_fine_tuning
|
||||
note_event.velocity = curve_velocity.get_pulse(p) # current_velocity
|
||||
note_event.adsr_attack = current_adsr_attack
|
||||
note_event.adsr_decay = current_adsr_decay
|
||||
note_event.adsr_sustain = current_adsr_sustain
|
||||
note_event.adsr_release = current_adsr_release
|
||||
note_event.adsr_attack_rate = current_adsr_attack_rate
|
||||
note_event.adsr_decay_rate = current_adsr_decay_rate
|
||||
note_event.adsr_sustain_level = current_adsr_sustain_level
|
||||
note_event.adsr_sustain_rate = current_adsr_sustain_rate
|
||||
channel_note_events.append(note_event)
|
||||
# num_notes += 1
|
||||
elif note == music.NOTE_IS_TIE:
|
||||
|
@ -253,25 +253,25 @@ static func render_channels(tracks: Array, inst_map: Array, debug_name := 'none'
|
|||
current_instrument = inst_map[event_idx] - 1
|
||||
if current_instrument < len(instrument_adsrs) and current_instrument > 0:
|
||||
var adsr = instrument_adsrs[current_instrument]
|
||||
current_adsr_attack = adsr[2]
|
||||
current_adsr_decay = adsr[3]
|
||||
current_adsr_sustain = adsr[0]
|
||||
current_adsr_release = adsr[1]
|
||||
current_adsr_attack_rate = adsr[2]
|
||||
current_adsr_decay_rate = adsr[3]
|
||||
current_adsr_sustain_level = adsr[0]
|
||||
current_adsr_sustain_rate = adsr[1]
|
||||
EventType.ADSR_DEFAULT: # TODO - Investigate actual scaling and order
|
||||
if current_instrument < len(instrument_adsrs) and current_instrument > 0:
|
||||
var adsr = instrument_adsrs[current_instrument]
|
||||
current_adsr_attack = adsr[2]
|
||||
current_adsr_decay = adsr[3]
|
||||
current_adsr_sustain = adsr[0]
|
||||
current_adsr_release = adsr[1]
|
||||
EventType.ADSR_ATTACK:
|
||||
current_adsr_attack = event[1]
|
||||
EventType.ADSR_DECAY:
|
||||
current_adsr_decay = event[1]
|
||||
EventType.ADSR_SUSTAIN:
|
||||
current_adsr_sustain = event[1]
|
||||
EventType.ADSR_RELEASE:
|
||||
current_adsr_release = event[1]
|
||||
current_adsr_attack_rate = adsr[2]
|
||||
current_adsr_decay_rate = adsr[3]
|
||||
current_adsr_sustain_level = adsr[0]
|
||||
current_adsr_sustain_rate = adsr[1]
|
||||
EventType.ADSR_ATTACK_RATE:
|
||||
current_adsr_attack_rate = event[1]
|
||||
EventType.ADSR_DECAY_RATE:
|
||||
current_adsr_decay_rate = event[1]
|
||||
EventType.ADSR_SUSTAIN_LEVEL:
|
||||
current_adsr_sustain_level = event[1]
|
||||
EventType.ADSR_SUSTAIN_RATE:
|
||||
current_adsr_sustain_rate = event[1]
|
||||
EventType.VIBRATO_ON:
|
||||
curve_vibrato_delay.add_point(p, event[1])
|
||||
curve_vibrato_rate.add_point(p, event[2])
|
||||
|
@ -390,10 +390,10 @@ static func render_channels(tracks: Array, inst_map: Array, debug_name := 'none'
|
|||
midi_events_bytes3.put_u8(event.pitch)
|
||||
midi_events_bytes3.put_u8(int(event.velocity * curve_master_volume.get_pulse(p) * 255.0)) # velocity
|
||||
midi_events_bytes3.put_u8(int((curve_pan.get_pulse(p)+1.0) * 127.5)) # pan
|
||||
midi_events_bytes_adsr.put_u8(event.adsr_attack)
|
||||
midi_events_bytes_adsr.put_u8(event.adsr_decay)
|
||||
midi_events_bytes_adsr.put_u8(event.adsr_sustain)
|
||||
midi_events_bytes_adsr.put_u8(event.adsr_release)
|
||||
midi_events_bytes_adsr.put_u8(event.adsr_attack_rate)
|
||||
midi_events_bytes_adsr.put_u8(event.adsr_decay_rate)
|
||||
midi_events_bytes_adsr.put_u8(event.adsr_sustain_level)
|
||||
midi_events_bytes_adsr.put_u8(event.adsr_sustain_rate)
|
||||
|
||||
event_ptr += 1
|
||||
num_notes += 1
|
||||
|
|
|
@ -4,11 +4,11 @@ const NOTE_IS_TIE := -1
|
|||
const NOTE_IS_REST := -2
|
||||
|
||||
enum EventType {
|
||||
ADSR_ATTACK,
|
||||
ADSR_DECAY,
|
||||
ADSR_ATTACK_RATE,
|
||||
ADSR_DECAY_RATE,
|
||||
ADSR_DEFAULT,
|
||||
ADSR_RELEASE,
|
||||
ADSR_SUSTAIN,
|
||||
ADSR_SUSTAIN_RATE,
|
||||
ADSR_SUSTAIN_LEVEL,
|
||||
CPU_CONTROLLED_JUMP,
|
||||
ECHO_FEEDBACK_FIR,
|
||||
ECHO_OFF,
|
||||
|
@ -58,11 +58,11 @@ enum OperandType {
|
|||
}
|
||||
|
||||
const OPERAND_MAP := {
|
||||
EventType.ADSR_ATTACK: [OperandType.U8],
|
||||
EventType.ADSR_DECAY: [OperandType.U8],
|
||||
EventType.ADSR_ATTACK_RATE: [OperandType.U8], # Attack Rate, & 0b00001111
|
||||
EventType.ADSR_DECAY_RATE: [OperandType.U8], # Decay Rate, & 0b00000111
|
||||
EventType.ADSR_DEFAULT: [],
|
||||
EventType.ADSR_RELEASE: [OperandType.U8],
|
||||
EventType.ADSR_SUSTAIN: [OperandType.U8],
|
||||
EventType.ADSR_SUSTAIN_RATE: [OperandType.U8], # & 0b00001111
|
||||
EventType.ADSR_SUSTAIN_LEVEL: [OperandType.U8], # & 0b00000111
|
||||
EventType.CPU_CONTROLLED_JUMP: [OperandType.U16],
|
||||
EventType.ECHO_FEEDBACK_FIR: [OperandType.U8, OperandType.U8],
|
||||
EventType.ECHO_OFF: [],
|
||||
|
@ -91,8 +91,8 @@ const OPERAND_MAP := {
|
|||
EventType.PROGCHANGE: [OperandType.U8],
|
||||
EventType.TEMPO_SLIDE: [OperandType.U8, OperandType.U8],
|
||||
EventType.TEMPO: [OperandType.U8],
|
||||
EventType.TRANSPOSE_ABS: [OperandType.U8],
|
||||
EventType.TRANSPOSE_REL: [OperandType.U8],
|
||||
EventType.TRANSPOSE_ABS: [OperandType.S8],
|
||||
EventType.TRANSPOSE_REL: [OperandType.S8],
|
||||
EventType.TREMOLO_OFF: [],
|
||||
EventType.TREMOLO_ON: [OperandType.U8, OperandType.U8, OperandType.U8],
|
||||
EventType.TUNING: [OperandType.U8],
|
||||
|
|
|
@ -34,10 +34,10 @@ func _init() -> void:
|
|||
0xE8: EventType.TRANSPOSE_REL,
|
||||
0xE9: EventType.TUNING,
|
||||
0xEA: EventType.PROGCHANGE,
|
||||
0xEB: EventType.ADSR_ATTACK,
|
||||
0xEC: EventType.ADSR_DECAY,
|
||||
0xED: EventType.ADSR_SUSTAIN,
|
||||
0xEE: EventType.ADSR_RELEASE,
|
||||
0xEB: EventType.ADSR_ATTACK_RATE,
|
||||
0xEC: EventType.ADSR_DECAY_RATE,
|
||||
0xED: EventType.ADSR_SUSTAIN_LEVEL,
|
||||
0xEE: EventType.ADSR_SUSTAIN_RATE,
|
||||
0xEF: EventType.ADSR_DEFAULT,
|
||||
0xF0: EventType.LOOP_START,
|
||||
0xF1: EventType.LOOP_END,
|
||||
|
|
|
@ -214,8 +214,11 @@ highp vec4 render_song(highp sampler2D tex, highp int smp) {
|
|||
// ====================At some point I'll look back into packing floats====================
|
||||
// TBD = note_event_supplement.zw; - tremolo/vibrato/noise/pan_lfo/pitchbend/echo remain
|
||||
// ====================At some point I'll look back into packing floats====================
|
||||
highp float attack = 1.0 + adsr.x*255.0; //65535.0 + 1.0; // TODO: work out effective resolution for this
|
||||
highp int smp_attack = int(attack) * 2; // Max value is 131072 samples = 4.096 seconds
|
||||
highp float attack_rate = 1.0 + adsr.x*255.0; //65535.0 + 1.0; // TODO: work out effective resolution for this - it's actually only 4 of 8 bits
|
||||
highp float decay_rate = adsr.y; // TODO: work out effective resolution for this - it's actually only 3 of 8 bits
|
||||
highp float sustain_level = adsr.z; // TODO: work out effective resolution for this - it's actually only 3 of 8 bits
|
||||
highp float sustain_rate = adsr.w; // TODO: work out effective resolution for this - it's actually only 4 of 8 bits
|
||||
highp int smp_attack = int(attack_rate) * 2; // Max value is 131072 samples = 4.096 seconds
|
||||
|
||||
// For now, just branch this
|
||||
if (smp_start < smp) { // First sample may not start at zero!
|
||||
|
|
Loading…
Reference in New Issue