This commit is contained in:
khodowany
2026-10-06 21:28:42 -05:00
parent e15dc31568
commit c7f6a30a13
30 changed files with 2957 additions and 490 deletions
+13 -1
View File
@@ -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");