Thomas Harte
eed357abb4
Introduces concept of 'average peak volume' in order better to normalise audio sources like the OPLL.
2020-05-09 17:57:21 -04:00
Thomas Harte
8f541602c1
Moves modulator updates a sample behind operator updates.
2020-05-08 21:14:25 -04:00
Thomas Harte
668f4b77f3
Implements feedback.
2020-05-08 21:05:23 -04:00
Thomas Harte
303965fbb8
Removes the crutch of my first-attempt implementation.
2020-05-08 20:53:34 -04:00
Thomas Harte
792aed242d
Fixes the use-sustain flag.
2020-05-08 20:49:39 -04:00
Thomas Harte
dc5654b941
Attempts to implement the proper attack phase.
...
It's sounding pretty good now, but for sustain.
2020-05-08 18:59:05 -04:00
Thomas Harte
e51e2425cc
Attempts to implement decay and release the right way around and with full precision.
...
Higher numbers = decay/release more quickly, not more slowly.
2020-05-08 18:40:49 -04:00
Thomas Harte
95c6b9b55d
Declare proper envelope precision.
2020-05-08 17:58:50 -04:00
Thomas Harte
ea25ead19d
Ensures rhythm envelope generators don't pick up should_damp state.
2020-05-08 00:18:31 -04:00
Thomas Harte
24100ec3b0
Switches snare and high-hat envelope generators.
2020-05-08 00:08:14 -04:00
Thomas Harte
32437fbf8b
Attempts to use the proper rhythm mode envelope generators.
2020-05-07 23:56:15 -04:00
Thomas Harte
5219a86a41
In principle fully implements rhythm mode.
2020-05-07 23:38:51 -04:00
Thomas Harte
e12dc5d894
Reduce the amount of time spent installing instruments.
2020-05-06 00:15:28 -04:00
Thomas Harte
75315406bb
Ensure all channels begin in 'release' phase, which is currently code for 'off' in conjunction with attenuation of 511.
2020-05-06 00:13:01 -04:00
Thomas Harte
ea42fe638a
Corrects channel attenuation and carrier sustain level settings.
2020-05-05 23:41:15 -04:00
Thomas Harte
744211cec0
Ensures rhythm instruments are installed.
2020-05-05 23:13:13 -04:00
Thomas Harte
1a4321d7d0
Attempts better to balance attenuations.
2020-05-05 22:14:11 -04:00
Thomas Harte
b943441901
Marks up more specific TODOs.
...
I think I'm already much happier with this factoring.
2020-05-05 00:35:03 -04:00
Thomas Harte
0505b82384
Restores top bit of channel period, propagates it to the envelope generator.
2020-05-05 00:28:24 -04:00
Thomas Harte
c9fb5721cd
Makes first attempt to reintroduce full-melodic output.
2020-05-05 00:16:45 -04:00
Thomas Harte
386a7ca442
Continues doing away with the attempt heavily to interleave the OPLL and OPL2, creating a new OPLL class.
2020-05-04 21:14:51 -04:00
Thomas Harte
e929d5d819
Ensures proper dereferencing of the std::optional.
2020-05-03 21:57:15 -04:00
Thomas Harte
94614ae4c3
Shifts the LFO implementation inline.
2020-05-03 21:44:22 -04:00
Thomas Harte
1223c99e0f
Adds waveform generation logic to the new factoring.
2020-05-03 21:38:20 -04:00
Thomas Harte
1ff5ea0a6e
Adds KeyLevelScaler, implements EnvelopeGenerator, adds reset
to PhaseGenerator.
2020-05-03 16:24:55 -04:00
Thomas Harte
9d2691d1d2
Taking it as given that outstanding deficiencies are mostly due to poor design, starts breaking out the envelope and phase generators.
2020-05-01 23:46:42 -04:00
Thomas Harte
e4ef2c68bb
Feeds through drum volume levels.
2020-04-30 19:35:09 -04:00
Thomas Harte
7fffafdfd4
Wires the high-hat through, possibly incorrectly.
2020-04-29 22:44:15 -04:00
Thomas Harte
c4135fad2b
Attempts completely to decouple updates and audio outputs.
2020-04-29 22:07:40 -04:00
Thomas Harte
9f0c8bcae7
Attempts to add the missing noise generators. I think I may still be astray on volumes.
2020-04-26 15:51:33 -04:00
Thomas Harte
2bc36a6cde
Eliminates branch within snare output.
2020-04-26 00:21:15 -04:00
Thomas Harte
ee10fe3d2c
Fully separates updates and outputs in operators; takes a shot at the snare.
2020-04-26 00:18:09 -04:00
Thomas Harte
a424e867f9
Continues factoring this apart, albeit with a decision on whether to retain update-and-output still pending.
2020-04-25 23:07:40 -04:00
Thomas Harte
f52b40396a
Re-ups output level.
...
Though it's still quiet compared to the SN.
2020-04-25 23:07:06 -04:00
Thomas Harte
cd2ab70a58
Moves the LFSR to the LowFrequencyOscillator.
...
Possibly I should come up with a better name for that?
2020-04-25 22:21:42 -04:00
Thomas Harte
65a3783dd2
Attempts the tom tom.
2020-04-25 19:21:55 -04:00
Thomas Harte
b9b5c2a3bc
Takes a first run at proper slot mixing and the bass drum.
2020-04-25 18:01:05 -04:00
Thomas Harte
12c618642e
Corrects output range.
2020-04-25 00:07:58 -04:00
Thomas Harte
6ebc93c995
Switches to maximum-rate multiplexing. Hopefully to eliminate the mixer as a consideration for now.
2020-04-24 23:50:06 -04:00
Thomas Harte
6d4e29c851
Strips mixer back to basics in search of audio issues.
2020-04-24 23:32:02 -04:00
Thomas Harte
b3979e2fda
Looking towards rhythm mode, and in search of bugs: factors out ADSR.
...
Further factorings to come.
2020-04-24 18:48:32 -04:00
Thomas Harte
983c32bf75
Adds vibrato.
...
This would complete melodic output, subject to bug fixes.
2020-04-24 18:02:41 -04:00
Thomas Harte
9e3614066a
Adds tremolo support, switches to global timer for ADSR stages other than attack.
2020-04-23 23:55:49 -04:00
Thomas Harte
c7ad6b1b50
Minor layout and commenting improvements.
2020-04-21 23:35:48 -04:00
Thomas Harte
676dcf7fbb
Calculates the proper key scale rate, though ADSR itself is still lacking that precision.
2020-04-21 22:57:56 -04:00
Thomas Harte
50d725330c
Adds missing header.
2020-04-21 22:48:52 -04:00
Thomas Harte
2886dd1dae
Collapses key-level scaling to a single 2d table.
...
I dare imagine I can do better; the columns in particular look like arithmetic progressions.
2020-04-21 20:19:02 -04:00
Thomas Harte
40424ac38b
Re-enables key-level scaling, with 3db and 1.5db the correct way around.
2020-04-21 20:10:40 -04:00
Thomas Harte
a4d3865394
Decreases sustain level attenuation; disables key-level scaling for now.
...
The latter was definitely wrong, I also think I don't need the big four tables.
2020-04-21 19:58:40 -04:00
Thomas Harte
bdce1c464a
Takes a shot at key-level scaling. Testing to come.
2020-04-21 00:09:42 -04:00
Thomas Harte
475d75c16a
Preserves fractional part of modulator phase.
2020-04-20 23:35:37 -04:00
Thomas Harte
32fd1897d0
Via a unit test, confirms and fixes relative volumes of OPLL channels.
...
Also rejigs responsibility for scaling to emulator-standard volume.
2020-04-20 23:17:29 -04:00
Thomas Harte
f19fd7c166
Pulls out common melodic update calls.
2020-04-20 18:58:31 -04:00
Thomas Harte
100fddcee1
Corrects divider, takes another whack at ADSR.
2020-04-20 18:58:10 -04:00
Thomas Harte
99fa86a67e
Adds a test for lookup sine. And fixes lookup sine.
2020-04-20 18:40:47 -04:00
Thomas Harte
6568c29c54
Improves commentary.
2020-04-19 22:42:25 -04:00
Thomas Harte
c54bbc5a04
Rename Table.h; LogSin -> LogSign and make it a bit more typer.
2020-04-19 13:33:17 -04:00
Thomas Harte
92d0c466c2
Moves complete phase -> output calculation inside Operator.
...
Reasoning being: otherwise I wasn't currently enforcing non-sine waveforms.
2020-04-19 13:27:24 -04:00
Thomas Harte
020c760976
Simplifies the phase counter.
2020-04-19 00:30:14 -04:00
Thomas Harte
cdfd7de221
Minor: enables all melodic channels when rhythm mode is disabled; supports non-modulated channels.
2020-04-18 17:48:29 -04:00
Thomas Harte
3da2e91acf
Adjusts range of output, makes declaration of level
full owner of type information.
2020-04-17 23:29:09 -04:00
Thomas Harte
3948304172
Attempts to use table-based maths.
2020-04-17 23:23:16 -04:00
Thomas Harte
4a295cd95e
Wraps log_sin in an access function to enshrine sign and mask rules; switches both functions to non-math.h clashing names.
2020-04-17 23:22:42 -04:00
Thomas Harte
6f7c8b35c5
Applies an ahead-of-time transformation to the exp
table, and wraps it in a helper function.
2020-04-17 22:33:13 -04:00
Thomas Harte
e58ba27c00
Clarifies meaning of scaling. Though it isn't yet applied.
2020-04-17 22:30:10 -04:00
Thomas Harte
0aceddd088
Starts tidying up the OPL2.
...
This is as a precursor to switching to using the proper table lookups, which I hope will automatically fix my range issues.
2020-04-15 22:10:50 -04:00
Thomas Harte
30ff399218
With some fixes for scale, I think possibly this is close for melodic channels.
2020-04-15 21:27:27 -04:00
Thomas Harte
a7e63b61eb
Just from printing numbers: corrects transition from attack to decay.
2020-04-15 00:26:01 -04:00
Thomas Harte
b13b0d9311
Starts towards implementing some OPL test cases.
2020-04-14 23:51:45 -04:00
Thomas Harte
d8380dc3e2
Tries to be a little neater in spelling out the work here.
...
I think I'm somewhat circling here now; I need to think of a way of getting clean comparison data.
2020-04-14 21:55:42 -04:00
Thomas Harte
d805e9a8f0
Actually, octave probably works this way around? Higher octaves = higher frequencies.
2020-04-14 21:39:12 -04:00
Thomas Harte
aa45142728
Endeavours to fix attenuation and add FM synthesis.
...
I now definitely think my frequency counting is wrong.
2020-04-14 18:32:06 -04:00
Thomas Harte
09d1aed3a5
Attempts to voice the current attenuation (and, therefore, the ADSR output), even if linearly rather than logarithmically.
2020-04-13 22:12:55 -04:00
Thomas Harte
a1f80b5142
Takes a stab at per-operator ADSR.
...
Heavy caveats apply: no KSR is applied, non-ADSR attenuation isn't applied, attenuation isn't voiced in general.
2020-04-13 21:39:06 -04:00
Thomas Harte
d3fbdba77c
Add missing #include.
2020-04-12 14:20:02 -04:00
Thomas Harte
632d797c9d
Adjusts frequency formula. This could be close.
...
I guess next I need to get ADSR/volume in general working, before I can go FM? Then I'll worry about using the proper log-sin/exp tables.
2020-04-12 14:15:09 -04:00
Thomas Harte
559a2d81c1
Baby step: starts trying to output the raw FM carrier, no modulation, no ADSR.
2020-04-12 12:46:40 -04:00
Thomas Harte
7a5f23c0a5
Adds accommodations for the OPLL.
2020-04-10 22:05:22 -04:00
Thomas Harte
84b115f15f
Attempts to move forward in defining what the parts of an OPL are meant to do.
2020-04-10 19:13:52 -04:00
Thomas Harte
a0d14f4030
Starts trying to make sense of the various fields at play.
2020-04-08 23:15:44 -04:00
Thomas Harte
dd6769bfbc
Splits OPLL and OPL2 classes.
...
Logic is: they have different mixers (additive in the OPL2, time-division multiplexing in the OPLL) as well as different register sets. So I'll put operator and channel logic directly into those structs.
2020-04-07 23:15:26 -04:00
Thomas Harte
db4b71fc9a
Adds correct LSFR, something of OPLL -> OPL2 logic.
2020-04-05 22:57:53 -04:00
Thomas Harte
0ed7d257e1
Add some extra notes, implement correct mapping to only 18 operators. Not 22.
2020-04-05 14:32:55 -04:00
Thomas Harte
335a68396f
Attempts to complete OPL2 register decoding.
2020-04-04 23:39:09 -04:00
Thomas Harte
84cdf6130f
Starts at least trying to decode OPL2 register writes.
2020-04-04 23:29:25 -04:00
Thomas Harte
b0abc4f7bb
Implements enough wiring that the Master System will instantiate and talk to an OPLL.
2020-04-03 20:05:36 -04:00
Thomas Harte
a7e1920597
Restores ColecoVision runtime options.
2020-03-18 00:06:52 -04:00
Thomas Harte
394ee61c78
Starts a switch to reflectable-style runtime options.
...
The Amstrad CPC and ZX80/81 have made the jump so far, subject to caveats. The macOS build is unlikely currently to work properly.
2020-03-16 23:25:05 -04:00
Thomas Harte
545a6177bb
Makes CompoundSource mono/stereo-aware.
2020-02-16 18:45:36 -05:00
Thomas Harte
50d356be2f
Ensures all audio sources, including compound sources, announce whether they're stereo correctly.
2020-02-16 18:31:45 -05:00
Thomas Harte
9835e800ec
Fixed: individual audio generators now either are or are not stereo. The speaker acts accordingly.
2020-02-16 18:28:03 -05:00
Thomas Harte
337cb4fb86
Resolves implicit type conversion warnings.
2020-02-16 14:05:23 -05:00
Thomas Harte
f760a68173
Corrects stereo audio generation.
2020-02-16 00:19:49 -05:00
Thomas Harte
89d6b85b83
Adds optional stereo output for the AY.
...
The real chip provides the three tone channels as separate outputs, so a variety of different mixings can exist.
2020-02-15 18:09:17 -05:00
Thomas Harte
e02d109864
Nudges the LowpassSpeaker towards supporting stereo generation.
2020-02-15 18:03:12 -05:00
Thomas Harte
dde672701f
Merge pull request #755 from TomHarte/ExpliticLambdas
...
Tries to be less lazy with lambda captures.
2020-02-15 12:38:12 -05:00
Thomas Harte
9ca2d8f9f2
Tried to be less lazy with lambda captures.
...
This is primarily defensive.
2020-02-14 23:39:08 -05:00
Thomas Harte
763159a6f6
More neatly ties volume level 0 to silence.
2020-02-14 23:16:10 -05:00
Thomas Harte
6810a6ee58
Adjusts the AY volume scale.
...
Hopefully more accurately to model the real thing.
2020-02-14 22:51:20 -05:00
Thomas Harte
294e09f275
All these 'override's can be 'final's.
...
At least for the purpose of being communicative. I doubt there's much to gain in terms of compiler output — the DiskImageHolder can avoid some virtual lookups but nothing else leaps out.
2020-01-23 22:57:51 -05:00