MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ reconstruct_grains

const ComputationGrammar::Rule::Executor MayaFlux::Yantra::Granular::reconstruct_grains

Grammar rule executor for the reconstruction step.

Definition at line 113 of file GranularWorkflow.cpp.

114 {
115 auto datum = safe_any_cast_or_throw<Datum<Kakshya::RegionGroup>>(input);
116 const auto& regions = datum.data.regions;
117
118 if (regions.empty()) {
119 error<std::runtime_error>(Journal::Component::Yantra, Journal::Context::ComputeMatrix,
120 std::source_location::current(), "reconstruct_grains: RegionGroup contains no grains");
121 }
122
123 if (!datum.container || !*datum.container) {
124 error<std::runtime_error>(Journal::Component::Yantra, Journal::Context::ComputeMatrix,
125 std::source_location::current(), "reconstruct_grains: no source container in datum");
126 }
127
128 auto source = *datum.container;
129 const auto num_ch = static_cast<uint32_t>(source->get_structure().get_channel_count());
130 const auto org = source->get_structure().organization;
131 const uint32_t sample_rate = [&]() -> uint32_t {
132 if (auto sc = std::dynamic_pointer_cast<Kakshya::SoundStreamContainer>(source))
133 return sc->get_sample_rate();
134 return 48000U;
135 }();
136
137 const auto grain_sz = safe_any_cast_or_default<uint32_t>(
138 datum.data.get_attribute<uint32_t>("grain_size").has_value()
139 ? std::any(datum.data.get_attribute<uint32_t>("grain_size").value())
140 : std::any {},
141 1024U);
142
143 std::vector<std::vector<double>> channel_data(num_ch);
144 for (uint32_t ch = 0; ch < num_ch; ++ch)
145 channel_data[ch].reserve(regions.size() * grain_sz);
146
147 Kakshya::iterate_region_channels(regions, source, num_ch, {},
148 [&channel_data](size_t /*gi*/, uint32_t ch, std::span<double> samples) {
149 channel_data[ch].insert(channel_data[ch].end(), samples.begin(), samples.end());
150 });
151
152 return Datum<std::shared_ptr<Kakshya::SignalSourceContainer>> {
153 std::dynamic_pointer_cast<Kakshya::SignalSourceContainer>(
154 Kakshya::make_sound_file_container(std::move(channel_data), num_ch, sample_rate, org)),
155 {}
156 };
157};

Referenced by make_granular_matrix().