нормальные декораторы тебе позволят избежать этих проблем.
т е допустим интерфейс семпла выглядит как:
size_t length(); - количество элементов в семпле
std::pait<int32_t, int32_t> lr_values_by_index(size_t index); - правое и левое значение, которое нужно передать плееру
соотв. исходный семпл у тебя будет хранить только какой-нибудь std::vector из значений. каждый декоратор на вызов lr_values_by_index будет так-же получать значение из семпла, менять его согласно функционалу и возвращать дальше