Remove Duration runtime constructor errors
At present let badDur: Duration = 1/>31 causes an error, because 31 is not a power of 2.
Proposed eradication of these errors: A constructor of the following form.
init(_ numerator: Beats, _ power: Power) {
self.beats = numerator
self.denominator = pow(2, power)
}
where Power may be implemented as Int as Subdivision is now.
This has the added bonus that technically a breve/double-whole-note is now possible with power = -1...
I really like this. I used the other way as it is more immediately intuitive (I personally don't think of rhythmic subdivision values by their power of two). Perhaps for now, we could keep both.
Wanna open a PR which adds:
extension Duration {
init(_ numerator: Beats, power: Power) { ... }
}
Note:
powerargument label extant.
~~You will have to add a Power struct which is a wrapper for Int, with a failable (or crashing) initializer. Maybe look into using the NewType protocol in Structure/DataStructures.~~
~~If only Swift had dependent types!~~
Nevermind, misunderstood. This would be an excellent idea! And no new types needed.
Re: dependent types: very interesting project: https://github.com/silt-lang/silt
It might actually make things easier down the line if the power was the actual stored value. See ProportionTree, etc. where a bunch of decoding of powers has to take place. Perhaps that could be simplified with this approach.
Interesting. Yes trying to make sense of it at the moment!
ProportionTree that is