monoslicer/Source/SliceManager.h

66 lines
1.9 KiB
C
Raw Normal View History

2026-07-21 02:06:45 +02:00
#pragma once
#include <juce_audio_processors/juce_audio_processors.h>
#include <juce_dsp/juce_dsp.h>
#include <vector>
#include <algorithm>
#include <cmath>
#include <functional>
2026-07-21 02:06:45 +02:00
class SliceManager
{
public:
struct Slice
{
int startSample;
int endSample;
int midiNote; // full MIDI note (60 = C4, 61 = C#4, ..., 83 = B5)
2026-07-21 02:06:45 +02:00
};
SliceManager();
void setSampleBuffer(juce::AudioBuffer<float>* buffer, double sampleRate);
void setSensitivity(float s);
void setBassGain(float g);
void setTrebleGain(float g);
void autoSlice();
void clearSlices();
void addSliceManual(int samplePos);
void removeSliceAt(int samplePos, int tolerance = 5);
void moveSlice(int fromSample, int toSample);
void trimStart(int sample);
void trimEnd(int sample);
std::vector<Slice> getSlices() const;
int getNumSlices() const;
Slice getSlice(int index) const;
void setSlices(const std::vector<Slice>& newSlices);
2026-07-21 02:06:45 +02:00
void setBeforeChangeCallback(std::function<void()> cb) { beforeChangeCallback = std::move(cb); }
2026-07-21 02:06:45 +02:00
int findSliceIndexForSample(int samplePos) const;
juce::AudioBuffer<float>* getMutableBuffer() { return sampleBuffer; }
private:
void sortSlices();
void assignMidiNotes();
mutable juce::CriticalSection mutex;
2026-07-21 02:06:45 +02:00
std::vector<Slice> slices;
juce::AudioBuffer<float>* sampleBuffer = nullptr;
double currentSampleRate = 44100.0;
float sensitivity = 0.5f;
float bassGain = 1.0f;
float trebleGain = 1.0f;
std::function<void()> beforeChangeCallback;
2026-07-21 02:06:45 +02:00
std::vector<float> computeEnvelope(const float* channelData, int numSamples);
std::vector<float> lowpassFilter(const std::vector<float>& input, float cutoffHz);
std::vector<float> highpassFilter(const std::vector<float>& input, float cutoffHz);
std::vector<float> detectOnsets(const std::vector<float>& envelope, float threshold);
};