Symbolic notes, scales and chords in Wolfram Language
In this tutorial we start with the low-level Sound and SoundNote expressions used to describe playable audio, then move to the higher-level Music* framework introduced in WL 15 (Wolfram Engine 15). Stay in tune!
Let's start with a major scale chord followed by a few notes from the same scale:
Sound[{
SoundNote[{"C4", "E4", "G4"}, {0, 1/2}],
SoundNote["A4", {1/2, 1}],
SoundNote["F4", {1, 3/2}],
SoundNote["G4", {3/2, 2}]
}] (*VB[*)(Sound[{SoundNote[{"C4", "E4", "G4"}, {0, 1/2}], SoundNote["A4", {1/2, 1}], SoundNote["F4", {1, 3/2}], SoundNote["G4", {3/2, 2}]}])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeK5AIzi/NS0ljgUn6ZBaXpDGBeJwwSb/8ktQ0ZmQFwSAFziZgyhVCuZtAdMGUZAJpBogQB5AISizJzM9LzMkE2ZvJBJdDsQRskCOaQfjMALNwGeSG7iJG7C5iJuQidK/hMwNMAACvpUHK"*)(*]VB*) Listen to the result
Click the output to play it. A SoundNote with one pitch describes a single event; a list of pitches in one SoundNote starts them simultaneously, which is how a chord is represented. Explicit start and end times make the sequence easy to read and edit.
SoundNote[{"C3", "E3", "G3"}] // Sound (*VB[*)(Sound[SoundNote[{"C3", "E3", "G3"}]])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeK5AIzi/Ng3I5YVy//JLUNGaYep/M4pJgJiDD2RhMuUIod2MA5nUP9w=="*)(*]VB*) Generate waveform
Use Play to create any sound texture using numerical functions:
Play[Sin[20000 x x], {x,0,1000, 0.1}]Emit sound
Call EmitSound on any Sound object:
s = Play[Sin[20000 x x], {x,0,1000, 0.1}];
Button["Sound", EmitSound[s]]or using SoundNote:
s = SoundNote[{"C3", "E3", "G3"}] // Sound;
Button["Sound", EmitSound[s]]Durations
The second argument controls duration when it is a number. Exact values such as 1/4 and 1/2 are convenient for expressing relative rhythm and keeping the timing easy to edit
{
SoundNote[{"C3", "E3", "G3"}, 1/4],
SoundNote[{"A2", "C3", "E3"}, 1/4],
SoundNote[{"F2", "A2", "C3"}, 1/4],
SoundNote[{"G2", "B2", "D3"}, 1/2]
} // Sound (*VB[*)(Sound[{SoundNote[{"C3", "E3", "G3"}, 1/4], SoundNote[{"A2", "C3", "E3"}, 1/4], SoundNote[{"F2", "A2", "C3"}, 1/4], SoundNote[{"G2", "B2", "D3"}, 1/2]}])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeK5AIzi/NS0ljgUn6ZBaXpDGBeJwwSb/8ktQ0ZmQFwSAFzsZgyhVCuRtDdHEAiaDEksz8vMScTJAlmSBNxJnoaIRqMOUmuhmhGky5ie4Qo5wglAtOE0HCAK6BQmM="*)(*]VB*) Absolute timing
For precise placement, give SoundNote a start/end pair {t0, t1}. This is useful for layering sustained notes, synchronizing parts, or leaving intentional gaps. Again, C major scale:
Sound[{
SoundNote["C2", {0, 2}],
SoundNote[{"C3", "E3", "G3"}, {0, 1}],
SoundNote[{"F3", "A3", "C4"}, {1, 2}],
SoundNote[{"G3", "B3", "D4"}, {2, 3}]
}] (*VB[*)(Sound[{SoundNote["C2", {0, 2}], SoundNote[{"C3", "E3", "G3"}, {0, 1}], SoundNote[{"F3", "A3", "C4"}, {1, 2}], SoundNote[{"G3", "B3", "D4"}, {2, 3}]}])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeK5AIzi/NS0ljgUn6ZBaXpDGBeJwwSb/8ktRgkJCzEUQGpi4TSDNkgoSw6EhjRlYK0W8MplwhlLsxNtMYiTbNDWKMI4RyNkEzjZE0t7lDjHGCUC7opoF4mSBdAMPuN8g="*)(*]VB*) Instruments
The third argument selects the instrument used for playback. The next example assigns a different timbre to each note
Sound[{
SoundNote["C5", {0., .4}, "Piano"],
SoundNote["D5", {.5, .9}, "Guitar"],
SoundNote["E5", {1., 1.4}, "Violin"],
SoundNote["F5", {1.5, 1.9}, "Flute"],
SoundNote["G5", {2., 2.4}, "Trumpet"],
SoundNote["A5", {2.5, 2.9}, "Organ"],
SoundNote["B5", {3., 3.4}, "Marimba"],
SoundNote["C6", {3.5, 3.9}, "Vibraphone"],
SoundNote["C2", {4., 4.4}, "Drums"],
SoundNote["C5", {4.5, 4.9}, "AMSynth"], (*WLJS only*)
SoundNote["D5", {5., 5.4}, "FMSynth"], (*WLJS only*)
SoundNote["E5", {5.5, 5.9}, "DuoSynth"], (*WLJS only*)
SoundNote["F4", {6., 6.4}, "MembraneSynth"], (*WLJS only*)
SoundNote["G5", {6.5, 6.9}, "MetalSynth"] (*WLJS only*)
}] (*VB[*)(FrontEndRef["874f0eef-496c-4c85-b07a-36a970e76671"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKW5ibpBmkpqbpmliaJeuaJFuY6iYZmCfqGpslWpobpJqbmZkbAgCFlBVa"*)(*]VB*) A first procedural beat
The following 16-step groove is built from four independent layers: closed hi-hat, kick, snare, and an 808-style bass line. At 140 BPM, step = 60/140/2 is one eighth-note step. Each layer is a list of time-stamped SoundNote objects; Join combines the layers into one Sound
With[{step = 60/140/2},
Sound @ Join[
(*BB[*)(* closed hats *)(*,*)(*"1:eJxTTMoPSmNhYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCS4g4Zyfm5uaV+KUXxEMUqxsbm6exgSSBPGCSnNSg9mAjOCSosy8dLBYSFFpKpoKkDkeqYkpEFXBILO1sCgJSczMQVYCAOFrJEU="*)(*]BB*)
Table[
SoundNote["C6", {t, t + .035}, "MetalSynth"],
{t, 0, 15 step, step}
],
(*BB[*)(* kick *)(*,*)(*"1:eJxTTMoPSmNhYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCS4g4Zyfm5uaV+KUXxEMUqxsbm6exgSSBPGCSnNSg9mAjOCSosy8dLBYSFFpKpoKkDkeqYkpEFXBILO1sCgJSczMQVYCAOFrJEU="*)(*]BB*)
{
SoundNote["C1", {0, .18}, "Drums"],
SoundNote["C1", {3 step, 3 step + .18}, "Drums"],
SoundNote["C1", {6 step, 6 step + .18}, "Drums"],
SoundNote["C1", {11 step, 11 step + .18}, "Drums"],
SoundNote["C1", {14 step, 14 step + .18}, "Drums"]
},
(*BB[*)(* snare / clap on beat 3 *)(*,*)(*"1:eJxTTMoPSmNhYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCS4g4Zyfm5uaV+KUXxEMUqxsbm6exgSSBPGCSnNSg9mAjOCSosy8dLBYSFFpKpoKkDkeqYkpEFXBILO1sCgJSczMQVYCAOFrJEU="*)(*]BB*)
{
SoundNote["C2", {4 step, 4 step + .12}, "Drums"],
SoundNote["C2", {12 step, 12 step + .12}, "Drums"]
},
(*BB[*)(* sliding-feeling 808 bass line *)(*,*)(*"1:eJxTTMoPSmNhYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCS4g4Zyfm5uaV+KUXxEMUqxsbm6exgSSBPGCSnNSg9mAjOCSosy8dLBYSFFpKpoKkDkeqYkpEFXBILO1sCgJSczMQVYCAOFrJEU="*)(*]BB*)
{
SoundNote["C2", {0, 3 step}, "FMSynth"],
SoundNote["G1", {3 step, 4 step}, "FMSynth"],
SoundNote["Bb1", {6 step, 8 step}, "FMSynth"],
SoundNote["C2", {8 step, 11 step}, "FMSynth"],
SoundNote["Eb2", {12 step, 16 step}, "FMSynth"]
}
]
] (*VB[*)(FrontEndRef["c6e66bd4-10e6-4b9c-ad38-8bd62d23182f"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKJ5ulmpklpZjoGhqkmumaJFkm6yamGFvoWiSlmBmlGBkbWhilAQCL6hXV"*)(*]VB*) The Music* framework
WL 15 adds a higher-level symbolic layer for chords, notes, scores, voices, rests, and scales. Explore the available symbols with Names["Music*"]. These expressions are immutable and compositional: construct a musical object, inspect it, transform it, and combine it into a larger structure. We begin with a single named chord:
MusicChord["CMajor7"] MusicChord[(*VB[*) <|"Name" -> "Major Seventh", "Root" -> MusicPitch[<|"Key" -> "C", "Accidental" -> 0|>]|> (*,*)(*"1:eJztVMtum0AUddv0lU2lbip11UplaYmMwbG7Y2ycNIrzYMAPVp3ANSEGxhmGGP9kv6Dqt/ROSFpv2oWXVSV0Zu45R6PDYcTHK+EtnrVarfI9AhX1SMj8qyMlLxKIWZXnXG6QXjzRnjcIIykK5RbxJJWq4lkjvN0S3BqiSvGrDNgnpM1DK+5ZC97umATaFu/Z7V6XQ3thRf1D3u0Ss9NvEuwhnKalao78NT3V07utdA+pvijIJyms2QvUzngOnz803n0EN06VkFr+fdqxyOJmeo0QeKdDiEQM7DtOBukZxKHUsCmuBunfE2TMb4Q0iMngDgp1jcyjhJ7BlhM35MDoOHBS+/5YXLD8LJ0fOcJOIuYEMzsMl6tbVhiEUjYNcZkVIz5fJwPfStxJzfLw4hYd0cz25ssM9WBzuQyS6jp1vBO68vPVelonk2AaAmRJGQ5SM7t0xjfzae0YnaF+dLatPPaQPrxK04puwKvwo7zSG+DxeZFt7llfVrBL554QatfOv/2588H/lh9bfqlvtlBQ7lrzj7/UbOG9djUcaaDWv1t7+Vz/nnhWwk9MHkqg"*)(*]VB*)] Inspecting a chord
Click the output to hear and inspect the chord. A chord can be queried for its constituent data; for example, extracting "Bass" returns a MusicPitch object.
MusicChord[(*VB[*) <|"Name" -> "Major Seventh", "Root" -> MusicPitch[<|"Key" -> "C", "Accidental" -> 0|>]|> (*,*)(*"1:eJztVMtum0AUddv0lU2lbip11UplaYmMwbG7Y2ycNIrzYMAPVp3ANSEGxhmGGP9kv6Dqt/ROSFpv2oWXVSV0Zu45R6PDYcTHK+EtnrVarfI9AhX1SMj8qyMlLxKIWZXnXG6QXjzRnjcIIykK5RbxJJWq4lkjvN0S3BqiSvGrDNgnpM1DK+5ZC97umATaFu/Z7V6XQ3thRf1D3u0Ss9NvEuwhnKalao78NT3V07utdA+pvijIJyms2QvUzngOnz803n0EN06VkFr+fdqxyOJmeo0QeKdDiEQM7DtOBukZxKHUsCmuBunfE2TMb4Q0iMngDgp1jcyjhJ7BlhM35MDoOHBS+/5YXLD8LJ0fOcJOIuYEMzsMl6tbVhiEUjYNcZkVIz5fJwPfStxJzfLw4hYd0cz25ssM9WBzuQyS6jp1vBO68vPVelonk2AaAmRJGQ5SM7t0xjfzae0YnaF+dLatPPaQPrxK04puwKvwo7zSG+DxeZFt7llfVrBL554QatfOv/2588H/lh9bfqlvtlBQ7lrzj7/UbOG9djUcaaDWv1t7+Vz/nnhWwk9MHkqg"*)(*]VB*)]["Bass"] MusicPitch[(*VB[*) <|"Accidental" -> 0, "Key" -> "C"|> (*,*)(*"1:eJxTTMoPSmNmYGAolgISTvkVbvlFuQmORUWJeempKcGlubmJRZVA4TRGkBp+IOFWlJ9X4pqXEpZZVFKamAOREEKScK1ITS4tSUzKSQ1WAQonJ1kYGiWlJOumWhgn6ZqYmFvoWpiaJ+smm5iZWFiapqVZJBulMYAMYQESPpnFJcWsINMSc4pTAbwfKnE="*)(*]VB*)] Using a pitch and a duration object, you can construct a symbolic note
MusicNote[MusicPitch[(*VB[*) <|"Accidental" -> 0, "Key" -> "C"|> (*,*)(*"1:eJxTTMoPSmNmYGAolgISTvkVbvlFuQmORUWJeempKcGlubmJRZVA4TRGkBp+IOFWlJ9X4pqXEpZZVFKamAOREEKScK1ITS4tSUzKSQ1WAQonJ1kYGiWlJOumWhgn6ZqYmFvoWpiaJ+smm5iZWFiapqVZJBulMYAMYQESPpnFJcWsINMSc4pTAbwfKnE="*)(*]VB*)], MusicDuration[1/4]] MusicNote[(*VB[*) <|"Pitch" -> MusicPitch[<|"Accidental" -> 0, "Key" -> "C"|>], "Duration" -> MusicDuration[<|"Duration" -> 1/4|>]|> (*,*)(*"1:eJzdU8tOwkAUxWfUjYkbE1ea2CWJHRge7toCKgGETsujK4d2qJW2A9M2lK808Yu8BRQ2LnRpMjlz7zk3NydnMjdjrk8OcrlcdAWg8rTBRfCiCEFDlzkkCQIqlkBP9rKZc4CG4GFcD52+J+KE+mvhYkeop8xOYjr2GbkF2qmUqljG5byMJixfrCKaHxdZKS/bqFytYNke49JkP1tyCNDyoni98rtbaZc77jaunmIW9D22IMegdXjM7q/Xs2cAdceLucjk7bZH7jvr7hTA1Fs1ZnOHkXfoJFSRkKKqElbhllB1RSCtCPDVAa3tiFAgWSoorJkaRpt3SdDxRg8Kx65NFHOILWs6m5NQQqpKBhZcw7BBRwtXM4puvZ+SwOrOYcIeYn009UE3l72p6SavnqI31ZkRzBaD1O2bA4sx340szbvze0r7bTRIFalQy07mbccPrqkb99tA9QTe4SQrGHWeQ3+5Yg2RsN/GnMVaSwSNPR7+NeqPn6OWJdT4x2lHR9kXoX7EPgFPSub+"*)(*]VB*)] By grouping notes and chords, you can construct a MusicScore. A score can contain multiple voices, rests, transformations, and metadata while remaining a single inspectable expression
MusicScore[{
MusicChord[(*VB[*) <|"Name" -> "Major Seventh", "Root" -> MusicPitch[<|"Key" -> "C", "Accidental" -> 0|>]|> (*,*)(*"1:eJztVMtum0AUddv0lU2lbip11UplaYmMwbG7Y2ycNIrzYMAPVp3ANSEGxhmGGP9kv6Dqt/ROSFpv2oWXVSV0Zu45R6PDYcTHK+EtnrVarfI9AhX1SMj8qyMlLxKIWZXnXG6QXjzRnjcIIykK5RbxJJWq4lkjvN0S3BqiSvGrDNgnpM1DK+5ZC97umATaFu/Z7V6XQ3thRf1D3u0Ss9NvEuwhnKalao78NT3V07utdA+pvijIJyms2QvUzngOnz803n0EN06VkFr+fdqxyOJmeo0QeKdDiEQM7DtOBukZxKHUsCmuBunfE2TMb4Q0iMngDgp1jcyjhJ7BlhM35MDoOHBS+/5YXLD8LJ0fOcJOIuYEMzsMl6tbVhiEUjYNcZkVIz5fJwPfStxJzfLw4hYd0cz25ssM9WBzuQyS6jp1vBO68vPVelonk2AaAmRJGQ5SM7t0xjfzae0YnaF+dLatPPaQPrxK04puwKvwo7zSG+DxeZFt7llfVrBL554QatfOv/2588H/lh9bfqlvtlBQ7lrzj7/UbOG9djUcaaDWv1t7+Vz/nnhWwk9MHkqg"*)(*]VB*)],
MusicNote[(*VB[*) <|"Pitch" -> MusicPitch[<|"Accidental" -> 0, "Key" -> "C"|>], "Duration" -> MusicDuration[<|"Duration" -> 1/4|>]|> (*,*)(*"1:eJzdU8tOwkAUxWfUjYkbE1ea2CWJHRge7toCKgGETsujK4d2qJW2A9M2lK808Yu8BRQ2LnRpMjlz7zk3NydnMjdjrk8OcrlcdAWg8rTBRfCiCEFDlzkkCQIqlkBP9rKZc4CG4GFcD52+J+KE+mvhYkeop8xOYjr2GbkF2qmUqljG5byMJixfrCKaHxdZKS/bqFytYNke49JkP1tyCNDyoni98rtbaZc77jaunmIW9D22IMegdXjM7q/Xs2cAdceLucjk7bZH7jvr7hTA1Fs1ZnOHkXfoJFSRkKKqElbhllB1RSCtCPDVAa3tiFAgWSoorJkaRpt3SdDxRg8Kx65NFHOILWs6m5NQQqpKBhZcw7BBRwtXM4puvZ+SwOrOYcIeYn009UE3l72p6SavnqI31ZkRzBaD1O2bA4sx340szbvze0r7bTRIFalQy07mbccPrqkb99tA9QTe4SQrGHWeQ3+5Yg2RsN/GnMVaSwSNPR7+NeqPn6OWJdT4x2lHR9kXoX7EPgFPSub+"*)(*]VB*)],
MusicChord[(*VB[*) <|"Duration" -> MusicDuration[<|"Duration" -> 1/8|>], "Name" -> "Major", "Root" -> MusicPitch[<|"Key" -> "D", "Accidental" -> 0|>]|> (*,*)(*"1:eJztVMtO20AUTaGl0E2lbpBYtVK9jBS/SsJunAcPER4eOw+vmNjXxsT2hLGtOD/Jorv+DXcw0GzaRZYIyTp37jlXozNnRv4x43a43Wg08gMEi1cDLtIbIgTLIghomaZMrJAOP8iZrwgDwbOinwWjWBQlS2rh25rQr8AvCzZLgP5EWu/4YKiq2WwdhkbTOIR2sx3qWhP0sK3+UtVZx2C1g48I53Fe1Fu+dluy219z9+zqtIB0FMOS7qB2wVI4+l7PfkHoB3HBhZT/7nbCk6Du9hBc+7wHPg+A/sZO0dqKRixLMS2sitZ5IrQhu+MC6wuBSndNx4WmKjqBs8pxhvyKphfx9JhwM/IpcSem580X9zRTNMuiYw/LJBuw6TLqOkbUH1U09a7uccKfmPZ0nqDurq7nblTexsQ+sxZOuliOq2jkjj2AJMq9btxKrsnwbjquiKL35Ce9rfkxe9bzAeos5LntEq9iVy6ABZdZsnpiHVHCJknbnBebJv3w76R77ym/pPxZvmdeQL5pzH/+E7OhaK2BBGK83cTzT/J/xJIcHgGWPUX9"*)(*]VB*)],
MusicTransform[MusicNote[(*VB[*) <|"Pitch" -> MusicPitch[<|"Accidental" -> 0, "Key" -> "C"|>], "Duration" -> MusicDuration[<|"Duration" -> 1/4|>]|> (*,*)(*"1:eJzdU8tOwkAUxWfUjYkbE1ea2CWJHRge7toCKgGETsujK4d2qJW2A9M2lK808Yu8BRQ2LnRpMjlz7zk3NydnMjdjrk8OcrlcdAWg8rTBRfCiCEFDlzkkCQIqlkBP9rKZc4CG4GFcD52+J+KE+mvhYkeop8xOYjr2GbkF2qmUqljG5byMJixfrCKaHxdZKS/bqFytYNke49JkP1tyCNDyoni98rtbaZc77jaunmIW9D22IMegdXjM7q/Xs2cAdceLucjk7bZH7jvr7hTA1Fs1ZnOHkXfoJFSRkKKqElbhllB1RSCtCPDVAa3tiFAgWSoorJkaRpt3SdDxRg8Kx65NFHOILWs6m5NQQqpKBhZcw7BBRwtXM4puvZ+SwOrOYcIeYn009UE3l72p6SavnqI31ZkRzBaD1O2bA4sx340szbvze0r7bTRIFalQy07mbccPrqkb99tA9QTe4SQrGHWeQ3+5Yg2RsN/GnMVaSwSNPR7+NeqPn6OWJdT4x2lHR9kXoX7EPgFPSub+"*)(*]VB*)], {"Transpose", 7}],
MusicChord[(*VB[*) <|"Duration" -> MusicDuration[<|"Duration" -> 1/8|>], "Name" -> "Major", "Root" -> MusicPitch[<|"Key" -> "A", "Accidental" -> 0|>]|> (*,*)(*"1:eJztVM9P2zAY7cYYsAsSl0k7gbQcK9E0LmQ3p00HiPIjTvojp7mxE9ImcXESNf0nOXDbf7PPBLZexqFHhBS9z997n6znZytHU+GEW41GI/8GYImqL2T6C0tJs4gzUqYplSugww9qZh+gL0VW2BkbxrIoaVILB2uCXfGgLOg04eQ70KxzwviJSZstZoZNI5y2miY6DZsdI0CdsGW0zUCvHXwCuIzzot7yb/dRdV/X3D27Oi94Ooz5knwG7Yqm/MdhPfsFwGZxIaSS/+12JhJWd3sAnnPZ44FgnDxCp+mnmo4tS0MWVE03nwh9QGdCQn0hQOmu6bDQW1ob84vKdQfihqRX8eQnFigKCPbGyPfni3uSabplkZEPZZz16WQZdV0jsocVSf2be5gIxsiZzBPQvdXt3IvKuxg7F9bCTRfLURUNvZHPeRLlfjc+Tm7xYDYZVVhr99SnvK35QT3r+QB1FurcTglXsasWnLLrLFk9sa4s+SZJO0IUmyb98P+k8XvKLynvqPcsCp5vGvPvV2I2NP24iwBs9HYTz7fV/4gmOf8DZEVGnA=="*)(*]VB*)],
MusicRest[(*VB[*) <|"Duration" -> MusicDuration[<|"Duration" -> 1/4|>]|> (*,*)(*"1:eJxlkEFPAjEQhVfRRLhwNOGkh/0BbiRZuLEsjSYEk13FK4UOpkm3k8y2Uf690102Clxe533z0tf0cYvFvhdFUT1iyfBHIFWbGZG0X6BKX1WSDoz3VyEzZBGE1i2sWmtyXpp2ccPygkY1wwot/OGlrt2Zuw7u/l/fsefVQbXW8F0OeJd7kk6jnT60+cAWSjukEDmtbV2f5aNY5rBDBeUnuzhJ42Qmsnic8RknkwakT93EaN4txAVJn5uji45zcbylfVAoL7yB8i4MINWbNYeGvpOH+jb8lTQ1/AJZ8VKa"*)(*]VB*)],
MusicChord[(*VB[*) <|"Duration" -> MusicDuration[<|"Duration" -> 1/2|>], "Name" -> "Major Seventh", "Root" -> MusicPitch[<|"Key" -> "F", "Accidental" -> 0|>]|> (*,*)(*"1:eJztVMtu00AUDe/HBokNEiuQ6mWkZJJRYnbjxKFUTWk9dh5eMfXcuG5sTzq2ifOTfAHiW7hTt5ANLLJESNaZueccjY6PR35/qbzVo1arVbxFcFQ9UTr7wrQWeQySV1km9A7p1QPjeYUw0Sov3VzOEl1WIm2E13uCW0NUleIyBX6EdLcr7EgQaNsSeu3+MKJtezCg7WjYX9mdniRiIJsEjxFOk6Jsjvw1PTTTm710d6k+lZDNEtjyp6idiQw+vGu8LxFcmZRKG/n3accqlc30AiHwTscQKQn8O04WGVqEOY5FHVwtYt8SZCqulbZIh8NXyMsrZO4l9Iz2nLghXavH4KT2/ak659lZsvzIFI0jzoIFDcP15obnFnEcPg9xWeQTsdzGI78fu7OaZ+H5DTqiBfWW6xT1YHexDuLqKmHeibPxs812XsezYB4CpHERjpJOesGm18t5zaze2Dwm214eOnbuXqVpxTTgVfhRnpsNCPk5T3e3rK8rOKRzT6ny0M6//bnzyf+W71t+Zm62KqE4tOYff6m5j/eaGRhRBJf+u7UXT8zvSaQF/AQW+ksI"*)(*]VB*)]
}] (*VB[*)(FrontEndRef["572c90bd-88cd-4175-ba26-b25edb2060f9"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeK5AIzi/Ng3KFgIRbUX5eiWteimtFanJpSWJSTmqwClDY1Nwo2dIgKUXXwiI5RdfE0NxUNynRyEw3ycg0NSXJyMDMIM0SAJOJGIk="*)(*]VB*) A great thing about WL's Music Framework is that it has all the necessary functions to transpose and invert chords out of the box. In the past, we had to build our own on top of SoundNote. Multiple voices can also be added using a MusicVoice container
music = MusicScore[{
MusicVoice[{
MusicChord[(*VB[*) <|"Name" -> "Major Seventh", "Root" -> MusicPitch[<|"Key" -> "C", "Accidental" -> 0|>]|> (*,*)(*"1:eJztVMtum0AUddv0lU2lbip11UplaYmMwbG7Y2ycNIrzYMAPVp3ANSEGxhmGGP9kv6Dqt/ROSFpv2oWXVSV0Zu45R6PDYcTHK+EtnrVarfI9AhX1SMj8qyMlLxKIWZXnXG6QXjzRnjcIIykK5RbxJJWq4lkjvN0S3BqiSvGrDNgnpM1DK+5ZC97umATaFu/Z7V6XQ3thRf1D3u0Ss9NvEuwhnKalao78NT3V07utdA+pvijIJyms2QvUzngOnz803n0EN06VkFr+fdqxyOJmeo0QeKdDiEQM7DtOBukZxKHUsCmuBunfE2TMb4Q0iMngDgp1jcyjhJ7BlhM35MDoOHBS+/5YXLD8LJ0fOcJOIuYEMzsMl6tbVhiEUjYNcZkVIz5fJwPfStxJzfLw4hYd0cz25ssM9WBzuQyS6jp1vBO68vPVelonk2AaAmRJGQ5SM7t0xjfzae0YnaF+dLatPPaQPrxK04puwKvwo7zSG+DxeZFt7llfVrBL554QatfOv/2588H/lh9bfqlvtlBQ7lrzj7/UbOG9djUcaaDWv1t7+Vz/nnhWwk9MHkqg"*)(*]VB*)],
MusicNote[(*VB[*) <|"Pitch" -> MusicPitch[<|"Accidental" -> 0, "Key" -> "C"|>], "Duration" -> MusicDuration[<|"Duration" -> 1/4|>]|> (*,*)(*"1:eJzdU8tOwkAUxWfUjYkbE1ea2CWJHRge7toCKgGETsujK4d2qJW2A9M2lK808Yu8BRQ2LnRpMjlz7zk3NydnMjdjrk8OcrlcdAWg8rTBRfCiCEFDlzkkCQIqlkBP9rKZc4CG4GFcD52+J+KE+mvhYkeop8xOYjr2GbkF2qmUqljG5byMJixfrCKaHxdZKS/bqFytYNke49JkP1tyCNDyoni98rtbaZc77jaunmIW9D22IMegdXjM7q/Xs2cAdceLucjk7bZH7jvr7hTA1Fs1ZnOHkXfoJFSRkKKqElbhllB1RSCtCPDVAa3tiFAgWSoorJkaRpt3SdDxRg8Kx65NFHOILWs6m5NQQqpKBhZcw7BBRwtXM4puvZ+SwOrOYcIeYn009UE3l72p6SavnqI31ZkRzBaD1O2bA4sx340szbvze0r7bTRIFalQy07mbccPrqkb99tA9QTe4SQrGHWeQ3+5Yg2RsN/GnMVaSwSNPR7+NeqPn6OWJdT4x2lHR9kXoX7EPgFPSub+"*)(*]VB*)],
MusicChord[(*VB[*) <|"Duration" -> MusicDuration[<|"Duration" -> 1/8|>], "Name" -> "Major", "Root" -> MusicPitch[<|"Key" -> "D", "Accidental" -> 0|>]|> (*,*)(*"1:eJztVMtO20AUTaGl0E2lbpBYtVK9jBS/SsJunAcPER4eOw+vmNjXxsT2hLGtOD/Jorv+DXcw0GzaRZYIyTp37jlXozNnRv4x43a43Wg08gMEi1cDLtIbIgTLIghomaZMrJAOP8iZrwgDwbOinwWjWBQlS2rh25rQr8AvCzZLgP5EWu/4YKiq2WwdhkbTOIR2sx3qWhP0sK3+UtVZx2C1g48I53Fe1Fu+dluy219z9+zqtIB0FMOS7qB2wVI4+l7PfkHoB3HBhZT/7nbCk6Du9hBc+7wHPg+A/sZO0dqKRixLMS2sitZ5IrQhu+MC6wuBSndNx4WmKjqBs8pxhvyKphfx9JhwM/IpcSem580X9zRTNMuiYw/LJBuw6TLqOkbUH1U09a7uccKfmPZ0nqDurq7nblTexsQ+sxZOuliOq2jkjj2AJMq9btxKrsnwbjquiKL35Ce9rfkxe9bzAeos5LntEq9iVy6ABZdZsnpiHVHCJknbnBebJv3w76R77ym/pPxZvmdeQL5pzH/+E7OhaK2BBGK83cTzT/J/xJIcHgGWPUX9"*)(*]VB*)],
MusicNote[(*VB[*) <|"Pitch" -> MusicPitch[<|"Accidental" -> 0, "Key" -> "G", "MIDINumber" -> 67|>], "Duration" -> MusicDuration[<|"Duration" -> 1/4|>]|> (*,*)(*"1:eJzdU8tOg0AUrc+oGxM3Jq40kWWTMoC27qAvbdraMtAHK6cwRSww7QAp/UoTv8hLqbYbF7o0mZy595ybm5MzmZsJ06cHhUIhugLQWNpgPHhROSehSx2cBAHhK6Cne9nMOUCDszCuh87A43FC/Fy42BHqKbWTmEx8im+BLlNUlkqlcnF6Z4tFWZZKxcq9OCkikdrIkRSRSJXpfrbkEKDtRXG+8rtba5c77jaunmIaDDy6xMegdVlMH67z2TOAuuPFjGfydtsj8528OwUw9XaN2syh+B06AZUFpGqaoGhwC6iyJlBTBvjqgK7uiFAgUZBU2koNo8N6OOh646bKFNfGqjlSLGs2X+BQQJqGhxZco7BBxku3ashufZDiwOotYMIeKfp45oNurvoz001ePVVvaXMjmC+HqTswhxalvhtZVa/k99XO23iYqoJUy07mbcePUtM27reB6gm8w0lWUOI8h/5qzRo8ob+NOYu1lnASeyz8a9QfP0ctCqjxj9OOjrIvQvyIfgJ8w+a5"*)(*]VB*)],
MusicChord[(*VB[*) <|"Duration" -> MusicDuration[<|"Duration" -> 1/8|>], "Name" -> "Major", "Root" -> MusicPitch[<|"Key" -> "A", "Accidental" -> 0|>]|> (*,*)(*"1:eJztVM9P2zAY7cYYsAsSl0k7gbQcK9E0LmQ3p00HiPIjTvojp7mxE9ImcXESNf0nOXDbf7PPBLZexqFHhBS9z997n6znZytHU+GEW41GI/8GYImqL2T6C0tJs4gzUqYplSugww9qZh+gL0VW2BkbxrIoaVILB2uCXfGgLOg04eQ70KxzwviJSZstZoZNI5y2miY6DZsdI0CdsGW0zUCvHXwCuIzzot7yb/dRdV/X3D27Oi94Ooz5knwG7Yqm/MdhPfsFwGZxIaSS/+12JhJWd3sAnnPZ44FgnDxCp+mnmo4tS0MWVE03nwh9QGdCQn0hQOmu6bDQW1ob84vKdQfihqRX8eQnFigKCPbGyPfni3uSabplkZEPZZz16WQZdV0jsocVSf2be5gIxsiZzBPQvdXt3IvKuxg7F9bCTRfLURUNvZHPeRLlfjc+Tm7xYDYZVVhr99SnvK35QT3r+QB1FurcTglXsasWnLLrLFk9sa4s+SZJO0IUmyb98P+k8XvKLynvqPcsCp5vGvPvV2I2NP24iwBs9HYTz7fV/4gmOf8DZEVGnA=="*)(*]VB*)],
MusicRest[(*VB[*) <|"Duration" -> MusicDuration[<|"Duration" -> 1/4|>]|> (*,*)(*"1:eJxlkEFPAjEQhVfRRLhwNOGkh/0BbiRZuLEsjSYEk13FK4UOpkm3k8y2Uf690102Clxe533z0tf0cYvFvhdFUT1iyfBHIFWbGZG0X6BKX1WSDoz3VyEzZBGE1i2sWmtyXpp2ccPygkY1wwot/OGlrt2Zuw7u/l/fsefVQbXW8F0OeJd7kk6jnT60+cAWSjukEDmtbV2f5aNY5rBDBeUnuzhJ42Qmsnic8RknkwakT93EaN4txAVJn5uji45zcbylfVAoL7yB8i4MINWbNYeGvpOH+jb8lTQ1/AJZ8VKa"*)(*]VB*)],
MusicChord[(*VB[*) <|"Duration" -> MusicDuration[<|"Duration" -> 1/2|>], "Name" -> "Major Seventh", "Root" -> MusicPitch[<|"Key" -> "F", "Accidental" -> 0|>]|> (*,*)(*"1:eJztVMtu00AUDe/HBokNEiuQ6mWkZJJRYnbjxKFUTWk9dh5eMfXcuG5sTzq2ifOTfAHiW7hTt5ANLLJESNaZueccjY6PR35/qbzVo1arVbxFcFQ9UTr7wrQWeQySV1km9A7p1QPjeYUw0Sov3VzOEl1WIm2E13uCW0NUleIyBX6EdLcr7EgQaNsSeu3+MKJtezCg7WjYX9mdniRiIJsEjxFOk6Jsjvw1PTTTm710d6k+lZDNEtjyp6idiQw+vGu8LxFcmZRKG/n3accqlc30AiHwTscQKQn8O04WGVqEOY5FHVwtYt8SZCqulbZIh8NXyMsrZO4l9Iz2nLghXavH4KT2/ak659lZsvzIFI0jzoIFDcP15obnFnEcPg9xWeQTsdzGI78fu7OaZ+H5DTqiBfWW6xT1YHexDuLqKmHeibPxs812XsezYB4CpHERjpJOesGm18t5zaze2Dwm214eOnbuXqVpxTTgVfhRnpsNCPk5T3e3rK8rOKRzT6ny0M6//bnzyf+W71t+Zm62KqE4tOYff6m5j/eaGRhRBJf+u7UXT8zvSaQF/AQW+ksI"*)(*]VB*)]
}],
MusicVoice[{
MusicNote[(*VB[*) <|"Pitch" -> MusicPitch[<|"Accidental" -> 0, "Key" -> "C", "MIDINumber" -> 48|>], "Duration" -> MusicDuration[<|"Duration" -> 1/2|>]|> (*,*)(*"1:eJzdU01PwkAUxM+oFxMvJp40sUeSsm1BvLUFVAII3ZaPnizdpVbaLmzbUH6lib/IV0Dh4kGPJpvZ92ZeXiaz2ZsxMyYHhUIhvgLQWNZgPHxROXcijxKchqHDl0BP9vKZc4AGZ1FSj0jf50nqBGvhYkeoZ9RNE2ccUHwLtDKWiUzKYrEsiqQolytysSq6d0VpopASGleJJFYm+/mSQ4CWHyfrld/dSrvccbdx9ZTQsO/TBT4GrcMSen+9nj0DqBM/YTyXt9seWUDW3SmAZbRq1GWE4nfoBHQnIFXTBEWDW0DVFYF0CeCrA1rfEaFAJUFSaTMzzTbr4rDjjx5UpnguVq2hYtvT2RxHAtI0PLDhGkYNZ7TwdFP26v0Mh3Z3DhPuUDFG0wB0a9mbWl766qtGU5uZ4WwxyLy+NbApDbzY1n0x6Kntt9EgUwWplp/c244fpaZt3G8DNVJ4h5O8oA55joLlijV5Sn8bcx5rLeVO4rPor1F//Bx1SUAN9H/Tjo/yL+IEMf0EFzrm6Q=="*)(*]VB*)],
MusicNote[(*VB[*) <|"Pitch" -> MusicPitch[<|"Accidental" -> 0, "Key" -> "D", "MIDINumber" -> 50|>], "Duration" -> MusicDuration[<|"Duration" -> 1/4|>]|> (*,*)(*"1:eJzdU01PwkAUxM+oFxMvJp40sUcSaSkUby0tKgGEbstHTy7bpVbaLmzbUH6lib/IV0Dh4kGPJpvZ92ZeXiaz2ZsxMycHhUIhvgLQWNZgPHxROceRR12UhiHmS6Ane/nMOUCDsygxIrfv8yTFwVq42BGMjJI0weOAolugiUsUiSilolSRy8WyJOGiUpLlojIhWFRIpepWa5P9fMkhQMuPk/XK726lXe6427h6SmjY9+kCHYPWYQm9v17PngEYrp8wnsvbbY8scNfdKYBttnRKmEvRO3SCqAiiqmmCrMEtiLUVIeoSwFcHdH1HhEIsCZJKm5lltVkXhR1/9KAy2SNItYey40xncxQJoqahgQPXMGrg0cKrW2XP6GcodLpzmCBD2RxNA9DtZW9qe+mrr5pNbWaFs8Ug8/r2wKE08GKn7t8FPbX9NhpkqiDp+cm97fiRdW3jfhuomcI7nOQFxe5zFCxXrMVT+tuY81j1lOPEZ9Ffo/74OeqSIDbK/zft+Cj/IjiI6SflAecv"*)(*]VB*)],
MusicNote[(*VB[*) <|"Pitch" -> MusicPitch[<|"Accidental" -> 0, "Key" -> "G", "MIDINumber" -> 55|>], "Duration" -> MusicDuration[<|"Duration" -> 1/8|>]|> (*,*)(*"1:eJzdU01PwkAQxc+oFxMvJp40sUcSWFoC3lo+VAII3ZaPnlzaoVbaLm7bUH6lib/IKaBw8aBHk83bmfcmk5e32ZsJ16cHuVwuukLQeNrkInhWhWChCw5NgoCJJdLTvWzmHKEpeBg3QmfgiThh/lq42BEaKdhJzCY+0Fuk5aIty8AK+YpTLeflKSH5CbMhD+ViQSYFcCoym+5nSw4R2l4Ur1d+dyvtcsfdxtVjDMHAgwU9Rq3LY7i7Xs+eITQcL+Yik7fbHrjvrLtTBFNv18HmDtB37CRSkYiqaZKi4S2R6oog9yWErw7p2o6IBSlKJRVaqWF0eI8GXW98r3LFtalqjhTLms3faCgRTaNDC69R2GTjhVszZLcxSGlg9d5wwh4p+njmo24u+zPTTV48VW9pcyOYL4apOzCHFoDvRlbNK/h9tfM6HqaqVKpnJ/O240epaxv320D1BN/hJCuAOU+hv1yxhkjgtzFnsdYTwWKPh3+N+uPnqIsSaVb+b9rRUfZFmB/BJz8T56c="*)(*]VB*)],
MusicNote[(*VB[*) <|"Pitch" -> MusicPitch[<|"Accidental" -> 0, "Key" -> "A", "MIDINumber" -> 57|>], "Duration" -> MusicDuration[<|"Duration" -> 1/8|>]|> (*,*)(*"1:eJzdU8lOwzAQLauACxIXJE4gkWOl4jS05eZ0YRFrnHTJCSeZhNAkLk6ipl+JxBcxaVl64QBHJOt55r3R6OlZPnKE4a9VKpX0AEEXRU/I+JFKyZMAPJbHMZczpP2VcmYXoSdFknUTrx/KLOfRQthbEroFuHnGnQjYMdL1luq0/DpUOSFOtd7w3WrTOYUqqalOo9ZsQcN3/NVyyTrCdZhmi5Vf3VzbX3L34eoyg7gfwpRtonYrMjg7XMzuIHS9MBOylL+3XYjIW3TbCJZx3QFXeMBesVNIUyFU1xVNx1shrTlBqIrw2SHdXhKxICeKSuGqMM0bcc/i23B0ToUWuIxaQ822x5MXlihE19nAxmuY9PhoGrTNetDtFyy2719wwh1qxmgcoW7NHsZWkD+F1LjSJ2Y8mQ6KoG8NbIAoSO12WIse6M3zaFBQRe2Up/S25Efr6B/uvwM1cnyHrbIA7t0l0WzOmjKH38ZcxtrJJc9Ckfw16refoz5RSK/5f9NON8ovwqMU3gGCWee8"*)(*]VB*)],
MusicRest[(*VB[*) <|"Duration" -> MusicDuration[<|"Duration" -> 1/8|>]|> (*,*)(*"1:eJxlkM1LxDAQxesXqBePgif30D/AQqF6a+0GhWWFRrvXjWYqgTQD0wTd/95Ju8Wvy8u83zzyQhav2HRHSZIMVywVfgqkflsSKfcOWoa+V7Rj3B3EzAWLIHR+6XRryAdlp8UxywNaPQ5rdPCNV2bwf9xhdJc/+vY9jx761sCHPOddHUh5g+7uespHttTGI8XI79rJnbG8NKsa3lCD3LBLsyLNSlGlecVnmt2OoLiZJ0b380L8I0UxHnM0r8X+lulBsbwJFuRpHEDpJ2d3I32mAMNJ/CtlB/gCWwlSng=="*)(*]VB*)],
MusicNote[(*VB[*) <|"Pitch" -> MusicPitch[<|"Accidental" -> 0, "Octave" -> 4, "Key" -> "D", "Name" -> "D"|>], "Duration" -> MusicDuration[<|"Duration" -> 1/8|>]|> (*,*)(*"1:eJzdU8tOwkAUxWfUjYkbE1ea2CWJTCkPdy0FlQBCp+XRlW1nWittB6ZtKF9p4hd5CyhsXOjSZHLm3nNubk7OZG5sprkHhUIhvgJQWNZiPHyRObcijxKchqHFl0C7e/nMOUCLsyhpRmTo8yS1grVwsSM0M+qkiWUHFN8CbYsViVRQrVglpFos26hSrLslu+i4RCSiS0iparv7+ZJDgI4fJ+uV391Ku9xxt3H1lNBw6NMFPgatxxJ6f72ePQNoEj9hPJe32x5ZQNbdKYChdVTqMELxO3QCqglIVhRBUuAWUH1FILUM8NUB3dgRoUAlQZRpO9P1LuvjsOdPHmQmeQ6WjbFkmtPZHEcCUhQ8MuEaRy1rsvAaetlrDjMcmv05TDhjSZtMA9CN5WBqeOmrL2ttZaaHs8Uo84bGyKQ08GKz4d8FA7n7NhllsiCq+cm97fiRVGXjfhuolsI7nOQFtchzFCxXrM5T+tuY81jVlFuJz6K/Rv3xc9QlAbVq/zft+Cj/IlYQ00+Yrugc"*)(*]VB*)],
MusicNote[(*VB[*) <|"Pitch" -> MusicPitch[<|"Accidental" -> 0, "Key" -> "D", "MIDINumber" -> 38|>], "Duration" -> MusicDuration[<|"Duration" -> 1/2|>]|> (*,*)(*"1:eJzdU8tOg0AUrc+oGxM3Jq40kSWJnYot7qAUtfFVBvpg5bRcEAtMO0BKv9LEL/LS+ujGhS5NJmfuPefm5uRM5mTILX+jUqmkRwg6L0wu4idNCJYE4NE8jpmYI+2vlTP7CKbgSdZKvG4ospxFS+FgRWgVMMozNoyAniINNdVnRG3IAA1VPq8OQVbrNV9mZ1BXyIWnDIH46+WSTYTbMM2WK7+6hXa44u7D1U0GcTeEGd1G7Z5ncHm8nN1DaHlhxkUpf2+75pG37HYRHOvWgBH3gL5iJ5GGRDRdlxQdb4moC4IYBOGzQ7q5ImJBqlJNg3Zh23f8kcb34eBK40owoprTV1x3PJnSRCK6TnsuXv3EZINZ0LTPg1a3oLH7OMWJUV+xBuMIdWfeGTtB/hxqVluf2PFk1iuCrtNzAaIgdZvhWdTR7l4GvUKTakZ5Sm8rfhRD/3D/HaiV4zvslAUw7yGJ5gvWFjn8NuYyViMXLAt58teo336OuioR8x+nnW6VX4RFKbwDomjnwg=="*)(*]VB*)],
MusicNote[(*VB[*) <|"Pitch" -> MusicPitch[<|"Accidental" -> 0, "Key" -> "D", "MIDINumber" -> 38|>], "Duration" -> MusicDuration[<|"Duration" -> 1/4|>]|> (*,*)(*"1:eJzdU01PwkAQxc+oFxMvJp40sUcSWKhSby0FlShit+WjJxc6rZW2C9s2lF9p4i9yCihcPOjRZPN25r3J5OVt9mLIDXenUCjEZwgaz5pchC+qECzywKFpGDIxR9rdymeOEZqCR0kjcrq+SFIWLIWTDaGRwShN2DAAeok0VBSXEaVWBKgpxWp5CEXluuIWWQmuZXLlyEMg7na+ZBfhwY+T5crvbqGdbrhbubpPIOz6MKP7qLV5Ajfny9kjhIbjJ1zk8nrbHQ+cZXeIYBkPOoy4A/QdO4nUJKJqmiRreEtEWRBEJwhfHdL1DRELUpYqKrQy03zkHRq2/cGtymVvRFWrL9v2eDKlkUQ0jfZsvPpRkw1mXt2seo1uRkO7M8WJUV82BuMAdWv+PLa89NVXjZY2McPJrJd5XatnAwRebNf9UvCsPr4NepkqVfT85N42/Mi6tnK/DtRI8R0O8gKY8xQF8wVrihR+G3Meq54Klvg8+mvUHz9HXZZIs/p/04738i/Cghg+AaQy58Q="*)(*]VB*)]}, "Instrument"->"Organ"]
}] (*VB[*)(FrontEndRef["2ba7e139-14c9-4ccc-83d0-e581995a1bf7"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeK5AIzi/Ng3KFgIRbUX5eiWteimtFanJpSWJSTmqwClDYKCnRPNXQ2FLX0CTZUtckOTlZ18I4xUA31dTC0NLSNNEwKc0cAJUkGJE="*)(*]VB*) Neat!
There is backward compatibility: you can wrap it in Sound and use it in EmitSound, for example:
EmitSound[music//Sound] music//Sound (*VB[*)(FrontEndRef["21d8180f-7712-41b3-89cc-792f44f2e99e"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKGxmmWBhaGKTpmpsbGumaGCYZ61pYJifrmlsapZmYpBmlWlqmAgB0VxUn"*)(*]VB*) If you need musical scales, there is a special symbol for that:
MusicScale@RandomChoice@MusicScale["Names"] Construct chords by sampling every third pitch in the list:
pitches = MusicScale[(*VB[*) <|"Name" -> "Lydian Augmented"|> (*,*)(*"1:eJzdU11v0zAU7fiGB5B4QeIJJPJYKfVidePNTtPB1I0tTvqRJ9zYyULjuHMSNf21/BWu28EqIR7gEck69j3n6Or6WH6/1GH2sNfr1W8BqO7G2qivxBhe5VKwVilutkBnR9bzCmBsdNUElZgWpml5uRdeHwhBJ9O24ctSsg9A4+HAQy4S/ZNTPOh7Kc/6fIBkX7je0s1Sd8mHw+yBbfIIYFLUzb7lr2qnvTmY7m6qz41U00Ju2BPQLrmSH9/tvS8AAlE02lj5vtsnXYp99RwgDicjmWoh2XeoHHTiIEKpgynsDjrdEWiyFQWvHOSSNleyaqQA8qcKNv/ADAc0cI6JPO+i6EJfMXVZLM6IxnnKSDzHSbJa3zJoRimbJbDNqzFfbHI/8vJg2jGVXN2CI53jcLEqQY+316s4b28KEp7TdaTWm1mXT+NZImWZ14lfuOU1ufi2mHXEOR7ZZWc7mAeP6N1t7gMOW3iXZ/YgufhSldsdG5lW/m3sT23supH1v+b+8uiPufseZD6yEFgYO9gHB7vhZg23stTZ7xSxQC34+P99pvqx/Wu8rOUPphj5hQ=="*)(*]VB*)]["PitchList"];
pitches =
Join[pitches,
MusicTransform[{"Transpose", 12}] /@ Rest@pitches];
Table[MusicChord@pitches[[{i, i + 2, i + 4, i + 6}]], {i, 4}]//TableForm (*GB[*){{MusicChord[(*VB[*) <|"PitchList" -> {MusicPitch[<|"Accidental" -> 0, "Octave" -> 4, "Key" -> "C"|>], MusicPitch[<|"Accidental" -> 0, "Octave" -> 4, "Key" -> "E"|>], MusicPitch[<|"Accidental" -> 1, "Octave" -> 4, "Key" -> "G"|>], MusicPitch[<|"Accidental" -> 0, "Octave" -> 4, "Key" -> "B"|>]}|> (*,*)(*"1:eJxdUctO6zAQLY8rHhskNkh3dZHwslLrxojcXZymPMQzTvrICidxQ2gSFydR03/mIxgTEBWSdWbmnJnReOY0lO58p9PplH8BqGxGUuXPllK8SETM6jznag30fEvnHAGMlCwqp4jHqapqnrXC8YbgNCKqKx5mgp0BPe+bwoww6UYh6XeNgYm7Ju71uzwMjXAQx+dG2Gub7ALcpmX1K9rW0cnGdF9TXVciH6dixfZAu5eVKP//a5MPAZw4raTS+k+7K5nFbXQA4Lu3QxHJWLB3iBC+QNiiFBEKFmHzk8C2gXDP0XCJiA0ie+FqichQUxQAf6dCjb1RCQ7uo4ElbhrPu5OPLL9PZ5eWJEnELH9KgmCxfGMFwpSySQBmWoz4bJXYnpE444blweMbZERT4s4WGej++mnhJ/VLark3dOnly9WkScb+JBAiS8rATnvZk3X3Ops0FhoM9dOzbcxDhvTra+2W9EbcGq60rx3B44ciW3+ynqpF+UeflGel+ABO+o8i"*)(*]VB*)]}(*||*),(*||*){MusicChord[(*VB[*) <|"PitchList" -> {MusicPitch[<|"Accidental" -> 0, "Octave" -> 4, "Key" -> "D"|>], MusicPitch[<|"Accidental" -> 1, "Octave" -> 4, "Key" -> "F"|>], MusicPitch[<|"Accidental" -> 0, "Octave" -> 4, "Key" -> "A"|>], MusicPitch[<|"Accidental" -> 0, "Octave" -> 5, "Key" -> "C"|>]}|> (*,*)(*"1:eJxdUU1P4zAQ7cIiFi4r7QWJE0jrY6XGbYByc9KWDwELcdKPnDDJJA1N4uIkavqf+RGMGxDVytabmfeerfH49EU60W6r1SqOESxZj6TKnplSIo8h5FWWCbVGOvqhPb8RRkrm5TAPx4kqK5E2wp8tYVhDUJXiJQX+F+luBN3wTIi2YQho93rGRVsEnahNoXPex0WNqN9c8hPhLinK/6odXR1tdffZ1U0J2TiBFd9H7UGWUFyeNOZDhGGYlFJp/fu6a5mGTXWA4Dl3AwhkCPwdK0IvCGWWRUwLI6H9DUEHPUI7I2LayPO5UEtibiimwTbR8WXFM/bWSUyoQboMbmvXvZePPHtIZldMmnHAmTc1fX+xfOM5oZbFJz6GaT4Ss1Vsu714OK555j++oSOYms5skaLurZ8WXlzNE+bcWks3W64mdTz2Jj5AGhe+nXTSJ3b/OpvUjHQHeuvetvoxB9bn05op6Yk4Ff7SL52ACP/l6XrDuqqCYk9/qUgL+ABxnI8t"*)(*]VB*)]}(*||*),(*||*){MusicChord[(*VB[*) <|"PitchList" -> {MusicPitch[<|"Accidental" -> 0, "Octave" -> 4, "Key" -> "E"|>], MusicPitch[<|"Accidental" -> 1, "Octave" -> 4, "Key" -> "G"|>], MusicPitch[<|"Accidental" -> 0, "Octave" -> 4, "Key" -> "B"|>], MusicPitch[<|"Accidental" -> 0, "Key" -> "D", "MIDINumber" -> 74|>]}|> (*,*)(*"1:eJxdUVtPgzAUnrd4eTHxxcQnTezjEi0Q0Tc6mJdsXijswpMdFMQBnQUy9p/9EZ6KxsWk+drv0pPT07OZcOOtTqdTngAQ0fSFzF8tKVmR8IjWec7kCuR4Q2UOAfpSFJVTRKNUVjXLWuNozXAaHtYVm2WcnoOsMc00w0uzi5nJuvpVyLumPgMa41hnscZ0M26LbAMM0rL6xzYVO17r7qer+4rno5Qv6S54j6Li5c1pGz4AcKK0ElL5f+XuRBa1bB/Adwc2D0XE6ScwhE2ELUKQQWBH+PpbwI6O8MUtMnqg0zcmF8iwlUQU2AYkfqNwp7d2Ew74EmkWf2g8byieaf6YTm8tYSQhtfyJEQTzxQctECaEjgPYJkWfTZdJz9MTZ9TQPHj+gEQ4MdzpPAPfX73M/aR+Sy33gSy8fLEcN8nIHwecZ0kZ9NKL7MUavk/HjYU0Wy3V21o/hk1+ntZOSU3EreGX9tSBs+ipyFbfqidrXu6oL2VZyb8Ax5CPag=="*)(*]VB*)]}(*||*),(*||*){MusicChord[(*VB[*) <|"PitchList" -> {MusicPitch[<|"Accidental" -> 1, "Octave" -> 4, "Key" -> "F"|>], MusicPitch[<|"Accidental" -> 0, "Octave" -> 4, "Key" -> "A"|>], MusicPitch[<|"Accidental" -> 0, "Octave" -> 5, "Key" -> "C"|>], MusicPitch[<|"Accidental" -> 0, "Key" -> "E", "MIDINumber" -> 76|>]}|> (*,*)(*"1:eJxdUclOwzAQLZtYLkhckDiBhI+VSBqjlpuTpixijZMuOWFiN4QmceskavrPfARjAqJCst7MvDczGs+cvUlvutVqtYoTAFvWA6myV6IUy2PBaZVlTK2Anm7onEOAgZJ56eZ8mKiyYmkjHK0Jbi2iqmRvqaDnQF9aPcYM3G1Home0LYt1293IMNoRNqacd3inx0TTZBvgPinKf9Gmjo7XpvuZ6rYU2TARS7oL2qMsRXF12iQfALg8KaXS+l+7G5nyJtoHCLz7vogkF/QTImR2kUlsG2EbLDJ734Q5QNgBir4zNUe4byHzgmhwMIALYP6mQo2zVgmOaaAOEXe17z/IZ5o9JpNrInEcURKMcRjO5guaI9O26SgEM84HbLKMHd+K3WFNs/B5ARnRGHuTWQp6sHqZBXH1nhDvzp772Xw5quNhMAqFSOMidJKL9IU8fExGNUGdvn56trV5cN/++VqzJb0Rr4Ir7WlHMP6Up6tv1leVKHb0SVlaiC+/NY9i"*)(*]VB*)]}}(*||*)(*1:eJxTTMoPSmNmYGAo5gUSYZmp5S6pyflFiSX5RcEsQBH3osyUNCaQPIgXVJqTWswPFXbKrwguSEzOzEsvTmOEqfDJLC5BVQ82Jii/vDgTSDOgmSWAMMsxJzM9Lzc1rwSvYexAhnN+TmluXjFESWpaCQBkRyz7*)(*]GB*) This might give the overall impression that there is too much programming or math and not enough music itself. As a musician myself (@JerryI), I find it very handy to quickly generate a scale in a given key and see it on piano keys, or use it to find suitable chords (or 'allowed' notes) for a melody in case, by ear, it just does not come. See you next time! ✌️