Krotos Modules 3
Loading...
Searching...
No Matches
SampleEngine.h
Go to the documentation of this file.
1/*
2==============================================================================
3
4SampleEngine.h
5Created: 16 Oct 2020 13:03:00pm
6Author: sandyw
7
8==============================================================================
9*/
10
11#pragma once
12
13namespace krotos
14{
24 {
25 String name; // The name of this segment's audio sample
26 String path; // The path to this segment's audio sample
27 int sampleRate{0}; // Sample rate of this segment
29 1.0f}; // A factor which when multiplied with this segments audio will normalise its amplitude
30 int segmentStartPosition{0}; // Start of this segment
31 int segmentLength{0}; // Length of this segment
32
33 // Thread Safety Notice:
34 // Previously declared as volatile atomic, these fields (selectionStartPosition, selectionLength)
35 // are accessed by both UI and audio threads. PR krotos_modules_3: #553 removed atomic qualifiers
36 // based on discussions that deemed the potential race condition unlikely to impact performance significantly.
37 // Future changes or observed issues should revisit thread safety measures as discussed in KST-2288.
38
39 volatile int selectionStartPosition{0}; // Start of this selection
40 volatile int selectionLength{0}; // Length of this selection
41 volatile bool muted{false};
42 Value solo;
43 };
44
46 {
47 MSampler = 0,
51 };
52
53 enum class MIDIMode
54 {
55 All = 0,
56 C3,
57 CS3,
58 D3,
59 DS3,
60 E3,
61 F3,
62 FS3,
63 G3,
64 GS3,
65 A3,
66 AS3,
67 B3,
68 C4,
69 CS4,
70 D4,
71 DS4,
72 E4,
73 F4,
74 FS4,
75 G4,
76 GS4,
77 A4,
78 AS4,
79 B4,
81 };
82
84 {
85 public:
86 void newBlockStart() {}
87
88 static const int MAX_NUM_GRAINS{200};
89
91
96 bool isPlaying();
97
104 {
106 {
107 m_updateDisplayTrigger = false; // Cancel the trigger
108 return true;
109 }
110
111 return isPlaying() || getProgressTracker().isLoading();
112 }
113
118
120
122 void setGrainLimit(int newLimit);
123 void freeGrain(Grain* grain);
125 void flushGrains();
126
127 void setPuckPosition(Point<float> position) { m_puckPosition = position; }
128
129 Point<float> getPuckPosition() { return m_puckPosition; }
130
132
134
136
142
148
149 float getIndicator1();
150 void setIndicator1(float newVal);
151
152 float getIndicator2();
153 void setIndicator2(float newVal);
154
155 float getIndicatorRPM();
156 void setIndicatorRPM(float newVal);
157
158 void clearAudioSegments();
159 void addAudioSegment(AudioSegment& seg);
160
161 int getNumAudioSegments() { return m_audioSegments.size(); }
162
167 StringArray getAudioSegmentNames() const;
168
172 const Array<AudioSegment>& getAudioSegments() const { return m_audioSegments; }
173
175 {
176 Range<float> zoomRange(0.f, 1.f);
177
178 /*
179 if (getNumAudioSegments() > 1)
180 {
181 int currentlyPlayingSegment =
182 getSegmentRoundRobinIndex();
183 zoomRange.setStart(getAudioSegmentStartPositionPercent(currentlyPlayingSegment));
184 zoomRange.setEnd(getAudioSegmentEndPositionPercent(currentlyPlayingSegment));
185 }
186 */
187 return zoomRange;
188 }
189
190 // Audio segmentation methods
191
192 // Getters:
194 int getAudioSelectionStartPosition(int segmentIndex);
196 int getAudioSelectionLengthInSamples(int segmentIndex);
198 int getAudioSegmentStartPosition(int segmentIndex);
200 int getAudioSegmentLengthInSamples(int segmentIndex);
201
202 // Setters:
204 void setAudioSelectionRangeRelative(int segmentIndex, Range<int> range);
206 void setAudioSelectionStartPositionAbsolute(int segmentIndex, int startPosition);
208 void setAudioSelectionLength(int segmentIndex, int length);
209
213 std::vector<Range<int>> getSelectionRanges();
218 void setSelectionRanges(const std::vector<Range<int>>& selectionRanges);
219
230 void setSegmentMuted(int segmentIndex, bool isMuted);
231
242 Value& getSoloValue(int index);
243
244 juce::String getGetLoadedFilePathsAsCSV();
245
246 int getAudioSegmentSampleRate(int segmentIndex)
247 {
248 int numSegments = m_audioSegments.size();
249 if (numSegments)
250 {
251 return m_audioSegments[segmentIndex % numSegments].sampleRate;
252 }
253 else
254 {
255 return 0;
256 }
257 }
258
260 {
261 int numSegments = m_audioSegments.size();
262 if (numSegments)
263 {
264 return m_audioSegments[segmentIndex % numSegments].normalisationFactor;
265 }
266 else
267 {
268 return 0;
269 }
270 }
271
276 void setNextSegmentIndex(int index);
277
281 void prepareNextSegmentIndex(bool sequential = true);
282
290 String getNextCuedSegmentName() const;
291
295 const int getNextSegmentIndex() const;
300
305 const int getLastSegmentIndex() const;
306
311 void removeSegment(int segmentIndex);
312
313 private:
314 // Setters
316 void setAudioSelectionRangeAbsolute(int segmentIndex, Range<int> range);
318 void setAudioSegmentStartPosition(int segmentIndex, int startPosition);
320 void setAudioSegmentLength(int segmentIndex, int length);
322 void setAudioSegmentRange(int segmentIndex, Range<int> range);
323
324 // Getters
326 Range<int> getAudioSegmentRange(int segmentIndex);
328 float getAudioSegmentStartPositionPercent(int segmentIndex);
330 float getAudioSegmentEndPositionPercent(int segmentIndex);
332 float getAudioSelectionStartPositionPercent(int segmentIndex);
334 float getAudioSelectionEndPositionPercent(int segmentIndex);
336 Range<int> getAudioSelectionRange(int segmentIndex);
338 Range<int> getAudioSelectionRangeRelative(int segmentIndex);
340 const String& getAudioSegmentName(int segmentIndex) const;
341
342 bool allSegmentsMuted();
343
345 volatile bool m_advancedMode{false};
346 Point<float> m_puckPosition{0.f, 0.f};
349
350 volatile bool m_AnalysisRequested{false};
351 volatile bool m_AnalysisInProgress{false};
352
356
357 volatile float m_indicator1Value{0.f};
358 volatile float m_indicator2Value{0.f};
359 volatile float m_indicatorRPMValue{0.f};
360
361 Array<AudioSegment> m_audioSegments;
362
365
368 };
369} // namespace krotos
Definition OscillatorUtils.h:39
Definition KrotosAudioBufferDSP.h:276
ProgressTracker & getProgressTracker()
Get a reference to this buffer's ProgressTracker.
Definition KrotosAudioBufferDSP.cpp:24
bool isLoading()
Definition KrotosAudioBufferDSP.h:98
Definition SampleEngine.h:84
void setAudioSelectionRangeAbsolute(int segmentIndex, Range< int > range)
Sets the absolute selection range of an audio segment relative to the audio buffer start.
Definition SampleEngine.cpp:183
void setGranularOscillatorTypeIndicator(GranularPlaybackMode newType)
Definition SampleEngine.h:133
volatile bool m_advancedMode
Definition SampleEngine.h:345
GranularPlaybackMode m_oscillatorTypeIndicator
Definition SampleEngine.h:347
int getAudioSegmentLengthInSamples(int segmentIndex)
Returns the length of an audio segment.
Definition SampleEngine.cpp:269
bool hasDisplayUpdated() const
Definition SampleEngine.h:119
void setGrainLimit(int newLimit)
Definition SampleEngine.cpp:64
float getIndicator2()
Definition SampleEngine.cpp:87
int m_grainLimit
Definition SampleEngine.h:355
void flushGrains()
Definition SampleEngine.cpp:75
MIDIMode getGranularOscillatorMIDIMode()
Definition SampleEngine.h:147
float getAudioSegmentNormalisationFactor(int segmentIndex)
Definition SampleEngine.h:259
float getAudioSelectionStartPositionPercent(int segmentIndex)
Returns the start position of an audio segment selection as a fraction of the audio buffer length.
Definition SampleEngine.cpp:169
int getAudioSelectionStartPosition(int segmentIndex)
Returns the start of the selected section of an audio segment.
Definition SampleEngine.cpp:243
void setAudioSelectionStartPositionAbsolute(int segmentIndex, int startPosition)
Sets the absolute start of an audio segment selection relative to the audio buffer start.
Definition SampleEngine.cpp:200
void setSegmentMuted(int segmentIndex, bool isMuted)
'Mutes' an audio segment in the sampler. In effect, this just means the sample is skipped in the roun...
Definition SampleEngine.cpp:372
volatile bool m_AnalysisInProgress
Definition SampleEngine.h:351
bool allSegmentsMuted()
Definition SampleEngine.cpp:360
const String & getAudioSegmentName(int segmentIndex) const
Returns the name of an audio segment.
Definition SampleEngine.cpp:164
Range< int > getAudioSelectionRange(int segmentIndex)
Returns the start and end position of an audio segment selection as a Range.
Definition SampleEngine.cpp:150
void setSelectionRanges(const std::vector< Range< int > > &selectionRanges)
Sets the selection ranges of the audio segments.
Definition SampleEngine.cpp:106
void freeGrain(Grain *grain)
Definition SampleEngine.cpp:66
juce::String getGetLoadedFilePathsAsCSV()
Definition SampleEngine.cpp:212
Grain * allocateGrain()
Definition SampleEngine.cpp:31
float getIndicatorRPM()
Definition SampleEngine.cpp:90
void setAudioSelectionLength(int segmentIndex, int length)
Sets the length of an audio segment selection.
Definition SampleEngine.cpp:206
float getAudioSegmentEndPositionPercent(int segmentIndex)
Returns the end position of an audio segment as a fraction of the audio buffer length.
Definition SampleEngine.cpp:142
const Array< AudioSegment > & getAudioSegments() const
Returns the audio segment array loaded in the sample engine.(read-only)
Definition SampleEngine.h:172
bool m_allSegmentsMuted
Definition SampleEngine.h:366
volatile float m_indicator2Value
Definition SampleEngine.h:358
static const int MAX_NUM_GRAINS
Definition SampleEngine.h:88
float getAudioSelectionEndPositionPercent(int segmentIndex)
Returns the end position of an audio segment selection as a fraction of the audio buffer length.
Definition SampleEngine.cpp:175
void setAudioSelectionRangeRelative(int segmentIndex, Range< int > range)
Sets the selection range of an audio segment relative to the segment.
Definition SampleEngine.cpp:189
Point< float > getPuckPosition()
Definition SampleEngine.h:129
int m_lastSegmentRoundRobinIndex
Definition SampleEngine.h:364
void prepareNextSegmentIndex(bool sequential=true)
Calculate the next segment to be played back.
Definition SampleEngine.cpp:319
const int getCurrentSegmentIndex() const
Returns the index of the next segment to be played.
Definition SampleEngine.h:299
void setNextSegmentIndex(int index)
Sets the next segment index to be picked.
Definition SampleEngine.cpp:291
float getIndicator1()
Definition SampleEngine.cpp:84
Grain m_grainArray[MAX_NUM_GRAINS]
Definition SampleEngine.h:354
int getAudioSelectionLengthInSamples(int segmentIndex)
Returns the length of the selected section of an audio segment.
Definition SampleEngine.cpp:249
const int getNextSegmentIndex() const
Returns the index of the next segment to be played.
Definition SampleEngine.cpp:413
Array< AudioSegment > m_audioSegments
Definition SampleEngine.h:361
volatile float m_indicator1Value
Definition SampleEngine.h:357
int getNumAudioSegments()
Definition SampleEngine.h:161
volatile bool m_AnalysisRequested
Definition SampleEngine.h:350
GranularPlaybackMode getGranularOscillatorTypeIndicator()
Definition SampleEngine.h:135
void setIndicator1(float newVal)
Definition SampleEngine.cpp:85
std::vector< Range< int > > getSelectionRanges()
Returns an array of segment selection ranges.
Definition SampleEngine.cpp:96
bool shouldUpdateDisplay()
returns true if the sample engine requires the grain display to be redrawn
Definition SampleEngine.h:103
String getNextCuedSegmentName() const
Returns the next cued segment name TODO: Update this to return actual cued segment....
Definition SampleEngine.cpp:411
const int getLastSegmentIndex() const
Returns the index of the previous segment that was played.
Definition SampleEngine.cpp:414
bool isPlaying()
returns true if any grains are active
Definition SampleEngine.cpp:17
void triggerDisplayUpdate()
send a trigger signal for the grain display to redraw
Definition SampleEngine.h:117
volatile float m_indicatorRPMValue
Definition SampleEngine.h:359
void clearAudioSegments()
Definition SampleEngine.cpp:93
bool m_updateDisplayTrigger
Definition SampleEngine.h:344
void setIndicatorRPM(float newVal)
Definition SampleEngine.cpp:91
Point< float > m_puckPosition
Definition SampleEngine.h:346
Range< int > getAudioSelectionRangeRelative(int segmentIndex)
Returns the selection range of an audio segment relative to the segment's start position.
Definition SampleEngine.cpp:158
int m_segmentRoundRobinIndex
Definition SampleEngine.h:363
void calculatePolyphonyCount()
Definition SampleEngine.cpp:4
Range< int > getAudioSegmentRange(int segmentIndex)
Returns the start and end positions of an audio segment as a Range.
Definition SampleEngine.cpp:283
void requestAnalysis()
Definition SampleEngine.h:131
void setPuckPosition(Point< float > position)
Definition SampleEngine.h:127
Value & getSoloValue(int index)
Returns a reference to the 'solo' Value of an audio segment. You can use Value::referTo to have the s...
Definition SampleEngine.cpp:416
int getAudioSegmentSampleRate(int segmentIndex)
Definition SampleEngine.h:246
Range< float > getPlayingWaveformZoomRange()
Definition SampleEngine.h:174
void addAudioSegment(AudioSegment &seg)
Definition SampleEngine.cpp:94
int getAudioSegmentStartPosition(int segmentIndex)
Returns the start of an audio segment.
Definition SampleEngine.cpp:263
float getAudioSegmentStartPositionPercent(int segmentIndex)
Returns the start position of an audio segment as a fraction of the audio buffer length.
Definition SampleEngine.cpp:136
Grain * getGrainArray()
Definition SampleEngine.cpp:73
void setIndicator2(float newVal)
Definition SampleEngine.cpp:88
void newBlockStart()
Definition SampleEngine.h:86
StringArray getAudioSegmentNames() const
Returns a StringArray of audio segment names loaded in the engine.
Definition SampleEngine.cpp:233
int m_skippedSegmentIndex
Definition SampleEngine.h:367
int m_currentPolyphony
Definition SampleEngine.h:353
void setAudioSegmentStartPosition(int segmentIndex, int startPosition)
Sets the start of an audio segment relative to the audio buffer start.
Definition SampleEngine.cpp:118
void setAudioSegmentRange(int segmentIndex, Range< int > range)
Sets the start and end of an audio segment relative to the audio buffer start.
Definition SampleEngine.cpp:130
void setAudioSegmentLength(int segmentIndex, int length)
Sets the length an audio segment.
Definition SampleEngine.cpp:124
void setGranularOscillatorMIDIMode(MIDIMode newMode)
Definition SampleEngine.h:141
void removeSegment(int segmentIndex)
Remove a segment from the sample engine.
Definition SampleEngine.cpp:310
MIDIMode m_oscillatorMIDIMode
Definition SampleEngine.h:348
Definition AirAbsorptionFilter.cpp:2
GranularPlaybackMode
Definition SampleEngine.h:46
MIDIMode
Definition SampleEngine.h:54
A struct to describe an audio sample (as appears in the waveform view)
Definition SampleEngine.h:24
int segmentLength
Definition SampleEngine.h:31
float normalisationFactor
Definition SampleEngine.h:28
volatile int selectionStartPosition
Definition SampleEngine.h:39
String name
Definition SampleEngine.h:25
int segmentStartPosition
Definition SampleEngine.h:30
volatile bool muted
Definition SampleEngine.h:41
int sampleRate
Definition SampleEngine.h:27
volatile int selectionLength
Definition SampleEngine.h:40
Value solo
Definition SampleEngine.h:42
String path
Definition SampleEngine.h:26