Skip to content

Commit 05cc097

Browse files
Add editor piano direct note send
1 parent 99b1a82 commit 05cc097

15 files changed

+160
-40
lines changed

src/audioCore/graph/MainGraph.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -404,9 +404,9 @@ void MainGraph::processBlock(juce::AudioBuffer<float>& audio, juce::MidiBuffer&
404404
juce::ScopedTryWriteLock sourceLocker(audioLock::getSourceLock());
405405
juce::ScopedTryReadLock pluginLocker(audioLock::getPluginLock());
406406
juce::ScopedTryWriteLock positionLocker(audioLock::getPositionLock());
407-
juce::ScopedTryReadLock mackieLocker(audioLock::getMackieLock());
407+
juce::ScopedTryReadLock controlLocker(audioLock::getAudioControlLock());
408408
if (!(audioLocker.isLocked() && pluginLocker.isLocked()
409-
&& sourceLocker.isLocked() && positionLocker.isLocked() && mackieLocker.isLocked())) {
409+
&& sourceLocker.isLocked() && positionLocker.isLocked() && controlLocker.isLocked())) {
410410
vMath::zeroAllAudioData(audio);
411411
midi.clear();
412412
return;

src/audioCore/graph/SeqSourceProcessor.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -565,6 +565,11 @@ void SeqSourceProcessor::syncARAContext() {
565565
}
566566
}
567567

568+
void SeqSourceProcessor::sendDirectMidiMessages(const juce::MidiMessage& message) {
569+
juce::ScopedWriteLock locker(audioLock::getAudioControlLock());
570+
this->directMessages.add(message);
571+
}
572+
568573
void SeqSourceProcessor::prepareToPlay(
569574
double sampleRate, int maximumExpectedSamplesPerBlock) {
570575
this->juce::AudioProcessorGraph::prepareToPlay(
@@ -653,6 +658,12 @@ void SeqSourceProcessor::processBlock(
653658
}
654659
}
655660

661+
/** Direct MIDI Messages */
662+
for (auto& i : this->directMessages) {
663+
midiMessages.addEvent(i, 0);
664+
}
665+
this->directMessages.clear();
666+
656667
/** Set Note State */
657668
for (auto i : midiMessages) {
658669
auto mes = i.getMessage();

src/audioCore/graph/SeqSourceProcessor.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ class SeqSourceProcessor final : public juce::AudioProcessorGraph,
7979

8080
void syncARAContext();
8181

82+
void sendDirectMidiMessages(const juce::MidiMessage& message);
83+
8284
public:
8385
void prepareToPlay(double sampleRate, int maximumExpectedSamplesPerBlock) override;
8486
void releaseResources() override {};
@@ -142,6 +144,8 @@ class SeqSourceProcessor final : public juce::AudioProcessorGraph,
142144

143145
juce::Array<float> outputLevels;
144146

147+
juce::Array<juce::MidiMessage> directMessages;
148+
145149
struct SourceInfo final {
146150
double audioSampleRate = 0;
147151
double audioLength = 0;

src/audioCore/misc/AudioLock.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace audioLock {
77
juce::ReadWriteLock sourceLock;
88
juce::ReadWriteLock pluginLock;
99
juce::ReadWriteLock positionLock;
10-
juce::ReadWriteLock mackieLock;
10+
juce::ReadWriteLock audioControlLock;
1111
juce::ReadWriteLock levelMeterLock;
1212
};
1313

@@ -29,8 +29,8 @@ namespace audioLock {
2929
return lock->positionLock;
3030
}
3131

32-
juce::ReadWriteLock& getMackieLock() {
33-
return lock->mackieLock;
32+
juce::ReadWriteLock& getAudioControlLock() {
33+
return lock->audioControlLock;
3434
}
3535

3636
juce::ReadWriteLock& getLevelMeterLock() {

src/audioCore/misc/AudioLock.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ namespace audioLock {
77
juce::ReadWriteLock& getSourceLock();
88
juce::ReadWriteLock& getPluginLock();
99
juce::ReadWriteLock& getPositionLock();
10-
juce::ReadWriteLock& getMackieLock();
10+
juce::ReadWriteLock& getAudioControlLock();
1111
juce::ReadWriteLock& getLevelMeterLock();
1212
}

src/audioCore/misc/MackieControlHub.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#include "../misc/AudioLock.h"
33

44
MackieControlHub::~MackieControlHub() {
5-
juce::ScopedWriteLock locker(audioLock::getMackieLock());
5+
juce::ScopedWriteLock locker(audioLock::getAudioControlLock());
66

77
for (auto& [device, index] : this->inputDevices) {
88
device->stop();
@@ -18,7 +18,7 @@ MackieControlHub::~MackieControlHub() {
1818
juce::MidiInput* MackieControlHub::openInputDevice(
1919
const juce::String& deviceIdentifier, int index) {
2020
/** Lock */
21-
juce::ScopedWriteLock locker(audioLock::getMackieLock());
21+
juce::ScopedWriteLock locker(audioLock::getAudioControlLock());
2222

2323
/** Device Has Opened */
2424
for (auto& [device, ind] : this->inputDevices) {
@@ -44,7 +44,7 @@ juce::MidiInput* MackieControlHub::openInputDevice(
4444
juce::MidiOutput* MackieControlHub::openOutputDevice(
4545
const juce::String& deviceIdentifier, int index) {
4646
/** Lock */
47-
juce::ScopedWriteLock locker(audioLock::getMackieLock());
47+
juce::ScopedWriteLock locker(audioLock::getAudioControlLock());
4848

4949
/** Device Has Opened */
5050
for (auto& [device, ind] : this->outputDevices) {
@@ -69,7 +69,7 @@ juce::MidiOutput* MackieControlHub::openOutputDevice(
6969

7070
bool MackieControlHub::closeInputDevice(const juce::String& deviceIdentifier) {
7171
/** Lock */
72-
juce::ScopedWriteLock locker(audioLock::getMackieLock());
72+
juce::ScopedWriteLock locker(audioLock::getAudioControlLock());
7373

7474
/** Find Device */
7575
auto deviceIndex = this->findInputDevice(deviceIdentifier);
@@ -87,7 +87,7 @@ bool MackieControlHub::closeInputDevice(const juce::String& deviceIdentifier) {
8787

8888
bool MackieControlHub::closeOutputDevice(const juce::String& deviceIdentifier) {
8989
/** Lock */
90-
juce::ScopedWriteLock locker(audioLock::getMackieLock());
90+
juce::ScopedWriteLock locker(audioLock::getAudioControlLock());
9191

9292
/** Find Device */
9393
auto deviceIndex = this->findOutputDevice(deviceIdentifier);
@@ -167,7 +167,7 @@ int MackieControlHub::getOutputDeviceIndex(int index) const {
167167
}
168168

169169
bool MackieControlHub::setInputDeviceIndex(int index, int deviceIndex) {
170-
juce::ScopedWriteLock locker(audioLock::getMackieLock());
170+
juce::ScopedWriteLock locker(audioLock::getAudioControlLock());
171171
if (index < 0 || index >= this->inputDevices.size()) { return false; }
172172

173173
auto& [device, devIdx] = this->inputDevices.getReference(index);
@@ -176,7 +176,7 @@ bool MackieControlHub::setInputDeviceIndex(int index, int deviceIndex) {
176176
}
177177

178178
bool MackieControlHub::setOutputDeviceIndex(int index, int deviceIndex) {
179-
juce::ScopedWriteLock locker(audioLock::getMackieLock());
179+
juce::ScopedWriteLock locker(audioLock::getAudioControlLock());
180180
if (index < 0 || index >= this->outputDevices.size()) { return false; }
181181

182182
auto& [device, devIdx] = this->outputDevices.getReference(index);
@@ -188,7 +188,7 @@ void MackieControlHub::removeUnavailableDevices(
188188
const juce::Array<juce::MidiDeviceInfo>& inputDevices,
189189
const juce::Array<juce::MidiDeviceInfo>& outputDeivces) {
190190
/** Lock */
191-
juce::ScopedWriteLock locker(audioLock::getMackieLock());
191+
juce::ScopedWriteLock locker(audioLock::getAudioControlLock());
192192

193193
/** Input */
194194
for (int i = this->inputDevices.size() - 1; i >= 0; i--) {

src/audioCore/quickAPI/QuickSet.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,4 +130,20 @@ namespace quickAPI {
130130
void setAudioDeviceInitState(std::unique_ptr<juce::XmlElement> state) {
131131
AudioStartupConfig::getInstance()->setConfig(std::move(state));
132132
}
133+
134+
void sendDirectNoteOn(int trackIndex, int noteNum, uint8_t vel) {
135+
if (auto graph = AudioCore::getInstance()->getGraph()) {
136+
if (auto track = graph->getSourceProcessor(trackIndex)) {
137+
track->sendDirectMidiMessages(juce::MidiMessage::noteOn(1, noteNum, vel));
138+
}
139+
}
140+
}
141+
142+
void sendDirectNoteOff(int trackIndex, int noteNum) {
143+
if (auto graph = AudioCore::getInstance()->getGraph()) {
144+
if (auto track = graph->getSourceProcessor(trackIndex)) {
145+
track->sendDirectMidiMessages(juce::MidiMessage::noteOff(1, noteNum));
146+
}
147+
}
148+
}
133149
}

src/audioCore/quickAPI/QuickSet.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,7 @@ namespace quickAPI {
3939
using AudioDeviceCallback = Device::AudioDeviceCallback;
4040
void setAudioDeviceCallback(const AudioDeviceCallback& callback);
4141
void setAudioDeviceInitState(std::unique_ptr<juce::XmlElement> state);
42+
43+
void sendDirectNoteOn(int trackIndex, int noteNum, uint8_t vel);
44+
void sendDirectNoteOff(int trackIndex, int noteNum);
4245
}

src/ui/component/editor/AudioSourceEditor.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ void AudioSourceEditor::paint(juce::Graphics& g) {
1414
g.fillAll(backgroundColor);
1515
}
1616

17-
void AudioSourceEditor::update(uint64_t ref) {
17+
void AudioSourceEditor::update(int index, uint64_t ref) {
18+
this->index = index;
1819
this->ref = ref;
1920
/** TODO */
2021
}

src/ui/component/editor/AudioSourceEditor.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@ class AudioSourceEditor final : public juce::Component {
88

99
void paint(juce::Graphics& g) override;
1010

11-
void update(uint64_t ref);
11+
void update(int index, uint64_t ref);
1212

1313
private:
14+
int index = -1;
1415
uint64_t ref = 0;
1516

1617
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(AudioSourceEditor)

src/ui/component/editor/MIDISourceEditor.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,12 @@ MIDISourceEditor::MIDISourceEditor() {
8585
if (comp) {
8686
comp->mouseWheelOutsideWithAlt(centerNum, thumbPer, deltaY, reversed);
8787
}
88+
},
89+
[comp = MIDISourceEditor::SafePointer(this)]
90+
(int noteNum, bool isDown, float vel) {
91+
if (comp) {
92+
comp->sendKeyUpDown(noteNum, isDown, vel);
93+
}
8894
}
8995
);
9096
this->addAndMakeVisible(this->piano.get());
@@ -204,7 +210,8 @@ void MIDISourceEditor::paint(juce::Graphics& g) {
204210
g.fillRect(bottomRightRect);
205211
}
206212

207-
void MIDISourceEditor::update(uint64_t ref) {
213+
void MIDISourceEditor::update(int index, uint64_t ref) {
214+
this->index = index;
208215
this->ref = ref;
209216

210217
/** Total Length */
@@ -285,3 +292,14 @@ void MIDISourceEditor::processAreaDragEnd() {
285292
this->viewMoving = false;
286293
this->moveStartPosX = this->moveStartPosY = 0;
287294
}
295+
296+
void MIDISourceEditor::sendKeyUpDown(int noteNum, bool isDown, float vel) {
297+
if (this->index > -1) {
298+
if (isDown) {
299+
quickAPI::sendDirectNoteOn(this->index, noteNum, vel * UINT8_MAX);
300+
}
301+
else {
302+
quickAPI::sendDirectNoteOff(this->index, noteNum);
303+
}
304+
}
305+
}

src/ui/component/editor/MIDISourceEditor.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@ class MIDISourceEditor final : public juce::Component {
1212
void resized() override;
1313
void paint(juce::Graphics& g) override;
1414

15-
void update(uint64_t ref);
15+
void update(int index, uint64_t ref);
1616
void updateTempo();
1717

1818
private:
19+
int index = -1;
1920
uint64_t ref = 0;
2021
double totalLength = 0;
2122

@@ -47,5 +48,7 @@ class MIDISourceEditor final : public juce::Component {
4748
void processAreaDragTo(int distanceX, int distanceY, bool moveX = true, bool moveY = true);
4849
void processAreaDragEnd();
4950

51+
void sendKeyUpDown(int noteNum, bool isDown, float vel);
52+
5053
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(MIDISourceEditor)
5154
};

0 commit comments

Comments
 (0)