mirror of
https://codeberg.org/armin/monoslicer.git
synced 2026-09-01 04:10:45 +02:00
Reduce plugin width by 102px and fix bottom panel layout to scale proportionally
This commit is contained in:
parent
d9302ad77a
commit
f035e89ba9
9 changed files with 305 additions and 106 deletions
|
|
@ -40,7 +40,8 @@ void SliceManager::autoSlice()
|
|||
if (!sampleBuffer || sampleBuffer->getNumSamples() == 0)
|
||||
return;
|
||||
|
||||
pushHistory();
|
||||
if (beforeChangeCallback) beforeChangeCallback();
|
||||
|
||||
|
||||
const int numSamples = sampleBuffer->getNumSamples();
|
||||
const int numChannels = sampleBuffer->getNumChannels();
|
||||
|
|
@ -106,7 +107,8 @@ void SliceManager::autoSlice()
|
|||
void SliceManager::clearSlices()
|
||||
{
|
||||
const juce::CriticalSection::ScopedLockType lock(mutex);
|
||||
pushHistory();
|
||||
if (beforeChangeCallback) beforeChangeCallback();
|
||||
|
||||
slices.clear();
|
||||
}
|
||||
|
||||
|
|
@ -121,12 +123,13 @@ void SliceManager::addSliceManual(int samplePos)
|
|||
{
|
||||
const juce::CriticalSection::ScopedLockType lock(mutex);
|
||||
if (!sampleBuffer) return;
|
||||
if (beforeChangeCallback) beforeChangeCallback();
|
||||
const int numSamples = sampleBuffer->getNumSamples();
|
||||
samplePos = juce::jlimit(1, numSamples - 1, samplePos);
|
||||
|
||||
if (slices.empty())
|
||||
{
|
||||
pushHistory();
|
||||
|
||||
slices.push_back({ 0, numSamples, 0 });
|
||||
assignMidiNotes();
|
||||
return;
|
||||
|
|
@ -135,7 +138,7 @@ void SliceManager::addSliceManual(int samplePos)
|
|||
int idx = findSliceIndexForSample(samplePos);
|
||||
if (idx < 0)
|
||||
{
|
||||
pushHistory();
|
||||
|
||||
slices.push_back({ samplePos, numSamples, 0 });
|
||||
sortSlices();
|
||||
assignMidiNotes();
|
||||
|
|
@ -146,7 +149,7 @@ void SliceManager::addSliceManual(int samplePos)
|
|||
if (samplePos <= parent.startSample || samplePos >= parent.endSample)
|
||||
return;
|
||||
|
||||
pushHistory();
|
||||
|
||||
|
||||
int oldEnd = parent.endSample;
|
||||
parent.endSample = samplePos;
|
||||
|
|
@ -159,12 +162,13 @@ void SliceManager::addSliceManual(int samplePos)
|
|||
void SliceManager::removeSliceAt(int samplePos, int tolerance)
|
||||
{
|
||||
const juce::CriticalSection::ScopedLockType lock(mutex);
|
||||
if (beforeChangeCallback) beforeChangeCallback();
|
||||
for (auto it = slices.begin(); it != slices.end(); ++it)
|
||||
{
|
||||
int dist = std::abs(it->startSample - samplePos);
|
||||
if (dist <= tolerance)
|
||||
{
|
||||
pushHistory();
|
||||
|
||||
int removedEnd = it->endSample;
|
||||
auto idx = static_cast<int>(std::distance(slices.begin(), it));
|
||||
slices.erase(it);
|
||||
|
|
@ -179,11 +183,12 @@ void SliceManager::removeSliceAt(int samplePos, int tolerance)
|
|||
void SliceManager::moveSlice(int fromSample, int toSample)
|
||||
{
|
||||
const juce::CriticalSection::ScopedLockType lock(mutex);
|
||||
if (beforeChangeCallback) beforeChangeCallback();
|
||||
for (size_t i = 0; i < slices.size(); ++i)
|
||||
{
|
||||
if (std::abs(slices[i].startSample - fromSample) < 10)
|
||||
{
|
||||
pushHistory();
|
||||
|
||||
slices[i].startSample = juce::jlimit(0, sampleBuffer->getNumSamples() - 1, toSample);
|
||||
if (i > 0)
|
||||
slices[i - 1].endSample = slices[i].startSample;
|
||||
|
|
@ -199,10 +204,11 @@ void SliceManager::trimStart(int sample)
|
|||
{
|
||||
const juce::CriticalSection::ScopedLockType lock(mutex);
|
||||
if (!sampleBuffer || sampleBuffer->getNumSamples() == 0) return;
|
||||
if (beforeChangeCallback) beforeChangeCallback();
|
||||
sample = juce::jlimit(0, sampleBuffer->getNumSamples() - 1, sample);
|
||||
if (sample <= 0) return;
|
||||
|
||||
pushHistory();
|
||||
|
||||
|
||||
const int numChannels = sampleBuffer->getNumChannels();
|
||||
const int oldNumSamples = sampleBuffer->getNumSamples();
|
||||
|
|
@ -239,11 +245,12 @@ void SliceManager::trimEnd(int sample)
|
|||
{
|
||||
const juce::CriticalSection::ScopedLockType lock(mutex);
|
||||
if (!sampleBuffer || sampleBuffer->getNumSamples() == 0) return;
|
||||
if (beforeChangeCallback) beforeChangeCallback();
|
||||
const int numSamples = sampleBuffer->getNumSamples();
|
||||
sample = juce::jlimit(0, numSamples, sample);
|
||||
if (sample >= numSamples) return;
|
||||
|
||||
pushHistory();
|
||||
|
||||
|
||||
const int numChannels = sampleBuffer->getNumChannels();
|
||||
|
||||
|
|
@ -283,8 +290,10 @@ void SliceManager::sortSlices()
|
|||
|
||||
void SliceManager::assignMidiNotes()
|
||||
{
|
||||
const int numRows = 25;
|
||||
const int baseMidiNote = 60;
|
||||
for (int i = 0; i < static_cast<int>(slices.size()); ++i)
|
||||
slices[static_cast<size_t>(i)].midiNote = i % 12;
|
||||
slices[static_cast<size_t>(i)].midiNote = baseMidiNote + (i % numRows);
|
||||
}
|
||||
|
||||
std::vector<float> SliceManager::computeEnvelope(const float* data, int numSamples)
|
||||
|
|
@ -364,37 +373,3 @@ std::vector<float> SliceManager::detectOnsets(const std::vector<float>& envelope
|
|||
return onsets;
|
||||
}
|
||||
|
||||
void SliceManager::pushHistory()
|
||||
{
|
||||
undoStack.push_back(slices);
|
||||
if (undoStack.size() > maxHistory)
|
||||
undoStack.erase(undoStack.begin());
|
||||
redoStack.clear();
|
||||
}
|
||||
|
||||
void SliceManager::truncateHistory()
|
||||
{
|
||||
undoStack.clear();
|
||||
redoStack.clear();
|
||||
}
|
||||
|
||||
void SliceManager::undo()
|
||||
{
|
||||
const juce::CriticalSection::ScopedLockType lock(mutex);
|
||||
if (undoStack.empty()) return;
|
||||
redoStack.push_back(slices);
|
||||
slices = undoStack.back();
|
||||
undoStack.pop_back();
|
||||
}
|
||||
|
||||
void SliceManager::redo()
|
||||
{
|
||||
const juce::CriticalSection::ScopedLockType lock(mutex);
|
||||
if (redoStack.empty()) return;
|
||||
undoStack.push_back(slices);
|
||||
slices = redoStack.back();
|
||||
redoStack.pop_back();
|
||||
}
|
||||
|
||||
bool SliceManager::canUndo() const { return !undoStack.empty(); }
|
||||
bool SliceManager::canRedo() const { return !redoStack.empty(); }
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue