1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-07-02 20:30:00 +00:00

Restores top bit of channel period, propagates it to the envelope generator.

This commit is contained in:
Thomas Harte 2020-05-05 00:28:24 -04:00
parent c9fb5721cd
commit 0505b82384
2 changed files with 10 additions and 5 deletions

View File

@ -79,7 +79,7 @@ void OPLL::write_register(uint8_t address, uint8_t value) {
// Address 2x Sets the octave and a single bit of the frequency, as well
// as setting key on and sustain mode.
case 0x20:
channels_[index].period = (channels_[index].period & 0xff) | (value & 1);
channels_[index].period = (channels_[index].period & 0xff) | ((value & 1) << 8);
channels_[index].octave = (value >> 1) & 7;
set_channel_period(index);
@ -116,6 +116,9 @@ void OPLL::set_channel_period(int channel) {
phase_generators_[channel + 0].set_period(channels_[channel].period, channels_[channel].octave);
phase_generators_[channel + 9].set_period(channels_[channel].period, channels_[channel].octave);
envelope_generators_[channel + 0].set_period(channels_[channel].period, channels_[channel].octave);
envelope_generators_[channel + 9].set_period(channels_[channel].period, channels_[channel].octave);
key_level_scalers_[channel + 0].set_period(channels_[channel].period, channels_[channel].octave);
key_level_scalers_[channel + 9].set_period(channels_[channel].period, channels_[channel].octave);
}
@ -278,8 +281,9 @@ void OPLL::update_all_channels() {
int OPLL::melodic_output(int channel) {
// TODO: key-rate scaling.
auto modulation = WaveformGenerator<period_precision>::wave(channels_[channel].modulator_waveform, phase_generators_[channel + 9].phase());
modulation += envelope_generators_[channel + 9].attenuation() + channels_[channel].modulator_attenuation;
return WaveformGenerator<period_precision>::wave(channels_[channel].carrier_waveform, phase_generators_[channel].scaled_phase(), modulation).level();
return WaveformGenerator<period_precision>::wave(channels_[channel].carrier_waveform, phase_generators_[channel].scaled_phase(), modulation).level() + channels_[channel].attenuation;
}

View File

@ -8,7 +8,8 @@
#import <XCTest/XCTest.h>
#include "OPL2.hpp"
#include "Tables.hpp"
#include <cmath>
@interface OPLTests: XCTestCase
@ -32,7 +33,7 @@
// MARK: - Two-operator FM tests
- (void)compareFMTo:(NSArray *)knownGood atAttenuation:(int)attenuation {
/*- (void)compareFMTo:(NSArray *)knownGood atAttenuation:(int)attenuation {
Yamaha::OPL::Operator modulator, carrier;
Yamaha::OPL::Channel channel;
Yamaha::OPL::LowFrequencyOscillator oscillator;
@ -165,6 +166,6 @@
// test_operator.update(test_state, true, 0, 0, 0);
// NSLog(@"%d", test_state.level());
// }
}
}*/
@end