memlnaut-nisps/modes/MEMLNautModeSoundAnalysisMIDI.hpp

92 lines
2.8 KiB
C++
Raw Normal View History

2025-11-23 16:48:14 +01:00
#pragma once
#include "../src/memllib/interface/MIDIInOut.hpp"
#include "../ThruAudioApp.hpp"
#include "MEMLNautMode.hpp"
#include <memory>
#include <array>
#include "../XiasriAnalysis.hpp"
#include "../src/memllib/utils/sharedMem.hpp"
#include "../src/memllib/audio/AudioDriver.hpp"
2025-11-24 12:29:33 +01:00
#include "../src/memllib/examples/InterfaceRL.hpp"
#include "../src/memllib/PicoDefs.hpp"
2025-11-23 16:48:14 +01:00
class MEMLNautModeSoundAnalysisMIDI {
public:
2025-11-24 12:29:33 +01:00
constexpr static size_t kN_InputParams = XiasriAnalysis::kN_Params + 3; //ML + joystick
InterfaceRL interface;
std::shared_ptr<InterfaceRL> interfacePtr;
2025-11-23 16:48:14 +01:00
XiasriAnalysis mlAnalysis{kSampleRate};
SharedBuffer<float, XiasriAnalysis::kN_Params> machine_list_buffer;
ThruAudioApp<> audioAppSoundAnalysisMIDI;
std::array<String, ThruAudioApp<>::nVoiceSpaces> voiceSpaceList;
std::shared_ptr<MIDIInOut> midi_interf;
2025-11-24 12:29:33 +01:00
void setupInterface() {
interface.setup(kN_InputParams, ThruAudioApp<>::kN_Params);
interface.bindInterface(InterfaceRL::INPUT_MODES::JOYSTICK_AND_MACHINE_LISTENING);
interface.setModeInfo("samidi", "SoundAnalMIDI");
2025-11-24 12:29:33 +01:00
interfacePtr = make_non_owning(interface);
2025-11-23 16:48:14 +01:00
}
2025-11-24 12:29:33 +01:00
String getHelpTitle() {
return "Sound Analysis MIDI Mode";
2025-11-23 16:48:14 +01:00
}
2025-11-24 12:29:33 +01:00
2025-11-23 16:48:14 +01:00
__force_inline stereosample_t process(stereosample_t x) {
return audioAppSoundAnalysisMIDI.Process(x);
}
void setupMIDI(std::shared_ptr<MIDIInOut> new_midi_interf) {
midi_interf = new_midi_interf;
2025-11-24 12:29:33 +01:00
midi_interf->Setup(8);
midi_interf->SetMIDISendChannel(1);
interface.bindMIDI(midi_interf);
2025-11-23 16:48:14 +01:00
}
void addViews() {
};
2025-11-24 12:29:33 +01:00
void setupAudio(float sample_rate) {
audioAppSoundAnalysisMIDI.Setup(sample_rate, interfacePtr);
// Reinitialize XiasriAnalysis filters after maxiSettings is properly configured
mlAnalysis.ReinitFilters();
2025-11-23 16:48:14 +01:00
}
__force_inline void loop() {
audioAppSoundAnalysisMIDI.loop();
}
2025-11-24 12:29:33 +01:00
__force_inline void analyse(stereosample_t x) {
2025-11-23 16:48:14 +01:00
union {
XiasriAnalysis::parameters_t p;
float v[XiasriAnalysis::kN_Params];
} param_u;
param_u.p = mlAnalysis.Process(x.L + x.R);
// Write params into shared_buffer
machine_list_buffer.writeNonBlocking(param_u.v, XiasriAnalysis::kN_Params);
}
2025-11-24 12:29:33 +01:00
// size_t getNMIDICtrlOutputs() {
// return 8;
// }
2025-11-23 16:48:14 +01:00
2025-11-24 12:29:33 +01:00
__force_inline void processAnalysisParams() {
2025-11-23 16:48:14 +01:00
// Read SharedBuffer
std::vector<float> mlist_params(XiasriAnalysis::kN_Params, 0);
machine_list_buffer.readNonBlocking(mlist_params);
// Send parameters to RL interface
2025-11-24 12:29:33 +01:00
interface.readAnalysisParameters(mlist_params);
// PERIODIC_RUN(
// Serial.printf("%f %f %f\n", mlist_params[0], mlist_params[1], mlist_params[2]);
// , 100);
2025-11-23 16:48:14 +01:00
}
2026-03-05 23:25:21 +01:00
void loopCore0() {}
2025-11-23 16:48:14 +01:00
};