diff --git a/scripts/MusicPlayer.gd b/scripts/MusicPlayer.gd index cd32a56..6364f70 100644 --- a/scripts/MusicPlayer.gd +++ b/scripts/MusicPlayer.gd @@ -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: diff --git a/scripts/MusicRenderer.gd b/scripts/MusicRenderer.gd index 8b262ac..bf121e2 100644 --- a/scripts/MusicRenderer.gd +++ b/scripts/MusicRenderer.gd @@ -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 diff --git a/scripts/loaders/snes/music.gd b/scripts/loaders/snes/music.gd index a07ee87..16d8878 100644 --- a/scripts/loaders/snes/music.gd +++ b/scripts/loaders/snes/music.gd @@ -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], diff --git a/scripts/loaders/snes/music_ff5.gd b/scripts/loaders/snes/music_ff5.gd index f54969e..7e8aee9 100644 --- a/scripts/loaders/snes/music_ff5.gd +++ b/scripts/loaders/snes/music_ff5.gd @@ -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, diff --git a/shaders/audio_renderer.gdshader b/shaders/audio_renderer.gdshader index 70821e4..504a2f5 100644 --- a/shaders/audio_renderer.gdshader +++ b/shaders/audio_renderer.gdshader @@ -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!