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

◆ extract_implementation()

Datum< Kakshya::RegionGroup > MayaFlux::Yantra::Granular::SegmentOp::extract_implementation ( const Datum< Kakshya::RegionGroup > &  input)
overrideprotected

Definition at line 341 of file GranularWorkflow.cpp.

343{
344 std::shared_ptr<Kakshya::SignalSourceContainer> container;
345
346 if (input.container && *input.container) {
347 container = *input.container;
348 } else {
349 auto param = this->get_parameter("container");
350 if (param.has_value()) {
351 container = safe_any_cast_or_default<std::shared_ptr<Kakshya::SignalSourceContainer>>(
352 param, nullptr);
353 }
354 }
355
356 if (!container) {
357 error<std::runtime_error>(
359 std::source_location::current(),
360 "SegmentOp: no container available via Datum or parameters");
361 }
362
363 const auto grain_size = this->template get_parameter_or_default<uint32_t>("grain_size", 1024U);
364 const auto hop_size = this->template get_parameter_or_default<uint32_t>("hop_size", 512U);
365 const auto channel = this->template get_parameter_or_default<uint32_t>("channel", 0U);
366
367 const auto& structure = container->get_structure();
368
369 if (channel >= structure.get_channel_count()) {
370 error<std::runtime_error>(
372 std::source_location::current(),
373 "SegmentOp: channel {} out of range (container has {})",
374 channel, structure.get_channel_count());
375 }
376
377 const auto num_channels = structure.get_channel_count();
378 const auto total = container->get_num_frames();
379
380 Datum<Kakshya::RegionGroup> out { input.data, container };
381 out.data.regions.clear();
382 out.data.current_region_index = 0;
383 out.data.active_indices.clear();
384
385 for (uint64_t onset = 0; onset + grain_size <= total; onset += hop_size) {
386 Kakshya::Region grain {
387 std::vector<uint64_t> { onset, 0 },
388 std::vector<uint64_t> { onset + grain_size - 1, num_channels - 1 }
389 };
390 grain.set_attribute("onset", static_cast<double>(onset));
391 out.data.regions.push_back(std::move(grain));
392 }
393
394 out.data.set_attribute<uint32_t>("grain_size", grain_size);
395 out.data.set_attribute<uint32_t>("hop_size", hop_size);
396 out.data.set_attribute<uint32_t>("channel", channel);
397
398 return out;
399}
uint32_t channel
std::any get_parameter(const std::string &name) const override
@ ComputeMatrix
Compute operations (Yantra - algorithms, matrices, DSP)
@ Yantra
DSP algorithms, computational units, matrix operations, Grammar.

References channel, MayaFlux::Journal::ComputeMatrix, MayaFlux::Yantra::Datum< T >::container, MayaFlux::Yantra::Datum< T >::data, MayaFlux::Yantra::UniversalExtractor< InputType, OutputType >::get_parameter(), MayaFlux::Kakshya::Region::set_attribute(), and MayaFlux::Journal::Yantra.

+ Here is the call graph for this function: