Skip to content

Commit c41764a

Browse files
committed
sampler revert
1 parent c971ab2 commit c41764a

2 files changed

Lines changed: 56 additions & 24 deletions

File tree

‎Source/Node/nodes/sampler/SamplerNode.cpp‎

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ SamplerNode::SamplerNode(var params) :
5050
clearLastRecordedTrigger = controlsCC.addTrigger("Clear", "Clear Last recorded or played note");
5151
clearAllNotesTrigger = controlsCC.addTrigger("Clear All Notes", "Clear all recorded notes");
5252

53+
revertLastMode = controlsCC.addEnumParameter("Revert Last Mode", "The way to revert when revert last is triggered");
54+
revertLastMode->addOption("Last Played", LAST_PLAYED)->addOption("Last Recorded", LAST_RECORDED);
55+
56+
revertLastRecordedTrigger = controlsCC.addTrigger("Revert", "Revert Last recorded or played note");
57+
5358
startAutoKey = controlsCC.addIntParameter("Start Auto Key", "The pitch to start auto key computation from", 0, 0, 127);
5459
endAutoKey = controlsCC.addIntParameter("End Auto Key", "The pitch to end auto key computation from", 127, 0, 127);
5560

@@ -173,6 +178,19 @@ void SamplerNode::clearNote(int note)
173178

174179
}
175180

181+
void SamplerNode::revertNote(int note)
182+
{
183+
if (note == -1 || note >= samplerNotes.size()) return;
184+
ScopedSuspender sp(processor);
185+
auto* sn = samplerNotes[note];
186+
if (sn->state->getValueDataAsEnum<NoteState>() != FILLED) return;
187+
188+
for (int i = 0; i < sn->buffer.getNumChannels(); i++)
189+
{
190+
sn->buffer.reverse(i, 0, sn->buffer.getNumSamples());
191+
}
192+
}
193+
176194
void SamplerNode::clearAllNotes()
177195
{
178196
stopRecording();
@@ -443,6 +461,17 @@ void SamplerNode::onControllableFeedbackUpdateInternal(ControllableContainer* cc
443461
{
444462
clearAllNotes();
445463
}
464+
else if (c == revertLastRecordedTrigger)
465+
{
466+
if (revertLastMode->getValueDataAsEnum<ClearMode>() == LAST_RECORDED)
467+
{
468+
revertNote(lastRecordedNote);
469+
}
470+
else
471+
{
472+
revertNote(lastPlayedNote);
473+
}
474+
}
446475
else if (c == loadBankTrigger)
447476
{
448477
loadBankSamples();

‎Source/Node/nodes/sampler/SamplerNode.h‎

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ class SamplerNode :
3535
EnumParameter* hitMode;
3636
IntParameter* oneShotFadeTimeMS;
3737
BoolParameter* autoKeyLiveMode;
38-
IntParameter* autoKeyFadeTimeMS;
39-
BoolParameter* autoKeyLoopFade;
40-
EnumParameter* autoKeyMode;
38+
IntParameter* autoKeyFadeTimeMS;
39+
BoolParameter* autoKeyLoopFade;
40+
EnumParameter* autoKeyMode;
4141

4242
// --- New RubberBand Parameters ---
4343
BoolParameter* rbPreserveFormants;
@@ -46,11 +46,13 @@ class SamplerNode :
4646
EnumParameter* rbWindowSize;
4747

4848
ControllableContainer controlsCC;
49-
BoolParameter* clearMode;
50-
enum ClearMode { LAST_PLAYED, LAST_RECORDED };
51-
EnumParameter* clearLastMode;
52-
Trigger* clearLastRecordedTrigger;
53-
Trigger* clearAllNotesTrigger;
49+
BoolParameter* clearMode;
50+
enum ClearMode { LAST_PLAYED, LAST_RECORDED };
51+
EnumParameter* clearLastMode;
52+
Trigger* clearLastRecordedTrigger;
53+
Trigger* clearAllNotesTrigger;
54+
EnumParameter* revertLastMode;
55+
Trigger* revertLastRecordedTrigger;
5456
IntParameter* startAutoKey;
5557
IntParameter* endAutoKey;
5658
Trigger* computeAutoKeysTrigger;
@@ -132,9 +134,9 @@ class SamplerNode :
132134

133135
//offline pitching
134136
double shifting = 0;
135-
int fadeNumSamples = 0;
136-
int autoKeyAlgorithm = 0;
137-
bool loopFadeEnabled = false;
137+
int fadeNumSamples = 0;
138+
int autoKeyAlgorithm = 0;
139+
bool loopFadeEnabled = false;
138140

139141
// --- RubberBand Offline Params ---
140142
bool optFormants = false;
@@ -151,21 +153,22 @@ class SamplerNode :
151153
std::unique_ptr<RubberBand::RubberBandStretcher> pitcher;
152154

153155
void setAutoKey(SamplerNote* remoteNote, double shift = 0);
154-
void computeAutoKey(SamplerNote* remoteNote, double shift, int fadeSamples, int algorithm, bool formants, int transients, int pitchMode, int windowSize, bool shouldLoopFade);
156+
void computeAutoKey(SamplerNote* remoteNote, double shift, int fadeSamples, int algorithm, bool formants, int transients, int pitchMode, int windowSize, bool shouldLoopFade);
155157

156-
void run();
157-
158-
void reset();
159-
160-
bool hasContent() const { return buffer.getNumSamples() > 0; }
161-
bool isProxyNote() const { return autoKeyFromNote != nullptr; }
162-
};
163-
164-
OwnedArray<SamplerNote> samplerNotes;
158+
void run();
159+
160+
void reset();
161+
162+
bool hasContent() const { return buffer.getNumSamples() > 0; }
163+
bool isProxyNote() const { return autoKeyFromNote != nullptr; }
164+
};
165165

166-
void clearNote(int note);
167-
void clearAllNotes();
168-
void resetAllNotes();
166+
OwnedArray<SamplerNote> samplerNotes;
167+
168+
void revertNote(int note);
169+
void clearNote(int note);
170+
void clearAllNotes();
171+
void resetAllNotes();
169172

170173
void computeAutoKeys();
171174

0 commit comments

Comments
 (0)