Comping
This commit is contained in:
@@ -109,9 +109,21 @@ auto vamp_zero::parse_notation_document(std::string_view json, std::string sourc
|
||||
return invalid("invalid performance duration or count-in");
|
||||
}
|
||||
document.duration = *duration;
|
||||
auto sustain = performance.if_contains("sustain_start") ? vamp_zero::parse_beat(performance.at("sustain_start")) : duration;
|
||||
if (!sustain || std::find(times.begin(), times.end(), rational(*sustain)) == times.end()) {
|
||||
return invalid("invalid held-ending boundary");
|
||||
}
|
||||
document.sustain_start = *sustain;
|
||||
for (auto i = std::size_t{}; i < measures->size(); ++i) {
|
||||
auto marker = (*measures)[i].as_object().if_contains("ending_sustain");
|
||||
auto ending = marker && marker->is_bool() && marker->as_bool();
|
||||
if (ending != (times[i] >= rational(*sustain))) {
|
||||
return invalid("held-ending measures disagree with performance timing");
|
||||
}
|
||||
}
|
||||
auto const &clicks = performance.at("clicks").as_array();
|
||||
auto click = std::size_t{};
|
||||
for (auto measure = std::size_t{}; measure + 1 < times.size(); ++measure) {
|
||||
for (auto measure = std::size_t{}; measure + 1 < times.size() && times[measure] < rational(*sustain); ++measure) {
|
||||
for (auto beat = times[measure]; beat < times[measure + 1]; ++beat) {
|
||||
if (click >= clicks.size()) {
|
||||
return invalid("missing metronome beat");
|
||||
|
||||
Reference in New Issue
Block a user