mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-26 08:49:37 +00:00
Restores top bit of channel period, propagates it to the envelope generator.
This commit is contained in:
parent
c9fb5721cd
commit
0505b82384
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user