11 changed files with 32 additions and 354 deletions
-
42Assets/device.txt
-
30Assets/notes.txt
-
104Assets/scales.txt
-
26Fingering.py
-
17add_device.py
-
2convert.py
-
39convert_to.py
-
13load_asset.py
-
75main.py
-
30scale.py
-
8temp.py
@ -1,42 +0,0 @@ |
|||
{ |
|||
"devices": { |
|||
"baritone": { |
|||
"fund": "A#|1", |
|||
"sys": "valves" |
|||
}, |
|||
"french_horn": { |
|||
"fund": "F|1", |
|||
"sys": "valves" |
|||
}, |
|||
"trombone": { |
|||
"fund": "A#|1", |
|||
"sys": "slide" |
|||
}, |
|||
"trumpet": { |
|||
"fund": "A#|2", |
|||
"sys": "valves" |
|||
}, |
|||
"tuba": { |
|||
"fund": "A#|0", |
|||
"sys": "valves" |
|||
} |
|||
}, |
|||
"slide": [ |
|||
"1", |
|||
"2", |
|||
"3", |
|||
"4", |
|||
"5", |
|||
"6", |
|||
"7" |
|||
], |
|||
"valves": [ |
|||
"0", |
|||
"2", |
|||
"1", |
|||
"1,2", |
|||
"2,3", |
|||
"1,3", |
|||
"1,2,3" |
|||
] |
|||
} |
|||
@ -1,30 +0,0 @@ |
|||
{ |
|||
"flats": [ |
|||
"C", |
|||
"D\u266d", |
|||
"D", |
|||
"E\u266d", |
|||
"E", |
|||
"F", |
|||
"G\u266d", |
|||
"G", |
|||
"A\u266d", |
|||
"A", |
|||
"B\u266d", |
|||
"B" |
|||
], |
|||
"sharps": [ |
|||
"C", |
|||
"C#", |
|||
"D", |
|||
"D#", |
|||
"E", |
|||
"F", |
|||
"F#", |
|||
"G", |
|||
"G#", |
|||
"A", |
|||
"A#", |
|||
"B" |
|||
] |
|||
} |
|||
@ -1,104 +0,0 @@ |
|||
[ |
|||
{ |
|||
"aeolian": 5, |
|||
"dominant": 4, |
|||
"dorian": 1, |
|||
"ionian": 0, |
|||
"locrian": 6, |
|||
"lydian": 3, |
|||
"major": 0, |
|||
"minor": 5, |
|||
"mixolydian": 4, |
|||
"pentatonic major": 8, |
|||
"pentatonic minor": 7, |
|||
"phrygian": 2 |
|||
}, |
|||
[ |
|||
[ |
|||
"C", |
|||
"D", |
|||
"E", |
|||
"F", |
|||
"G", |
|||
"A", |
|||
"B", |
|||
"C|1" |
|||
], |
|||
[ |
|||
"C", |
|||
"D", |
|||
"E\u266d", |
|||
"F", |
|||
"G", |
|||
"A", |
|||
"B\u266d", |
|||
"C|1" |
|||
], |
|||
[ |
|||
"C", |
|||
"D\u266d", |
|||
"E\u266d", |
|||
"F", |
|||
"G", |
|||
"A\u266d", |
|||
"B\u266d", |
|||
"C|1" |
|||
], |
|||
[ |
|||
"C", |
|||
"D", |
|||
"E", |
|||
"G\u266d", |
|||
"G", |
|||
"A", |
|||
"B", |
|||
"C|1" |
|||
], |
|||
[ |
|||
"C", |
|||
"D", |
|||
"E", |
|||
"F", |
|||
"G", |
|||
"A", |
|||
"B\u266d", |
|||
"C|1" |
|||
], |
|||
[ |
|||
"C", |
|||
"D", |
|||
"E\u266d", |
|||
"F", |
|||
"G", |
|||
"A\u266d", |
|||
"B\u266d", |
|||
"C|1" |
|||
], |
|||
[ |
|||
"C", |
|||
"D\u266d", |
|||
"E\u266d", |
|||
"F", |
|||
"G\u266d", |
|||
"A\u266d", |
|||
"B\u266d", |
|||
"C|1" |
|||
], |
|||
[ |
|||
"C", |
|||
"E\u266d", |
|||
"F", |
|||
"G", |
|||
"B\u266d", |
|||
"C|1" |
|||
], |
|||
[ |
|||
"C", |
|||
"E", |
|||
"F", |
|||
"G", |
|||
"B", |
|||
"C|1" |
|||
] |
|||
] |
|||
] |
|||
@ -1,26 +0,0 @@ |
|||
from load_asset import load |
|||
from math import log |
|||
import convert_to |
|||
device = load('device') |
|||
#cents between notes |
|||
def cents(f1,f2): |
|||
|
|||
return 1200*log(f1/f2,2) |
|||
|
|||
#fingering based off of valves or slide |
|||
def fingering(note,dev,_a = 440): |
|||
dev = device['devices'][dev] |
|||
fund = convert_to.frequency(convert_to.above_c(dev['fund'])) |
|||
sys = device[dev['sys']] |
|||
|
|||
f_note = convert_to.frequency(convert_to.above_c(note),a =_a) |
|||
n = int(f_note/fund) |
|||
t = abs(cents(f_note,n*fund)) |
|||
if t >= 31: |
|||
n += 1 |
|||
if n == 7: |
|||
n += 1 |
|||
try: |
|||
return sys[round(convert_to.frequency(n*fund,invert = True,a = _a)) - convert_to.above_c(note)] |
|||
except IndexError: |
|||
return 'Note too damn low' |
|||
@ -1,17 +0,0 @@ |
|||
|
|||
from load_asset import save,load |
|||
device = load('device') |
|||
|
|||
def add_device(name,fund,sys): |
|||
device['devices'][name] = {} |
|||
device['devices'][name]['fund'] = fund.upper() |
|||
device['devices'][name]['sys'] = sys |
|||
return None |
|||
t = '' |
|||
while t != 'exit': |
|||
t = t.split(' ') |
|||
if len(t) == 3: |
|||
add_device(*t) |
|||
t = input('(name fund sys) (or exit):') |
|||
|
|||
save(device,'device') |
|||
@ -0,0 +1,2 @@ |
|||
def above_c(n): |
|||
return 'go fuck yourself' |
|||
@ -1,39 +0,0 @@ |
|||
from load_asset import load |
|||
from math import log |
|||
notes = load('notes') |
|||
|
|||
#converts from above c0 to frequency in hertz or the inverse |
|||
def frequency(n,a = 440,invert = False): |
|||
c = a/(2**(57/12)) |
|||
if not invert: |
|||
return (2**(n/12))*c |
|||
else: |
|||
return 12 * log(n/c,2) |
|||
|
|||
#swaps from nn to above c or inverse |
|||
##def swap(n,notation): |
|||
|
|||
def notename(n,notation): |
|||
note = n%12 |
|||
octave = n//12 |
|||
if octave > 0: |
|||
return '{}|{}'.format(notes[notation][note],octave) |
|||
else: |
|||
return notes[notation][note] |
|||
|
|||
|
|||
def above_c(n): |
|||
n = n.upper().split('|') |
|||
if len(n) == 2: |
|||
octave = 12*int(n[1]) |
|||
else: |
|||
octave = 0 |
|||
note = n[0] |
|||
notation = 'sharps' if note[-1] == '#' else 'flats' |
|||
for i in range(12): |
|||
if notes[notation][i] == note: |
|||
return octave + i |
|||
## if n is int: |
|||
## return notename(n,notation): |
|||
## else: |
|||
|
|||
@ -1,13 +0,0 @@ |
|||
import os |
|||
import json |
|||
def load(asset): |
|||
direct = os.getcwd() |
|||
path = '{}{sep}Assets{sep}{}'.format(direct,asset + '.txt',**{'sep':os.sep}) |
|||
return json.loads(open(path,'r').read()) |
|||
def save(asset,asset_name): |
|||
direct = os.getcwd() |
|||
path = '{}{sep}Assets{sep}{}'.format(direct,asset_name + '.txt',**{'sep':os.sep}) |
|||
file = open(path,'w') |
|||
file.write(json.dumps(asset, sort_keys=True,indent=4, separators=(',', ': '))) |
|||
print('Saved as: {}'.format(asset_name)) |
|||
return |
|||
@ -1,75 +0,0 @@ |
|||
import convert_to |
|||
import load_asset |
|||
from Fingering import fingering |
|||
scales = load_asset.load('scales') |
|||
mod = False |
|||
#scales[0] = ailias,scales[1] = scales |
|||
|
|||
#adds scale with name |
|||
def add(ns,name): |
|||
new = scale(ns).transpose('c').notes |
|||
scales[1].append(new) |
|||
scales[0][name] = len(scales[1])-1 |
|||
load_asset.save(scales,'scales') |
|||
|
|||
#adds alternative name to scale |
|||
def alias(exist,con): |
|||
scale[0][con] = scale[0][exist] |
|||
load_asset.save(scales,'scales') |
|||
|
|||
#creates scale with specified starting note, type, and notation |
|||
def create(n,scale_type,notation = 'flats'): |
|||
return scale( |
|||
scales[1][ |
|||
scales[0][scale_type.lower()] |
|||
] |
|||
).transpose(n,notation) |
|||
|
|||
class scale: |
|||
#converts scale notes to above c0, in effect giving raw intervals from the start note |
|||
def normalize(self): |
|||
#ensures that the start note is the same as the end note. This affects the data returned by the .notes method |
|||
if convert_to.above_c(self.notes[0])%12 != convert_to.above_c(self.notes[-1])%12: |
|||
self.notes.append(self.notes[0]) |
|||
|
|||
#subtracts starting note from each note |
|||
start = convert_to.above_c(self.notes[0]) |
|||
note_list = list( |
|||
map( |
|||
lambda n: convert_to.above_c(n)-start, |
|||
self.notes |
|||
) |
|||
) |
|||
|
|||
#ensures scales are ascending |
|||
for i in range(len(note_list)-1): |
|||
while note_list[i] > note_list[i+1]: |
|||
note_list[i+1] += 12 |
|||
|
|||
return note_list |
|||
|
|||
#returns fingering with specified device |
|||
def fingers(self,d,tuning_a = 440): |
|||
return list( |
|||
map( |
|||
|
|||
lambda n: '{} ({})'.format(n,fingering(n,d,tuning_a)), |
|||
self.notes |
|||
|
|||
) |
|||
) |
|||
|
|||
#transposes scale to specified note |
|||
def transpose(self,n,notation = 'flats'): |
|||
n = convert_to.above_c(n) |
|||
return scale( |
|||
list( |
|||
map( |
|||
lambda m: convert_to.notename(m+n,notation), |
|||
self.intv |
|||
) |
|||
) |
|||
) |
|||
def __init__(self,notes): |
|||
self.notes = notes |
|||
self.intv = self.normalize() |
|||
@ -0,0 +1,30 @@ |
|||
from load_asset import load |
|||
scales = load('scales') |
|||
note_names = load('notes') |
|||
##def create(scale_type,root): |
|||
## |
|||
import convert |
|||
class scale: |
|||
|
|||
def __init__(self,*notes): |
|||
self.notes = scale.number(notes) |
|||
self.raw_intv = self.ri() |
|||
self.root = self.notes[0] |
|||
|
|||
#takes notes from notes to numbers |
|||
def number(notes): |
|||
print('ran') |
|||
return list(map(convert.above_c,notes)) |
|||
|
|||
#finds raw intervals |
|||
def ri(self): |
|||
notes = self.notes |
|||
return list(map(lambda x: x-notes[0],notes[1:])) |
|||
|
|||
#returns new scale with given root |
|||
def tanspose(self,n): |
|||
if type(n) != int: |
|||
n = above_c(n) |
|||
return scale(*list(map(lambda x: x+n,self.raw_intv))) |
|||
|
|||
#todo fingers method |
|||
@ -1,8 +0,0 @@ |
|||
from load_asset import save,load |
|||
valves = load('valves') |
|||
slide = load('slide') |
|||
device = {} |
|||
device['valves'] = valves |
|||
device['slide'] = slide |
|||
device['devices'] = {} |
|||
save(device,'device') |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue