Files
-
blinds / hardware_design / pcb / blinds_v60.brd
-
blinds / hardware_design / pcb / blinds_v60.sch
-
braids / hardware_design / pcb / braids_v50.brd
-
braids / hardware_design / pcb / braids_v50.sch
-
branches / hardware_design / pcb / branches_v40.brd
-
branches / hardware_design / pcb / branches_v40.sch
-
clouds / hardware_design / pcb / clouds_v30.brd
-
clouds / hardware_design / pcb / clouds_v30.sch
-
ears / hardware_design / panel / ears_panel_v30.brd
-
ears / hardware_design / panel / ears_panel_v30.sch
-
ears / hardware_design / pcb / ears_v40.brd
-
ears / hardware_design / pcb / ears_v40.sch
-
edges / hardware_design / pcb / edges_expander_v01.brd
-
edges / hardware_design / pcb / edges_expander_v01.sch
-
edges / hardware_design / pcb / edges_v20.brd
-
edges / hardware_design / pcb / edges_v20.sch
-
elements / hardware_design / pcb / elements_v02.brd
-
elements / hardware_design / pcb / elements_v02.sch
-
frames / hardware_design / pcb / frames_v03.brd
-
frames / hardware_design / pcb / frames_v03.sch
-
grids / hardware_design / pcb / grids_v02.brd
-
grids / hardware_design / pcb / grids_v02.sch
-
kinks / hardware_design / pcb / kinks_v41.brd
-
kinks / hardware_design / pcb / kinks_v41.sch
-
links / hardware_design / pcb / links_v40.brd
-
links / hardware_design / pcb / links_v40.sch
-
marbles / hardware_design / pcb / marbles_v70.brd
-
marbles / hardware_design / pcb / marbles_v70.sch
-
peaks / hardware_design / pcb / peaks_v30.brd
-
peaks / hardware_design / pcb / peaks_v30.sch
-
plaits / hardware_design / pcb / plaits_v50.brd
-
plaits / hardware_design / pcb / plaits_v50.sch
-
rings / hardware_design / pcb / rings_v30.brd
-
rings / hardware_design / pcb / rings_v30.sch
-
ripples / hardware_design / pcb / ripples_v40.brd
-
ripples / hardware_design / pcb / ripples_v40.sch
-
shades / hardware_design / pcb / shades_v30.brd
-
shades / hardware_design / pcb / shades_v30.sch
-
shelves / hardware_design / pcb / shelves_expander_v10.brd
-
shelves / hardware_design / pcb / shelves_expander_v10.sch
-
shelves / hardware_design / pcb / shelves_v05.brd
-
shelves / hardware_design / pcb / shelves_v05.sch
-
stages / hardware_design / pcb / stages_v70.brd
-
stages / hardware_design / pcb / stages_v70.sch
-
streams / hardware_design / pcb / streams_v02_bargraph.brd
-
streams / hardware_design / pcb / streams_v02_bargraph.sch
-
streams / hardware_design / pcb / streams_v05.brd
-
streams / hardware_design / pcb / streams_v05.sch
-
tides / hardware_design / pcb / tides_v40.brd
-
tides / hardware_design / pcb / tides_v40.sch
-
veils / hardware_design / pcb / veils_v40.brd
-
veils / hardware_design / pcb / veils_v40.sch
-
volts / hardware_design / pcb / volts_v01.brd
-
volts / hardware_design / pcb / volts_v01.sch
-
warps / hardware_design / pcb / warps_v30.brd
-
warps / hardware_design / pcb / warps_v30.sch
-
yarns / hardware_design / pcb / yarns_v03.brd
-
yarns / hardware_design / pcb / yarns_v03.sch
Last update 6 years 1 month
by
Olivier Gillet
granular_processor.h// Copyright 2014 Olivier Gillet. // // Author: Olivier Gillet (ol.gillet@gmail.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // // See http://creativecommons.org/licenses/MIT/ for more information. // // ----------------------------------------------------------------------------- // // Main processing class. #ifndef CLOUDS_DSP_GRANULAR_PROCESSOR_H_ #define CLOUDS_DSP_GRANULAR_PROCESSOR_H_ #include "stmlib/stmlib.h" #include "stmlib/dsp/filter.h" #include "clouds/dsp/correlator.h" #include "clouds/dsp/frame.h" #include "clouds/dsp/fx/diffuser.h" #include "clouds/dsp/fx/pitch_shifter.h" #include "clouds/dsp/fx/reverb.h" #include "clouds/dsp/granular_processor.h" #include "clouds/dsp/granular_sample_player.h" #include "clouds/dsp/looping_sample_player.h" #include "clouds/dsp/pvoc/phase_vocoder.h" #include "clouds/dsp/sample_rate_converter.h" #include "clouds/dsp/wsola_sample_player.h" namespace clouds { const int32_t kDownsamplingFactor = 2; enum PlaybackMode { PLAYBACK_MODE_GRANULAR, PLAYBACK_MODE_STRETCH, PLAYBACK_MODE_LOOPING_DELAY, PLAYBACK_MODE_SPECTRAL, PLAYBACK_MODE_LAST }; // State of the recording buffer as saved in one of the 4 sample memories. struct PersistentState { int32_t write_head[2]; uint8_t quality; uint8_t spectral; }; // Data block as saved in one of the 4 sample memories. struct PersistentBlock { uint32_t tag; uint32_t size; void* data; }; class GranularProcessor { public: GranularProcessor() { } ~GranularProcessor() { } void Init( void* large_buffer, size_t large_buffer_size, void* small_buffer, size_t small_buffer_size); void Process(ShortFrame* input, ShortFrame* output, size_t size); void Prepare(); inline Parameters* mutable_parameters() { return ¶meters_; } inline const Parameters& parameters() const { return parameters_; } inline void ToggleFreeze() { parameters_.freeze = !parameters_.freeze; } inline void set_freeze(bool freeze) { parameters_.freeze = freeze; } inline bool frozen() const { return parameters_.freeze; } inline void set_silence(bool silence) { silence_ = silence; } inline void set_bypass(bool bypass) { bypass_ = bypass; } inline bool bypass() const { return bypass_; } inline void set_playback_mode(PlaybackMode playback_mode) { playback_mode_ = playback_mode; } inline PlaybackMode playback_mode() const { return playback_mode_; } inline void set_quality(int32_t quality) { set_num_channels(quality & 1 ? 1 : 2); set_low_fidelity(quality >> 1 ? true : false); } inline void set_num_channels(int32_t num_channels) { reset_buffers_ = reset_buffers_ || num_channels_ != num_channels; num_channels_ = num_channels; } inline void set_low_fidelity(bool low_fidelity) { reset_buffers_ = reset_buffers_ || low_fidelity != low_fidelity_; low_fidelity_ = low_fidelity; } inline int32_t quality() const { int32_t quality = 0; if (num_channels_ == 1) quality |= 1; if (low_fidelity_) quality |= 2; return quality; } void GetPersistentData(PersistentBlock* block, size_t *num_blocks); bool LoadPersistentData(const uint32_t* data); void PreparePersistentData(); private: inline int32_t resolution() const { return low_fidelity_ ? 8 : 16; } inline float sample_rate() const { return 32000.0f / \ (low_fidelity_ ? kDownsamplingFactor : 1); } void ResetFilters(); void ProcessGranular(FloatFrame* input, FloatFrame* output, size_t size); PlaybackMode playback_mode_; PlaybackMode previous_playback_mode_; int32_t num_channels_; bool low_fidelity_; bool silence_; bool bypass_; bool reset_buffers_; float freeze_lp_; float dry_wet_; void* buffer_[2]; size_t buffer_size_[2]; Correlator correlator_; GranularSamplePlayer player_; WSOLASamplePlayer ws_player_; LoopingSamplePlayer looper_; PhaseVocoder phase_vocoder_; Diffuser diffuser_; Reverb reverb_; PitchShifter pitch_shifter_; stmlib::Svf fb_filter_[2]; stmlib::Svf hp_filter_[2]; stmlib::Svf lp_filter_[2]; AudioBuffer<RESOLUTION_8_BIT_MU_LAW> buffer_8_[2]; AudioBuffer<RESOLUTION_16_BIT> buffer_16_[2]; FloatFrame in_[kMaxBlockSize]; FloatFrame in_downsampled_[kMaxBlockSize / kDownsamplingFactor]; FloatFrame out_downsampled_[kMaxBlockSize / kDownsamplingFactor]; FloatFrame out_[kMaxBlockSize]; FloatFrame fb_[kMaxBlockSize]; int16_t tail_buffer_[2][256]; Parameters parameters_; SampleRateConverter<-kDownsamplingFactor, 45, src_filter_1x_2_45> src_down_; SampleRateConverter<+kDownsamplingFactor, 45, src_filter_1x_2_45> src_up_; PersistentState persistent_state_; DISALLOW_COPY_AND_ASSIGN(GranularProcessor); }; } // namespace clouds #endif // CLOUDS_DSP_GRANULAR_PROCESSOR_H_