]> git.cworth.org Git - scherzo/blobdiff - pitch.h
Encode octave within pitch_t value
[scherzo] / pitch.h
diff --git a/pitch.h b/pitch.h
index 525f14c8ae5038426bfe97c0c879ee8c67a3d637..657e8fe07f8f291f1a4846c4cf0e596f1f2cdf7d 100644 (file)
--- a/pitch.h
+++ b/pitch.h
 #ifndef PITCH_H
 #define PITCH_H
 
-#define PITCH_ACCIDENTAL_MASK 0x07
-#define PITCH_ACCIDENTAL_SHIFT 0
+typedef uint32_t pitch_t;
+
+#define PITCH_ACCIDENTAL_SHIFT (0)
+#define PITCH_ACCIDENTAL_MASK  (0x07 << PITCH_ACCIDENTAL_SHIFT)
+
+#define PITCH_NAME_SHIFT       (3)
+#define PITCH_NAME_MASK                (0x07 << PITCH_NAME_SHIFT)
+
+#define PITCH_OCTAVE_SHIFT     (6)
+#define PITCH_OCTAVE_MASK      (0x07 << PITCH_OCTAVE_SHIFT)
+
+#define PITCH_ACCIDENTAL(pitch)        \
+    (((pitch) & PITCH_ACCIDENTAL_MASK) >> PITCH_ACCIDENTAL_SHIFT)
+#define PITCH_NAME(pitch)      \
+    (((pitch) & PITCH_NAME_MASK) >> PITCH_NAME_SHIFT)
+#define PITCH_OCTAVE(pitch)    \
+    (((pitch) & PITCH_OCTAVE_MASK) >> PITCH_OCTAVE_SHIFT)
+
+#define PITCH(name, accidental, octave)                  \
+    (((octave) << PITCH_OCTAVE_SHIFT)          | \
+     ((name) << PITCH_NAME_SHIFT)              | \
+     ((accidental) << PITCH_ACCIDENTAL_SHIFT))
+
+#define PITCH_LITERAL(literal_name, literal_accidental, octave)        \
+    PITCH(PITCH_NAME_##literal_name,                           \
+         PITCH_ACCIDENTAL_##literal_accidental,                \
+         octave)
+
+#define PITCH_NATURAL(literal_name, octave) \
+    PITCH_LITERAL(literal_name, NATURAL, octave)
 
 typedef enum pitch_accidental
 {
@@ -35,11 +63,6 @@ typedef enum pitch_accidental
     PITCH_ACCIDENTAL_DOUBLE_SHARP
 } pitch_accidental_t;
 
-#define PITCH_ACCIDENTAL(pitch) (((pitch) & PITCH_ACCIDENTAL_MASK) >> PITCH_ACCIDENTAL_SHIFT)
-
-#define PITCH_NAME_MASK 0x38
-#define PITCH_NAME_SHIFT 3
-
 typedef enum pitch_name
 {
     PITCH_NAME_C,
@@ -51,13 +74,8 @@ typedef enum pitch_name
     PITCH_NAME_B,
 } pitch_name_t;
 
-#define PITCH_NAME(pitch) (((pitch) & PITCH_NAME_MASK) >> PITCH_NAME_SHIFT)
-
-#define PITCH(name, accidental) (((name) << PITCH_NAME_SHIFT) | (accidental))
-
-#define PITCH_LITERAL(literal_name, literal_accidental) PITCH(PITCH_NAME_##literal_name, PITCH_ACCIDENTAL_##literal_accidental)
-#define PITCH_NATURAL(literal_name) PITCH_LITERAL(literal_name, NATURAL)
-
-typedef uint32_t pitch_t;
+/* Octave numbers are ISO octave numbers [0:8], (so Octave 4 is from
+ * middle C to the B above middle C).
+ */
 
 #endif /* PITCH_H */