Put the midi state in the resources

This commit is contained in:
Paul Fd 2020-02-09 14:05:08 +01:00
parent 43ace5defb
commit bbad781bf9
3 changed files with 14 additions and 13 deletions

View file

@ -6,12 +6,14 @@
#pragma once #pragma once
#include "FilePool.h" #include "FilePool.h"
#include "FilterPool.h"
#include "Logger.h" #include "Logger.h"
namespace sfz namespace sfz
{ {
struct Resources struct Resources
{ {
MidiState midiState;
Logger logger; Logger logger;
FilePool filePool { logger }; FilePool filePool { logger };
}; };

View file

@ -78,7 +78,7 @@ void sfz::Synth::callback(absl::string_view header, const std::vector<Opcode>& m
void sfz::Synth::buildRegion(const std::vector<Opcode>& regionOpcodes) void sfz::Synth::buildRegion(const std::vector<Opcode>& regionOpcodes)
{ {
auto lastRegion = std::make_unique<Region>(midiState, defaultPath); auto lastRegion = std::make_unique<Region>(resources.midiState, defaultPath);
auto parseOpcodes = [&](const auto& opcodes) { auto parseOpcodes = [&](const auto& opcodes) {
for (auto& opcode : opcodes) { for (auto& opcode : opcodes) {
@ -125,7 +125,7 @@ void sfz::Synth::clear()
fileTicket = -1; fileTicket = -1;
defaultSwitch = absl::nullopt; defaultSwitch = absl::nullopt;
defaultPath = ""; defaultPath = "";
midiState.reset(); resources.midiState.reset();
ccNames.clear(); ccNames.clear();
globalOpcodes.clear(); globalOpcodes.clear();
masterOpcodes.clear(); masterOpcodes.clear();
@ -159,7 +159,7 @@ void sfz::Synth::handleControlOpcodes(const std::vector<Opcode>& members)
case hash("set_cc"): case hash("set_cc"):
if (backParameter && Default::ccNumberRange.containsWithEnd(*backParameter)) { if (backParameter && Default::ccNumberRange.containsWithEnd(*backParameter)) {
const auto ccValue = readOpcode(member.value, Default::ccValueRange).value_or(0); const auto ccValue = readOpcode(member.value, Default::ccValueRange).value_or(0);
midiState.ccEvent(*backParameter, ccValue); resources.midiState.ccEvent(*backParameter, ccValue);
} }
break; break;
case hash("Label_cc"): case hash("Label_cc"):
@ -287,7 +287,7 @@ bool sfz::Synth::loadSfzFile(const fs::path& file)
// Defaults // Defaults
for (int ccIndex = 0; ccIndex < config::numCCs; ccIndex++) { for (int ccIndex = 0; ccIndex < config::numCCs; ccIndex++) {
region->registerCC(ccIndex, midiState.getCCValue(ccIndex)); region->registerCC(ccIndex, resources.midiState.getCCValue(ccIndex));
} }
if (defaultSwitch) { if (defaultSwitch) {
@ -430,7 +430,7 @@ void sfz::Synth::noteOn(int delay, int noteNumber, uint8_t velocity) noexcept
ASSERT(noteNumber < 128); ASSERT(noteNumber < 128);
ASSERT(noteNumber >= 0); ASSERT(noteNumber >= 0);
midiState.noteOnEvent(noteNumber, velocity); resources.midiState.noteOnEvent(noteNumber, velocity);
AtomicGuard callbackGuard { inCallback }; AtomicGuard callbackGuard { inCallback };
if (!canEnterCallback) if (!canEnterCallback)
@ -444,7 +444,7 @@ void sfz::Synth::noteOff(int delay, int noteNumber, uint8_t velocity [[maybe_unu
ASSERT(noteNumber < 128); ASSERT(noteNumber < 128);
ASSERT(noteNumber >= 0); ASSERT(noteNumber >= 0);
midiState.noteOffEvent(noteNumber, velocity); resources.midiState.noteOffEvent(noteNumber, velocity);
AtomicGuard callbackGuard { inCallback }; AtomicGuard callbackGuard { inCallback };
if (!canEnterCallback) if (!canEnterCallback)
@ -453,7 +453,7 @@ void sfz::Synth::noteOff(int delay, int noteNumber, uint8_t velocity [[maybe_unu
// FIXME: Some keyboards (e.g. Casio PX5S) can send a real note-off velocity. In this case, do we have a // FIXME: Some keyboards (e.g. Casio PX5S) can send a real note-off velocity. In this case, do we have a
// way in sfz to specify that a release trigger should NOT use the note-on velocity? // way in sfz to specify that a release trigger should NOT use the note-on velocity?
// auto replacedVelocity = (velocity == 0 ? sfz::getNoteVelocity(noteNumber) : velocity); // auto replacedVelocity = (velocity == 0 ? sfz::getNoteVelocity(noteNumber) : velocity);
const auto replacedVelocity = midiState.getNoteVelocity(noteNumber); const auto replacedVelocity = resources.midiState.getNoteVelocity(noteNumber);
for (auto& voice : voices) for (auto& voice : voices)
voice->registerNoteOff(delay, noteNumber, replacedVelocity); voice->registerNoteOff(delay, noteNumber, replacedVelocity);
@ -508,7 +508,7 @@ void sfz::Synth::cc(int delay, int ccNumber, uint8_t ccValue) noexcept
return; return;
} }
midiState.ccEvent(ccNumber, ccValue); resources.midiState.ccEvent(ccNumber, ccValue);
for (auto& voice : voices) for (auto& voice : voices)
voice->registerCC(delay, ccNumber, ccValue); voice->registerCC(delay, ccNumber, ccValue);
@ -528,7 +528,7 @@ void sfz::Synth::pitchWheel(int delay, int pitch) noexcept
ASSERT(pitch <= 8192); ASSERT(pitch <= 8192);
ASSERT(pitch >= -8192); ASSERT(pitch >= -8192);
midiState.pitchBendEvent(pitch); resources.midiState.pitchBendEvent(pitch);
for (auto& region: regions) { for (auto& region: regions) {
region->registerPitchWheel(pitch); region->registerPitchWheel(pitch);
@ -611,7 +611,7 @@ void sfz::Synth::resetVoices(int numVoices)
voices.clear(); voices.clear();
for (int i = 0; i < numVoices; ++i) for (int i = 0; i < numVoices; ++i)
voices.push_back(std::make_unique<Voice>(midiState, resources)); voices.push_back(std::make_unique<Voice>(resources.midiState, resources));
for (auto& voice: voices) { for (auto& voice: voices) {
voice->setSampleRate(this->sampleRate); voice->setSampleRate(this->sampleRate);
@ -678,7 +678,7 @@ void sfz::Synth::resetAllControllers(int delay) noexcept
if (!canEnterCallback) if (!canEnterCallback)
return; return;
midiState.resetAllControllers(); resources.midiState.resetAllControllers();
for (auto& voice: voices) { for (auto& voice: voices) {
voice->registerPitchWheel(delay, 0); voice->registerPitchWheel(delay, 0);
for (int cc = 0; cc < config::numCCs; ++cc) for (int cc = 0; cc < config::numCCs; ++cc)

View file

@ -324,7 +324,7 @@ public:
*/ */
void disableFreeWheeling() noexcept; void disableFreeWheeling() noexcept;
const MidiState& getMidiState() const noexcept { return midiState; } const MidiState& getMidiState() const noexcept { return resources.midiState; }
/** /**
* @brief Check if the SFZ should be reloaded. * @brief Check if the SFZ should be reloaded.
@ -446,7 +446,6 @@ private:
// Singletons passed as references to the voices // Singletons passed as references to the voices
Resources resources; Resources resources;
MidiState midiState;
// Control opcodes // Control opcodes
std::string defaultPath { "" }; std::string defaultPath { "" };