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
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
~ 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
$44100 O1
~ harmonic
N smooth 0.02
T pyth
@675
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'
C
T equal
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'
C4'` E4'` G4' `1:2 C4 +0'` +4'` +7'
D4'` F4'` A4' `1:2 D4 +0'` +3'` +7'
E4'` G4'` B4' `1:2 E4 +0'` +3'` +7'
F4'` A4'` C5' `1:2 F4 +0'` +4'` +7'
G4'` B4'` D5' `1:2 G4 +0'` +4'` +7'
A4'` C5'` E5' `1:2 A4 +0'` +3'` +7'
B4'` D5'` F5' `1:2 B4 +0'` +3'` +6'
C5'` E5'` G5' `1:2 C5 +0'` +4'` +7'
T pyth
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'
C4'` E4'` G4' `1:2 C4 Q1:1'` Q81:64'` Q3:2'
D4'` F4'` A4' `1:2 D4 Q1:1'` Q32:27'` Q3:2'
E4'` G4'` B4' `1:2 E4 Q1:1'` Q32:27'` Q3:2'
F4'` A4'` C5' `1:2 F4 Q1:1'` Q81:64'` Q3:2'
G4'` B4'` D5' `1:2 G4 Q1:1'` Q81:64'` Q3:2'
A4'` C5'` E5' `1:2 A4 Q1:1'` Q32:27'` Q3:2'
B4'` D5'` F5' `1:2 B4 Q1:1'` Q32:27'` Q1024:729'
C5'` E5'` G5' `1:2 C5 Q1:1'` Q81:64'` Q3:2'
T just
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'
C4'` E4'` G4' `1:2 C4 Q1:1'` Q5:4'` Q3:2'
Dv4'` F4'` A4' `1:2 Dv4 Q1:1'` Q6:5'` Q3:2'
E4'` G4'` B4' `1:2 E4 Q1:1'` Q6:5'` Q3:2'
F4'` A4'` C5' `1:2 F4 Q1:1'` Q5:4'` Q3:2'
G4'` B4'` D5' `1:2 G4 Q1:1'` Q5:4'` Q3:2'
A4'` C5'` E5' `1:2 A4 Q1:1'` Q6:5'` Q3:2'
B4'` D5'` F5' `1:2 B4 Q1:1'` Q6:5'` Q64:45'
C5'` E5'` G5' `1:2 C5 Q1:1'` Q5:4'` Q3:2'