11namespace tracktion {
inline namespace graph
18 return juce::AudioBuffer<float> (view.data.channels, (
int) view.getNumChannels(), (
int) view.data.offset, (
int) view.getNumFrames());
22template<
typename SampleType>
33 return { .start =
static_cast<choc::buffer::FrameCount
> (start),
34 .end =
static_cast<choc::buffer::FrameCount
> (end) };
42 return { e.message.data(), (
int) e.message.length(), e.timeStamp };
47template<
typename BufferViewType,
typename SampleType,
typename SmoothingType>
50 if (! value.isSmoothing())
52 choc::buffer::applyGain (view, value.getTargetValue());
56 const auto numChannels = view.getNumChannels();
57 const auto numFrames = view.getNumFrames();
59 for (choc::buffer::FrameCount i = 0; i < numFrames; ++i)
61 const auto scaler = value.getNextValue();
63 for (choc::buffer::ChannelCount ch = 0; ch < numChannels; ++ch)
64 view.getSample (ch, i) *= scaler;
70template<
typename BufferType,
typename GainType>
72 GainType startGain, GainType endGain)
noexcept
76 choc::buffer::applyGain (buffer, startGain);
80 auto size = buffer.getSize();
81 const auto increment = (endGain - startGain) / (
float) size.getNumFrames();
82 choc::buffer::applyGainPerFrame (buffer,
83 [startGain, increment] (
auto frameNum) {
return startGain * (increment * frameNum); });
90 return { start, start + length };
96 return { start, start + length };
101template<
typename Buffer>
102void sanitise (Buffer& buffer)
104 choc::buffer::setAllSamples (buffer,
107 return std::isnan (s) ?
typename Buffer::Sample() : s;
112template <
typename SampleType,
template<
typename>
typename LayoutType>
115 if (view.getNumFrames() == 0)
118 for (choc::buffer::ChannelCount channel = 0; channel < view.getNumChannels(); ++channel)
119 jassert (view.getIterator (channel).sample !=
nullptr);
123template <
typename DestBuffer,
typename SourceBuffer,
typename GainType>
124static void add (DestBuffer&& dest,
const SourceBuffer& source, GainType gain)
126 auto size = source.getSize();
127 CHOC_ASSERT (size == dest.getSize());
129 for (
decltype (size.numChannels) chan = 0; chan < size.numChannels; ++chan)
131 auto src = source.getIterator (chan);
132 auto dst = dest.getIterator (chan);
134 for (
decltype (size.numFrames) i = 0; i < size.numFrames; ++i)
136 *dst +=
static_cast<decltype (dst.get())
> (src.get() * gain);
144template <
typename DestBuffer,
typename SourceBuffer,
typename GainType>
145static void addApplyingGainRamp (DestBuffer&& dest,
const SourceBuffer& source, GainType startGain, GainType endGain)
147 auto size = source.getSize();
148 CHOC_ASSERT (size == dest.getSize());
150 const auto delta = (endGain - startGain) /
size.numFrames;
152 for (
decltype (
size.numChannels) chan = 0; chan <
size.numChannels; ++chan)
154 auto src = source.getIterator (chan);
155 auto dst = dest.getIterator (chan);
156 auto gain = startGain;
158 for (
decltype (
size.numFrames) i = 0; i <
size.numFrames; ++i)
160 *dst +=
static_cast<decltype (dst.get())
> (src.get() * gain);
172template <
typename DestBuffer,
typename SourceBuffer>
173static void copyIfNotAliased (DestBuffer&& dest,
const SourceBuffer& source)
175 auto size = source.getSize();
176 CHOC_ASSERT (size == dest.getSize());
178 for (
decltype (
size.numChannels) chan = 0; chan <
size.numChannels; ++chan)
180 auto src = source.getIterator (chan);
181 auto dst = dest.getIterator (chan);
183 if (src.sample == dst.sample)
186 for (
decltype (
size.numFrames) i = 0; i <
size.numFrames; ++i)
188 *dst =
static_cast<decltype (dst.get())
> (src.get());
206 for (
auto meh : sequence)
208 auto&
me =
meh->message;
int getNumChannels() const noexcept
int getNumSamples() const noexcept
Type *const * getArrayOfWritePointers() noexcept
constexpr bool approximatelyEqual(Type a, Type b, Tolerance< Type > tolerance=Tolerance< Type >{} .withAbsolute(std::numeric_limits< Type >::min()) .withRelative(std::numeric_limits< Type >::epsilon()))
choc::buffer::BufferView< SampleType, choc::buffer::SeparateChannelLayout > toBufferView(juce::AudioBuffer< SampleType > &buffer)
Converts a juce::AudioBuffer<SampleType> to a choc::buffer::BufferView.
juce::AudioBuffer< float > toAudioBuffer(choc::buffer::ChannelArrayView< float > view)
Creates a juce::AudioBuffer from a choc::buffer::BufferView.
choc::buffer::FrameRange createFrameRange(std::integral auto start, std::integral auto end)
Creates a FrameRange from any integral type.
choc::buffer::ChannelRange channelRangeWithStartAndLength(choc::buffer::ChannelCount start, choc::buffer::ChannelCount length)
Returns a ChannelRange with a start and length.
void sanityCheckView(const choc::buffer::BufferView< SampleType, LayoutType > &view)
Checks that the channels have valid pointers if they have a non-zero number of frames.
void multiplyBy(BufferViewType &view, juce::SmoothedValue< SampleType, SmoothingType > &value) noexcept
Mutiplies a choc::buffer::BufferView by a juce::SmoothedValue.
juce::MidiMessage toMidiMessage(const choc::midi::Sequence::Event &e)
Converts a choc::midi event to a juce::MidiMessage.
void hash_combine(size_t &seed, const T &v)
Hashes a type with a given seed, modifying the seed.
std::size_t hash_range(It first, It last)
Hashes a range with a default seed and returns the new hash value.
void applyGainRamp(BufferType &&buffer, GainType startGain, GainType endGain) noexcept
Applies a gain ram to a choc::buffer::BufferView.
choc::buffer::FrameRange frameRangeWithStartAndLength(choc::buffer::FrameCount start, choc::buffer::FrameCount length)
Returns a FrameRange with a start and length.