Fixes to the UI

This commit is contained in:
Tim
2025-10-26 00:49:50 +01:00
parent 0785f6fedd
commit c5105693a2
76 changed files with 2280 additions and 32 deletions

View File

@@ -8,12 +8,21 @@
NeuralSynthAudioProcessorEditor::NeuralSynthAudioProcessorEditor (NeuralSynthAudioProcessor& p)
: AudioProcessorEditor (&p),
audioProcessor (p),
mainScopeComponent(audioProcessor.getAudioBufferQueue())
mainScopeComponent(audioProcessor.getAudioBufferQueue()),
keyboardComponent(keyboardState, juce::MidiKeyboardComponent::horizontalKeyboard)
{
auto& tree = audioProcessor.parameters;
addAndMakeVisible(mainScopeComponent);
keyboardState.addListener(this);
keyboardComponent.setMidiChannel(1);
keyboardComponent.setScrollButtonsVisible(true);
keyboardComponent.setKeyWidth(36.0f);
keyboardComponent.setAvailableRange(36, 96);
keyboardComponent.setVelocity(1.0f, true);
addAndMakeVisible(keyboardComponent);
presetMenuButton.setButtonText("Preset");
presetMenuButton.onClick = [this] { showPresetMenu(); };
addAndMakeVisible(presetMenuButton);
@@ -185,6 +194,7 @@ NeuralSynthAudioProcessorEditor::NeuralSynthAudioProcessorEditor (NeuralSynthAud
NeuralSynthAudioProcessorEditor::~NeuralSynthAudioProcessorEditor()
{
stopTimer();
keyboardState.removeListener(this);
}
//==============================================================================
@@ -199,7 +209,7 @@ void NeuralSynthAudioProcessorEditor::resized()
auto outer = getLocalBounds().reduced(16);
// --- carve out sidebar for MASTER (right side) --------------------------
const int sidebarWidth = 160; // tweak if you want it wider/narrower
const int sidebarWidth = 100; // tweak if you want it wider/narrower
auto gridArea = outer;
auto sidebar = gridArea.removeFromRight(sidebarWidth).reduced(8);
@@ -217,17 +227,18 @@ void NeuralSynthAudioProcessorEditor::resized()
juce::Grid grid;
grid.templateRows = {
juce::Grid::TrackInfo(juce::Grid::Fr(22)), // scope band
juce::Grid::TrackInfo(juce::Grid::Fr(39)), // row 1
juce::Grid::TrackInfo(juce::Grid::Fr(78)) // row 2 (wider to absorb layer panel)
juce::Grid::TrackInfo(juce::Grid::Fr(10)), // scope band
juce::Grid::TrackInfo(juce::Grid::Fr(35)), // row 1
juce::Grid::TrackInfo(juce::Grid::Fr(35)), // row 2
juce::Grid::TrackInfo(juce::Grid::Fr(20)) // keyboard
};
grid.templateColumns = {
juce::Grid::TrackInfo(juce::Grid::Fr(1)),
juce::Grid::TrackInfo(juce::Grid::Fr(1)),
juce::Grid::TrackInfo(juce::Grid::Fr(1)),
juce::Grid::TrackInfo(juce::Grid::Fr(1)),
juce::Grid::TrackInfo(juce::Grid::Fr(1))
juce::Grid::TrackInfo(juce::Grid::Fr(20)),
juce::Grid::TrackInfo(juce::Grid::Fr(20)),
juce::Grid::TrackInfo(juce::Grid::Fr(20)),
juce::Grid::TrackInfo(juce::Grid::Fr(20)),
juce::Grid::TrackInfo(juce::Grid::Fr(20))
};
grid.rowGap = juce::Grid::Px(0);
@@ -236,7 +247,7 @@ void NeuralSynthAudioProcessorEditor::resized()
grid.items.clear();
// Row 1 (scope row)
grid.items.add(juce::GridItem(mainScopeComponent).withArea(1, 1, 1, 5));
grid.items.add(juce::GridItem(mainScopeComponent).withArea({}, juce::GridItem::Span(4)));
// Put preset button at the top-right cell of the scope row
grid.items.add(juce::GridItem(presetMenuButton)
.withArea(1, 5)
@@ -244,22 +255,39 @@ void NeuralSynthAudioProcessorEditor::resized()
.withAlignSelf(juce::GridItem::AlignSelf::start));
// Row 2 (top row of panels): Amp Env, Chorus, Delay, Reverb, EQ
grid.items.add(juce::GridItem(*adsrComponent ).withArea(2, 1));
grid.items.add(juce::GridItem(*chorusComponent ).withArea(2, 2));
grid.items.add(juce::GridItem(*delayComponent ).withArea(2, 3));
grid.items.add(juce::GridItem(*reverbComponent ).withArea(2, 4));
grid.items.add(juce::GridItem(*eqComponent ).withArea(2, 5));
grid.items.add(juce::GridItem(*adsrComponent ));
grid.items.add(juce::GridItem(*chorusComponent ));
grid.items.add(juce::GridItem(*delayComponent ));
grid.items.add(juce::GridItem(*reverbComponent ));
grid.items.add(juce::GridItem(*eqComponent ));
// Row 3 (bottom row of panels): Flanger, Distortion, Filter, Filter Env, Wavetable
grid.items.add(juce::GridItem(*flangerComponent ).withArea(3, 1));
grid.items.add(juce::GridItem(*distortionComponent).withArea(3, 2));
grid.items.add(juce::GridItem(*filterComponent ).withArea(3, 3));
grid.items.add(juce::GridItem(*filterEnvComponent ).withArea(3, 4));
grid.items.add(juce::GridItem(*wtComponent ).withArea(3, 5));
grid.items.add(juce::GridItem(*flangerComponent ));
grid.items.add(juce::GridItem(*distortionComponent));
grid.items.add(juce::GridItem(*filterComponent ));
grid.items.add(juce::GridItem(*filterEnvComponent ));
grid.items.add(juce::GridItem(*wtComponent ));
// Row 4: MIDI keyboard spans entire width
grid.items.add(juce::GridItem(keyboardComponent).withArea({}, juce::GridItem::Span(5)));
grid.performLayout(gridArea);
}
void NeuralSynthAudioProcessorEditor::handleNoteOn(juce::MidiKeyboardState*, int midiChannel, int midiNoteNumber, float velocity)
{
auto message = juce::MidiMessage::noteOn(midiChannel, midiNoteNumber, velocity);
message.setTimeStamp(juce::Time::getMillisecondCounterHiRes() * 0.001);
audioProcessor.midiMessageCollector.addMessageToQueue(message);
}
void NeuralSynthAudioProcessorEditor::handleNoteOff(juce::MidiKeyboardState*, int midiChannel, int midiNoteNumber, float velocity)
{
auto message = juce::MidiMessage::noteOff(midiChannel, midiNoteNumber, velocity);
message.setTimeStamp(juce::Time::getMillisecondCounterHiRes() * 0.001);
audioProcessor.midiMessageCollector.addMessageToQueue(message);
}
void NeuralSynthAudioProcessorEditor::timerCallback()
{
const int current = audioProcessor.getCurrentPresetIndex();