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();

View File

@@ -368,7 +368,8 @@ public:
//============================== Editor =======================================
class NeuralSynthAudioProcessorEditor : public juce::AudioProcessorEditor,
private juce::Timer
private juce::Timer,
private juce::MidiKeyboardStateListener
{
public:
NeuralSynthAudioProcessorEditor (NeuralSynthAudioProcessor&);
@@ -377,6 +378,8 @@ public:
void paint (juce::Graphics&) override;
void resized() override;
void timerCallback() override;
void handleNoteOn(juce::MidiKeyboardState*, int midiChannel, int midiNoteNumber, float velocity) override;
void handleNoteOff(juce::MidiKeyboardState*, int midiChannel, int midiNoteNumber, float velocity) override;
private:
NeuralSynthAudioProcessor& audioProcessor;
@@ -408,6 +411,8 @@ private:
std::unique_ptr<juce::AudioProcessorValueTreeState::SliderAttachment> gainAttachment;
ScopeComponent<float> mainScopeComponent;
juce::MidiKeyboardState keyboardState;
juce::MidiKeyboardComponent keyboardComponent;
juce::ComboBox layerSelector;
bool controllingLayerB { false };
};

View File

@@ -210,14 +210,14 @@ void NeuralSynthAudioProcessor::prepareToPlay (double sampleRate, int samplesPer
void NeuralSynthAudioProcessor::releaseResources() {}
bool NeuralSynthAudioProcessor::isBusesLayoutSupported (const BusesLayout& layouts) const
/*bool NeuralSynthAudioProcessor::isBusesLayoutSupported (const BusesLayout& layouts) const
{
if (layouts.getMainOutputChannelSet() != juce::AudioChannelSet::mono()
&& layouts.getMainOutputChannelSet() != juce::AudioChannelSet::stereo())
return false;
return true;
}
}*/
void NeuralSynthAudioProcessor::processBlock(juce::AudioSampleBuffer& buffer, juce::MidiBuffer& midiMessages)
{