|
|
dev:units.txt [2018/02/07 16:07] |
dev:units.txt [2022/05/06 16:07] (current) |
| ====== Basic Units ====== |
| |
| ===== Performance pitch ===== |
| |
| Events store pitch values in simple integers. These are |
| fixed-frequency pitches in the MIDI pitch scale, independent of clef |
| and key. Adding 12 to a pitch increments it by one octave; pitch 60 |
| is the treble-clef middle C. (Previous rewrites have considered using |
| double the MIDI pitch so as to allow quarter-tones; this time let's go |
| for the simpler option as if we ever want quarter-tones we can always |
| code them using special Event properties.) |
| |
| |
| ===== Display pitch ===== |
| |
| For notation purposes we need a display pitch, which is a composite of |
| height on the staff plus accidental. The correspondence between |
| display pitch and raw pitch depends on the clef and key. For height |
| on the staff, we use the RG2.1 convention of 0 = bottom line, 1 = gap |
| between bottom two lines and so on up to 8 = top line. Negative |
| heights are below the staff (i.e. on leger lines), heights over 8 are |
| above. Display pitch is therefore independent of clef, so height 0 is |
| always the bottom line in any clef. |
| |
| If we ever see pitch as a plain integer, we assume it's a raw internal |
| pitch rather than a display pitch. A plain integer used for display |
| pitch would probably be referred to as a "height" rather than a pitch, |
| as it would be lacking the extra information (accidental, clef, key) |
| required to interpret it as a true pitch. |
| |
| ===== Duration ===== |
| |
| This part of the original documentation is completely obsolete. |
| |
| All I've ever needed to know is that a quarter note is 960 units, and everything else multiplies or divides from there. |
| |
| Tempo |
| |
| |
| Tempo specifications are usually informally described in beats per |
| minute (bpm). However, as far as sequencers are concerned tempo is |
| generally measured in crotchets (quarter-notes) per minute, regardless |
| of the actual value of a beat in the current time-signature. And the |
| MIDI file format inverts this, recording tempo in pulses per |
| quarter-note (ppq). |
| |
| For Rosegarden we choose to encode tempo in crotchets per minute, |
| but because we may want to have non-integral values and the Event |
| mechanism doesn't support floating-point properties, we actually store |
| crotchets per hour and convert to and from floating-point per-minute |
| values in the API. We will also continue to use the name "bpm" even |
| though our "beat" is not always strictly a beat (it is always a |
| crotchet). |
| |
| |
| ===== Velocity ===== |
| |
| The range used by MIDI to represent velocity (initial relative volume |
| of a note) is 0-127, with maximum at 127 and silence at 0. We use the |
| same range to store velocity values. |
| |
| (But note that some components such as the VU meters refer to levels |
| in a floating-point 0.0 -> 1.0 range.) |
| |
| |
| ===== Bar numbers ===== |
| |
| Bar numbers are counted from 1 on the GUI (i.e. the first non-count-in |
| bar is by default bar 1), but are counted from 0 internally (because |
| we're sad geeks). That means we have to add 1 every time we display a |
| bar number, and subtract 1 from any the user supplies. |
| |
| Absolute times and bar numbers can both legitimately be negative, so |
| we need to use signed types, to avoid treating values like -1 as |
| special no-value cases, and to avoid making assumptions such as that |
| we can enumerate all bars by counting from zero. |
| |
| The "bar" referred to here is currently an internal unit as well as an outward representation of barlines on a staff in a notation view, but this system is not adequate to address the needs of music notation. Eventually we need some other way to represent barlines on a staff that's independent of our internal "bar" unit. |
| |