PROG0466 - Chords

no tags 

A chord, in music, is any harmonic set of three or more notes that is heard as if sounding simultaneously. On lead sheets, fake books and chord charts, chords are usually represented using a shorthand notation that makes them faster to read. Your task is to convert the shorthand notation of a chord (for example: Gm7) to the sequence of notes found in that chord (for example: G A# D F).

C akkoord
The notes of the C major chord represented in the staff notation.
C akkoord op gitaar
A C major chord played on an acoustic guitar.

If you're not a musician, don't worry — the progress is quite simple principle. The first thing you need to know about is the twelve notes of the chromatic scale:

C C# D D# E F F# G G# A A# B

The interval between two notes is expressed in semitones. For example, there are three semitones between the D and the F in this scale. There is no particular root note, allowing the scale to begin at any note and having the first note of scale follow the last note (but then an octave higher).

chromatishe toonladder
Chromatic scale drawn as a circle: each note is equidistant from its neighbors, separated by a semitone of the same size.

Next, you'll need to know about the different kinds or chords themselves:

chord symbol tones
major (nothing) [0, 4, 7]
minor m [0, 3, 7]
dominant seventh 7 [0, 4, 7, 10]
minor seventh m7 [0, 3, 7, 10]
major seventh M7 [0, 4, 7, 11]

The shorthand notation of a chord consists of two parts: a root note followed by the symbolic representation of a chord type. The root note is represented as an uppercase letter, possibly followed by a hash symbol (#). The find out the notes in a chord, take the base note and then select the tones from the chromatic scale relative to the numbers in the list of tone intervals. For example, the chord Gm7 is a minor seventh chord (symbol m7) with G as its root note. We can look up the tone intervals as follows:

m7 $\longrightarrow$ minor seventh $\longrightarrow$ [0, 3, 7, 10]

The we step 0, 3, 7 and 10 semitones up from the root note G in the chromatic scale, wrapping if necessary:

[G+0, G+3, G+7, G+10] $\longrightarrow$ [G, A#, D, F]

Those are the notes in our chord. 

Assignment

  • Write a function decomposition that takes a string containing the shorthand notation of a chord. The function must return a tuple containing two strings that respectively describe the root note and the symbolic representation of the chord type. The major chord is symbolically represented as the empty string. 
  • Write a function notes that takes two arguments: a string representing a root note and a list of integers representing the sequence of tone intervals in the chromatic scale of the notes found in a chord. The function must return the list of notes in the chromatic scale that are found in the chord.
  • Use the functions decomposition and notes to write a function chord. This function takes three arguments: i) a string containing the shorthand notation of a chord, ii) a dictionary that maps the names of a number of different chord types onto the corresponding list of tone intervals, and iii) a dictionary that maps the symbolic representation of the same chord types onto the corresponding name of those chord types. The function must return the tuple of notes in the chromatic scale that are found in the given chord.

Example

>>> decomposition('F')
('F', '')
>>> decomposition('Gm7')
('G', 'm7')
>>> decomposition('D#M7')
('D#', 'M7')

>>> notes('F', [0, 4, 7])
['F', 'A', 'C']
>>> notes('G', [0, 3, 7, 10])
['G', 'A#', 'D', 'F']
>>> notes('D#', [0, 4, 7, 11])
['D#', 'G', 'A#', 'D']

>>> chordtypes = {'major':[0, 4, 7], 'minor':[0, 3, 7], 'dominant seventh':[0, 4, 7, 10], 'minor seventh':[0, 3, 7, 10], 'major seventh':[0, 4, 7, 11]}
>>> chordsymbols = {'':'major', 'm':'minor', '7':'dominant seventh', 'm7':'minor seventh', 'M7':'major seventh'}
>>> chord('F', chordtypes, chordsymbols)
('F', 'A', 'C')
>>> chord('Gm7', chordtypes, chordsymbols)
('G', 'A#', 'D', 'F')
>>> chord('D#M7', chordtypes, chordsymbols)
('D#', 'G', 'A#', 'D')

In de muziek is een akkoord een harmonische samenklank van drie of meer noten die als één geheel klinken in het oor. Op partituren worden akkoorden verkort genoteerd zodat de muziek snel kan afgelezen worden. Je opdracht bestaat erin om de verkorte notatie van een akkoord (bijvoorbeeld: Gm7) om te zetten in de reeks noten waaruit het akkoord is opgebouwd (bijvoorbeeld: G A# D F).

C akkoord
De noten van een C-majeurakkoord voorgesteld in de solsleutel.
C akkoord op gitaar
Een C-majeurakkoord op een akoestische gitaar.

Sla niet in paniek als je geen muzikant bent — deze omzetting gebeurt volgens een eenvoudig principe. Het eerste wat je moet weten zijn de 12 noten van de chromatische toonladder: 

C C# D D# E F F# G G# A A# B

Het verschil tussen elke twee noten in deze toonladder is een halve toon. Zo liggen er bijvoorbeeld drie halve tonen tussen D en F. Er is geen bepaalde grondtoon, waardoor de toonladder op elke toon kan beginnen en na de laatste noot van de toonladder terug de eerste noot volgt (maar dan een octaaf hoger).

chromatishe toonladder
Chromatische schaal getekend als een cirkel: elke noot staat op dezelfde afstand van zijn buren, en is ervan gescheiden door een halve toon van dezelfde grootte.

Het volgende dat je moet weten zijn de verschillende types akkoorden:

akkoordtype symbool toonintervallen
majeur (niets) [0, 4, 7]
mineur m [0, 3, 7]
dominant septiem 7 [0, 4, 7, 10]
mineur septiem m7 [0, 3, 7, 10]
majeur septiem M7 [0, 4, 7, 11]

De verkorte notatie van een akkoord bestaat uit twee delen: een grondnoot gevolgd door de symbolische voorstelling van een akkoordtype. De grondnoot wordt genoteerd als een hoofdletter, eventueel gevolgd door een hekje (#). Om de noten te vinden waaruit het akkoord is opgebouwd, vertrek je van de grondnoot. Daarna selecteer je de tonen uit de chromatische toonladder relatief ten opzichte van de getallen in de lijst van toonintervallen. Het akkoord Gm7 is bijvoorbeeld een mineur septiem akkoord (symbool m7) met grondnoot G. We kunnen dus de toonintervallen als volgt terugvinden:

m7 $\longrightarrow$ mineur septiem $\longrightarrow$ [0, 3, 7, 10]

Vervolgens stappen we op de chromatische toonladder 0, 3, 7 en 10 halve tonen vooruit vanaf de grondnoot G, waarbij we terug naar voor springen als we het einde van de toonladder bereikt hebben:

[G+0, G+3, G+7, G+10] $\longrightarrow$ [G, A#, D, F]

Dit zijn de gezochte noten waaruit het akkoord is opgebouwd.

Opgave

  • Schrijf een functie ontleding waaraan de verkorte notatie van een akkoord moet doorgegeven worden. De functie moet een tuple van twee strings teruggeven, die respectievelijk de grondnoot en de symbolische voorstelling van een akkoordtype omschrijven. Het majeurakkoord wordt hierbij symbolisch voorgesteld door de lege string.
  • Schrijf een functie noten waaraan twee argumenten moeten doorgegeven worden: een string die een grondnoot voorstelt en een lijst van natuurlijke getallen die de toonintervallen in de chromatische toonladder voorstellen van de noten waaruit een akkoord is opgebouwd. De functie moet een lijst teruggeven die de noten uit de chromatische toonladder bevat waaruit het akkoord is opgebouwd.
  • Gebruik de functies ontleding en noten om daarmee een functie akkoord te schrijven. Aan deze functie moeten drie argumenten doorgegeven worden: i) een string met de verkorte notatie van een akkoord, ii) een dictionary die de namen van een aantal verschillende types akkoorden afbeeldt op de corresponderende lijst van toonintervallen, en iii) een dictionary die de symbolische voorstelling van dezelfde types akkoorden afbeeldt op de naam van die akkoordtypes. De functie moet een tuple teruggeven dat de noten uit de chromatische toonladder bevat waaruit het akkoord is opgebouwd.

Voorbeeld

>>> ontleding('F')
('F', '')
>>> ontleding('Gm7')
('G', 'm7')
>>> ontleding('D#M7')
('D#', 'M7')

>>> noten('F', [0, 4, 7])
['F', 'A', 'C']
>>> noten('G', [0, 3, 7, 10])
['G', 'A#', 'D', 'F']
>>> noten('D#', [0, 4, 7, 11])
['D#', 'G', 'A#', 'D']

>>> akkoordtypes = {'majeur':[0, 4, 7], 'mineur':[0, 3, 7], 'dominant septiem':[0, 4, 7, 10], 'mineur septiem':[0, 3, 7, 10], 'majeur septiem':[0, 4, 7, 11]}
>>> akkoordsymbolen = {'':'majeur', 'm':'mineur', '7':'dominant septiem', 'm7':'mineur septiem', 'M7':'majeur septiem'}
>>> akkoord('F', akkoordtypes, akkoordsymbolen)
('F', 'A', 'C')
>>> akkoord('Gm7', akkoordtypes, akkoordsymbolen)
('G', 'A#', 'D', 'F')
>>> akkoord('D#M7', akkoordtypes, akkoordsymbolen)
('D#', 'G', 'A#', 'D')


Added by:Peter Dawyndt
Date:2014-04-07
Time limit:10s
Source limit:50000B
Memory limit:1536MB
Cluster: Cube (Intel G860)
Languages:PY_NBC
Resource:None