-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMatrix1000.h
143 lines (114 loc) · 6.26 KB
/
Matrix1000.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*
Copyright (c) 2020 Christof Ruch. All rights reserved.
Dual licensed: Distributed under Affero GPL license by default, an MIT license is available for purchase
*/
#pragma once
#include "JuceHeader.h"
#include "Synth.h"
#include "Patch.h"
#include "EditBufferCapability.h"
#include "ProgramDumpCapability.h"
#include "StreamLoadCapability.h"
#include "SoundExpanderCapability.h"
#include "GlobalSettingsCapability.h"
//#include "SupportedByBCR2000.h"
#include "MidiController.h"
namespace midikraft {
class Matrix1000_GlobalSettings_Loader;
class Matrix1000 : public Synth, /* public SupportedByBCR2000, */
public SimpleDiscoverableDevice,
public EditBufferCapability, public ProgramDumpCabability, public StreamLoadCapability, // pretty complete MIDI implementation of the Matrix1000
public SoundExpanderCapability, public GlobalSettingsCapability
{
public:
Matrix1000();
virtual ~Matrix1000() override;
// Basic Synth implementation
virtual std::string getName() const override;
virtual bool isOwnSysex(MidiMessage const &message) const override;
virtual int numberOfBanks() const override;
virtual int numberOfPatches() const override;
virtual std::string friendlyProgramName(MidiProgramNumber programNo) const override;
virtual std::string friendlyBankName(MidiBankNumber bankNo) const override;
virtual std::shared_ptr<DataFile> patchFromPatchData(const Synth::PatchData &data, MidiProgramNumber place) const override;
virtual PatchData filterVoiceRelevantData(std::shared_ptr<DataFile> unfilteredData) const override;
// Edit Buffer Capability
virtual MidiMessage requestEditBufferDump() const override;
virtual bool isEditBufferDump(const MidiMessage& message) const override;
virtual std::shared_ptr<DataFile> patchFromSysex(const MidiMessage& message) const override;
virtual std::vector<MidiMessage> patchToSysex(std::shared_ptr<DataFile> patch) const override;
virtual MidiMessage saveEditBufferToProgram(int programNumber) override;
// Program Dump Capability
virtual std::vector<MidiMessage> requestPatch(int patchNo) const override;
virtual bool isSingleProgramDump(const MidiMessage& message) const override;
virtual MidiProgramNumber getProgramNumber(const MidiMessage &message) const override;
virtual std::shared_ptr<DataFile> patchFromProgramDumpSysex(const MidiMessage& message) const override;
virtual std::vector<MidiMessage> patchToProgramDumpSysex(std::shared_ptr<DataFile> patch, MidiProgramNumber programNumber) const override;
// StreamLoadCapability
virtual std::vector<MidiMessage> requestStreamElement(int number, StreamType streamType) const override;
virtual int numberOfStreamMessagesExpected(StreamType streamType) const override;
virtual bool isMessagePartOfStream(const MidiMessage& message, StreamType streamType) const override;
virtual bool isStreamComplete(std::vector<MidiMessage> const &messages, StreamType streamType) const override;
virtual bool shouldStreamAdvance(std::vector<MidiMessage> const &messages, StreamType streamType) const override;
virtual TPatchVector loadPatchesFromStream(std::vector<MidiMessage> const &streamDump) const override;
// SoundExpanderCapability
virtual bool canChangeInputChannel() const override;
virtual void changeInputChannel(MidiController *controller, MidiChannel channel, std::function<void()> onFinished) override;
virtual MidiChannel getInputChannel() const override;
virtual bool hasMidiControl() const override;
virtual bool isMidiControlOn() const override;
virtual void setMidiControl(MidiController *controller, bool isOn) override;
// Sync with BCR2000
/* virtual std::vector<std::string> presetNames() override;
virtual void setupBCR2000(MidiController *controller, BCR2000 &bcr, SimpleLogger *logger) override;
virtual void syncDumpToBCR(MidiProgramNumber programNumber, MidiController *controller, BCR2000 &bcr, SimpleLogger *logger) override;
virtual void setupBCR2000View(BCR2000_Component &view) override;
virtual void setupBCR2000Values(BCR2000_Component &view, Patch *patch) override;*/
// Discoverable Device
virtual std::vector<juce::MidiMessage> deviceDetect(int channel) override;
virtual int deviceDetectSleepMS() override;
virtual MidiChannel channelIfValidDeviceResponse(const MidiMessage &message) override;
virtual bool needsChannelSpecificDetection() override;
// GlobalSettingsCapability
virtual void setGlobalSettingsFromDataFile(std::shared_ptr<DataFile> dataFile) override;
virtual std::vector<std::shared_ptr<TypedNamedValue>> getGlobalSettings() override;
virtual std::shared_ptr<DataFileLoadCapability> loader() override;
virtual int settingsDataFileType() const override;
virtual DataFileLoadCapability::DataFileImportDescription settingsImport() const override;
// Matrix1000 specific functions
bool isSplitPatch(MidiMessage const &message) const;
//private: Only for testing public
PatchData unescapeSysex(const uint8 *sysExData, int sysExLen) const;
std::vector<uint8> escapeSysex(const PatchData &programEditBuffer) const;
private:
friend class Matrix1000_GlobalSettings_Loader;
enum Matrix1000_DataFileType {
PATCH = 0,
DF_MATRIX1000_SETTINGS = 1
};
enum REQUEST_TYPE {
BANK_AND_MASTER = 0x00,
SINGLE_PATCH = 0x01,
MASTER = 0x03,
EDIT_BUFFER = 0x04
};
MidiMessage createRequest(REQUEST_TYPE typeNo, uint8 number) const;
MidiMessage createBankSelect(MidiBankNumber bankNo) const;
MidiMessage createBankUnlock() const;
MidiController::HandlerHandle matrixBCRSyncHandler_ = MidiController::makeNoneHandle();
// This listener implements sending update messages via NRPN when any of the global settings is changed via the UI
class GlobalSettingsListener : public ValueTree::Listener {
public:
GlobalSettingsListener(Matrix1000 *synth) : synth_(synth) {}
void valueTreePropertyChanged(ValueTree& treeWhosePropertyHasChanged, const Identifier& property) override;
std::vector<uint8> globalSettingsData_; // The global settings data as last retrieved from the synth
private:
Matrix1000 *synth_;
};
void initGlobalSettings();
std::shared_ptr<Matrix1000_GlobalSettings_Loader> globalSettingsLoader_; // Sort of a pimpl pattern
TypedNamedValueSet globalSettings_;
ValueTree globalSettingsTree_;
GlobalSettingsListener updateSynthWithGlobalSettingsListener_;
};
}