harmony

Makefile

.PHONY: wav mp3 clean

wav: harmony.wav
mp3: harmony.mp3

clean:
    git clean -Xdf

%.mp3: %.wav %.id3
    tz tag $<
    ffmpeg -y -i $< $@

%.wav: %.mel
    tz mel $< $@

harmony.wav: parts/tunings.wav parts/series.wav parts/chords.wav
    tz stick $+ $@

harmony.id3

TIT2 Harmonielehre
TALB Tonbandfetzen
TPE1 Jan Berges
APIC ../../logo/Tonbandfetzen.png

just.py

#!/usr/bin/env python3

import numpy as np
import sys

letters = 'FCGDAEB'
signs = ['bb', 'b', '', '#', 'x']
notes = [letter + sign for sign in signs for letter in letters]
commas = ["''", "'", 'Pyth.', ",", ",,", ",,,"]

equal = np.empty(5 * 7)
fifth = np.empty_like(equal)
table = np.empty((5 * 7, 6))
cents = np.empty_like(table)

def unfold(f):
    return f / 2 ** np.floor(np.log2(f))

def error(f1, f2):
    P8 = np.log2(f2 / f1) % 1

    if P8 > 0.5:
        P8 -= 1

    return 1200 * P8

sys.stdout.write('%3s %3s %5s' % ('n', 'X', 'equal'))

for comma in commas:
    sys.stdout.write(' %5s %5s' % (comma, 'error'))

sys.stdout.write('\n')

for i, n in enumerate(range(-15, 19)):
    equal[i] = unfold(2 ** (7 * n / 12))
    fifth[i] = unfold(3 ** n)

    sys.stdout.write('%3d %3s %5.3f'
        % (n, notes[i], equal[i]))

    for j, m in enumerate(range(-2, 4)):
        table[i, j] = unfold(fifth[i] * 5 ** m / 3 ** (4 * m))
        cents[i, j] = error(equal[i], table[i, j])

        sys.stdout.write(' %5.3f %5.1f'
            % (table[i, j], cents[i, j]))

    sys.stdout.write(' %s' % commas[np.argmin(abs(cents[i]))])

    sys.stdout.write('\n')

parts/chords.mel

*Unos acordes de Morir cantando de Hugo Monzon*

~ cubic
T equal

G2' I B3'`  D4'` F4'` G4' J
C3' I E4'`  G4'` C5'      J
E2' I G#3'` B3'` D4'` E3' J
A2' I C4'`  E4'` A4'      J

X report

parts/series.mel

*adapted from https://misotanni.github.io/fjs/en/examples.html*

$44100 O1

~ harmonic
N smooth 0.02

T pyth

@675 *C4 = 400 Hz*

M C2 '64 W

C2'     C3'     G3'     C4'     Ev4'    G4'     Bbz4'   C5'
D5'     Ev5'    Fi5'    G5'     Ab5 13' Bbz5'   Bv5'    C6'
Db6 17' D6'     Eb6 19' Ev6'    Fz6'    Fi6'    F#6 23' G6'
G#vv6'  Ab6 13' A6'     Bbz6'   Bb6 29' Bv6'    B6 31'  C7'
Ci7'    Db7 17' Dvz7'   D7'     D7 37'  Eb7 19' Eb7 13' Ev7'
E7 41'  Fz7'    F7 43'  Fi7'    F#v7'   F#7 23' G7 47'  G7'
Abzz7'  G#vv7'  Ab7 17' Ab7 13' A7 53'  A7'     Avi7'   Bbz7'
Bb7 19' Bb7 29' B7 59'  Bv7'    B7 61'  B7 31'  Cz8'    C8'

parts/tunings.mel

$44100 O1

~ cubic
N smooth 0.02

,5

@440' `1:2 A4' *concert pitch*

C *use C as keynote to avoid # and b*

T equal *12-tone equal temperament*

*diatonic scale*
C4' `1:2 C4 +0'
D4' `1:2 C4 +2'
E4' `1:2 C4 +4'
F4' `1:2 C4 +5'
G4' `1:2 C4 +7'
A4' `1:2 C4 +9'
B4' `1:2 C4 +11'
C5' `1:2 C4 +12'

*triads of C major/A minor scale*
C4'` E4'` G4' `1:2 C4 +0'` +4'` +7' *tonic/mediant*
D4'` F4'` A4' `1:2 D4 +0'` +3'` +7' *supertonic/subdominant*
E4'` G4'` B4' `1:2 E4 +0'` +3'` +7' *mediant/dominant*
F4'` A4'` C5' `1:2 F4 +0'` +4'` +7' *subdominant/submediant*
G4'` B4'` D5' `1:2 G4 +0'` +4'` +7' *dominant/subtonic*
A4'` C5'` E5' `1:2 A4 +0'` +3'` +7' *submediant/tonic*
B4'` D5'` F5' `1:2 B4 +0'` +3'` +6' *leading tone/supertonic*
C5'` E5'` G5' `1:2 C5 +0'` +4'` +7' *tonic/mediant*

T pyth *3-limit Pythagorean tuning*

*diatonic scale*
C4' `1:2 C4 Q1:1'
D4' `1:2 C4 Q9:8'
E4' `1:2 C4 Q81:64'
F4' `1:2 C4 Q4:3'
G4' `1:2 C4 Q3:2'
A4' `1:2 C4 Q27:16'
B4' `1:2 C4 Q243:128'
C5' `1:2 C4 Q2:1'

*triads of C major/A minor scale*
C4'` E4'` G4' `1:2 C4 Q1:1'` Q81:64'` Q3:2' *tonic/mediant*
D4'` F4'` A4' `1:2 D4 Q1:1'` Q32:27'` Q3:2' *supertonic/subdominant*
E4'` G4'` B4' `1:2 E4 Q1:1'` Q32:27'` Q3:2' *mediant/dominant*
F4'` A4'` C5' `1:2 F4 Q1:1'` Q81:64'` Q3:2' *subdominant/submediant*
G4'` B4'` D5' `1:2 G4 Q1:1'` Q81:64'` Q3:2' *dominant/subtonic*
A4'` C5'` E5' `1:2 A4 Q1:1'` Q32:27'` Q3:2' *submediant/tonic*
B4'` D5'` F5' `1:2 B4 Q1:1'` Q32:27'` Q1024:729' *leading tone/supertonic*
C5'` E5'` G5' `1:2 C5 Q1:1'` Q81:64'` Q3:2' *tonic/mediant*

T just *5-limit just intonation*

*diatonic scale*
C4' `1:2 C4 Q1:1'
D4' `1:2 C4 Q9:8'
E4' `1:2 C4 Q5:4'
F4' `1:2 C4 Q4:3'
G4' `1:2 C4 Q3:2'
A4' `1:2 C4 Q5:3'
B4' `1:2 C4 Q15:8'
C5' `1:2 C4 Q2:1'

*triads of C major/A minor scale*
C4'`  E4'` G4' `1:2 C4  Q1:1'` Q5:4'` Q3:2' *tonic/mediant*
Dv4'` F4'` A4' `1:2 Dv4 Q1:1'` Q6:5'` Q3:2' *supertonic/subdominant*
E4'`  G4'` B4' `1:2 E4  Q1:1'` Q6:5'` Q3:2' *mediant/dominant*
F4'`  A4'` C5' `1:2 F4  Q1:1'` Q5:4'` Q3:2' *subdominant/submediant*
G4'`  B4'` D5' `1:2 G4  Q1:1'` Q5:4'` Q3:2' *dominant/subtonic*
A4'`  C5'` E5' `1:2 A4  Q1:1'` Q6:5'` Q3:2' *submediant/tonic*
B4'`  D5'` F5' `1:2 B4  Q1:1'` Q6:5'` Q64:45' *leading tone/supertonic*
C5'`  E5'` G5' `1:2 C5  Q1:1'` Q5:4'` Q3:2' *tonic/mediant*