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 5 years 8 months
envelope.h// Copyright 2012 Olivier Gillet. // // Author: Olivier Gillet (ol.gillet@gmail.com) // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. #ifndef BRAIDS_ENVELOPE_H_ #define BRAIDS_ENVELOPE_H_ #include "stmlib/stmlib.h" #include "stmlib/utils/dsp.h" #include "braids/resources.h" namespace braids { using namespace stmlib; enum EnvelopeSegment { ENV_SEGMENT_ATTACK = 0, ENV_SEGMENT_DECAY = 1, ENV_SEGMENT_DEAD = 2, ENV_NUM_SEGMENTS, }; class Envelope { public: Envelope() { } ~Envelope() { } void Init() { target_[ENV_SEGMENT_ATTACK] = 65535; target_[ENV_SEGMENT_DECAY] = 0; target_[ENV_SEGMENT_DEAD] = 0; increment_[ENV_SEGMENT_DEAD] = 0; } inline EnvelopeSegment segment() const { return static_cast<EnvelopeSegment>(segment_); } inline void Update(int32_t a, int32_t d) { increment_[ENV_SEGMENT_ATTACK] = lut_env_portamento_increments[a]; increment_[ENV_SEGMENT_DECAY] = lut_env_portamento_increments[d]; } inline void Trigger(EnvelopeSegment segment) { if (segment == ENV_SEGMENT_DEAD) { value_ = 0; } a_ = value_; b_ = target_[segment]; segment_ = segment; phase_ = 0; } inline uint16_t Render() { uint32_t increment = increment_[segment_]; phase_ += increment; if (phase_ < increment) { value_ = Mix(a_, b_, 65535); Trigger(static_cast<EnvelopeSegment>(segment_ + 1)); } if (increment_[segment_]) { value_ = Mix(a_, b_, Interpolate824(lut_env_expo, phase_)); } return value_; } inline uint16_t value() const { return value_; } private: // Phase increments for each segment. uint32_t increment_[ENV_NUM_SEGMENTS]; // Value that needs to be reached at the end of each segment. uint16_t target_[ENV_NUM_SEGMENTS]; // Current segment. size_t segment_; // Start and end value of the current segment. uint16_t a_; uint16_t b_; uint16_t value_; uint32_t phase_; DISALLOW_COPY_AND_ASSIGN(Envelope); }; } // namespace braids #endif // BRAIDS_ENVELOPE_H_