initial commit
This commit is contained in:
parent
8b5ce065e0
commit
2158849c5c
25
Armonia.py
Normal file
25
Armonia.py
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
#contiene una classe che contiene i metodi per trovare tutte
|
||||||
|
#le armoniche data una frequenza
|
||||||
|
|
||||||
|
# E` necessaria una classe? Non ha neanche attributi...
|
||||||
|
def armonica(f, typeOf):
|
||||||
|
types = {"8_inf" : 1/2,
|
||||||
|
"2_maj" : 9/8,
|
||||||
|
"2_min" : 16/15,
|
||||||
|
"3_maj" : 5/4,
|
||||||
|
"3_min" : 6/5,
|
||||||
|
"4" : 4/3,
|
||||||
|
"4_rai" : 3/2,
|
||||||
|
"4_dec" : 64/45,
|
||||||
|
"5" : 3/2,
|
||||||
|
"6_maj" : 5/3,
|
||||||
|
"6_min" : 8/5,
|
||||||
|
"7_maj" : 15/8,
|
||||||
|
"7_min" : 9/5,
|
||||||
|
"8" : 2,
|
||||||
|
}
|
||||||
|
return f*types.get(typeOf)
|
||||||
|
|
||||||
|
|
62
Prova_main.py
Executable file
62
Prova_main.py
Executable file
|
@ -0,0 +1,62 @@
|
||||||
|
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
#prova di utilizzo di una classe per per produrre le note armoniche
|
||||||
|
#e per mappare il CSV che indica per ogni nota la sua frequenza naturale
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
import pyaudio
|
||||||
|
import csv
|
||||||
|
|
||||||
|
from Armonia import armonica
|
||||||
|
|
||||||
|
|
||||||
|
import csv
|
||||||
|
reader = csv.reader(open('note.csv', 'r'))
|
||||||
|
nota = {}
|
||||||
|
for rows in reader:
|
||||||
|
k, v = rows
|
||||||
|
nota[k] = float(v)
|
||||||
|
|
||||||
|
fr = 0
|
||||||
|
while nota.get(fr) == None:
|
||||||
|
fr = input("inserisci in MAIUSC il nome della nota di cui fare le armoniche,\ninserire anche l'ottava a cui appariene (2-7):")
|
||||||
|
|
||||||
|
f = float(nota.get(fr))
|
||||||
|
print(f)
|
||||||
|
|
||||||
|
duration = 0.6
|
||||||
|
fs = 44100
|
||||||
|
volume = 1.0
|
||||||
|
i = 0
|
||||||
|
# inizializzo questo oggetto pyaudio, parte sonora
|
||||||
|
p = pyaudio.PyAudio()
|
||||||
|
#ciclo in cui si fanno tutti gli accordi della frequenza data
|
||||||
|
while f<4200:
|
||||||
|
accordo_maggiore=[f, armonica(f, "3_maj"), armonica(f, "5")]
|
||||||
|
prima = (np.sin(2*np.pi*np.arange(fs*duration)*accordo_maggiore[0]/fs)).astype(np.float32)
|
||||||
|
terza = (np.sin(2*np.pi*np.arange(fs*duration)*accordo_maggiore[1]/fs)).astype(np.float32)
|
||||||
|
quinta = (np.sin(2*np.pi*np.arange(fs*duration)*accordo_maggiore[2]/fs)).astype(np.float32)
|
||||||
|
print('ACCORDO MAGGIORE', (accordo_maggiore[0], accordo_maggiore[1], accordo_maggiore[2]))
|
||||||
|
stream = p.open(format=pyaudio.paFloat32, channels=1, rate=fs, output=True)
|
||||||
|
stream.write(volume*prima)
|
||||||
|
stream.write(volume*terza)
|
||||||
|
stream.write(volume*quinta)
|
||||||
|
stream.stop_stream()
|
||||||
|
#ottava maggiore
|
||||||
|
f = f*2+0.15
|
||||||
|
|
||||||
|
while f>66:
|
||||||
|
f = f/2
|
||||||
|
accordo_maggiore=[f, armonica(f, "3_maj"), armonica(f, "5")]
|
||||||
|
quinta = (np.sin(2*np.pi*np.arange(fs*duration)*accordo_maggiore[2]/fs)).astype(np.float32)
|
||||||
|
terza = (np.sin(2*np.pi*np.arange(fs*duration)*accordo_maggiore[1]/fs)).astype(np.float32)
|
||||||
|
prima = (np.sin(2*np.pi*np.arange(fs*duration)*accordo_maggiore[0]/fs)).astype(np.float32)
|
||||||
|
print('ACCORDO MAGGIORE', (accordo_maggiore[2], accordo_maggiore[1], accordo_maggiore[0]))
|
||||||
|
stream = p.open(format=pyaudio.paFloat32, channels=1, rate=fs, output=True)
|
||||||
|
stream.write(volume*quinta)
|
||||||
|
stream.write(volume*terza)
|
||||||
|
stream.write(volume*prima)
|
||||||
|
stream.stop_stream()
|
||||||
|
|
||||||
|
stream.close()
|
||||||
|
p.terminate()
|
44
README.txt
Normal file
44
README.txt
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
Analisi dinamica del codice
|
||||||
|
- Isomorfismi sinestetici
|
||||||
|
Partendo dalla domanda "come si identifica un suono?"
|
||||||
|
si identificano quattro componenti. Ci si pone l'obiettivo
|
||||||
|
di scegliere come queste componenti possano essere
|
||||||
|
rappresentate dal codice. Una breve proposta di seguito/
|
||||||
|
|
||||||
|
+--------------------------------+
|
||||||
|
| SUONI CODICE |
|
||||||
|
| |
|
||||||
|
| timbro tipo di dato |
|
||||||
|
| altezza valore |
|
||||||
|
| velocita` ??? costante??? |
|
||||||
|
| durata elementi contenuti |
|
||||||
|
| |
|
||||||
|
| chiave classe |
|
||||||
|
| tempo metodo/funzione |
|
||||||
|
| pausa ??? |
|
||||||
|
+--------------------------------+
|
||||||
|
|
||||||
|
Problemi da risolvere:
|
||||||
|
- altezza: range troppo alti. In python ad esempio il valore int massimo
|
||||||
|
e` 9223372036854775807. Quindi non ha senso associare una nota
|
||||||
|
ad ogni possibile valore. Una soluzione puo` essere quella di
|
||||||
|
analizzare nel codice valori massimi e minimi che ogni variabile
|
||||||
|
puo` assumere con un dato input e creare un range usando quelle
|
||||||
|
come estremi.
|
||||||
|
Con i float il discorso si complica leggermente, ma per risolverlo
|
||||||
|
e` possibile stabilire quali siano
|
||||||
|
- maggior valore
|
||||||
|
- minor valore
|
||||||
|
- minimo scarto tra valori
|
||||||
|
e aggiustare la scala di conseguenza.
|
||||||
|
Con questo metodo si ottiene qualcosa di udibile sempre ma e` possibile
|
||||||
|
ottenere spesso qualcosa di non fedele (ad esempio, una variabile
|
||||||
|
intera che assume i valori 9223372036854775807 e 9223372036854775007
|
||||||
|
che rumore fa rispetto ad una che assume i valori 2 e 30?).
|
||||||
|
|
||||||
|
Durata: elementi contenuti
|
||||||
|
Dipende. Riempire un array di 100000 elementi a suonare impiega lo
|
||||||
|
stesso tempo di riempirne uno di 2?
|
||||||
|
NO! Ma uno da 100000 deve risultare secondo me ben piu` acelerato di
|
||||||
|
uno da due (direi massimo 10 volte di piu`).
|
||||||
|
Per calcolare l'acelerazione si fa tipo log2(n). Onesto.
|
38
kostacivos/armonia.py
Normal file
38
kostacivos/armonia.py
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
#contiene una classe che contiene i metodi per trovare tutte
|
||||||
|
#le armoniche data una frequenza
|
||||||
|
|
||||||
|
# E` necessaria una classe? Non ha neanche attributi...
|
||||||
|
class Armonia:
|
||||||
|
_types = {"8_inf" : 1/2,
|
||||||
|
"2_maj" : 9/8,
|
||||||
|
"2_min" : 16/15,
|
||||||
|
"3_maj" : 5/4,
|
||||||
|
"3_min" : 6/5,
|
||||||
|
"4" : 4/3,
|
||||||
|
"4_rai" : 3/2,
|
||||||
|
"4_dec" : 64/45,
|
||||||
|
"5" : 3/2,
|
||||||
|
"6_maj" : 5/3,
|
||||||
|
"6_min" : 8/5,
|
||||||
|
"7_maj" : 15/8,
|
||||||
|
"7_min" : 9/5,
|
||||||
|
"8" : 2,
|
||||||
|
}
|
||||||
|
#la funzione prende in input una nota e l'accordo che si vuole raggiungere e genera una nuova "nota"
|
||||||
|
def nota_armonica(f, typeOf):
|
||||||
|
return f*types.get(typeOf)
|
||||||
|
|
||||||
|
#definisce le note possibili che vengono usate dentro quella classe.
|
||||||
|
def armonia(self, nota):
|
||||||
|
accordo = []
|
||||||
|
pas = list(types.keys())
|
||||||
|
infima = nota
|
||||||
|
#questo ciclo cerca l'ottava piu' piccola udibile della nota passata
|
||||||
|
while infima > 66: infima = nota_armonica(infima, pas[0])
|
||||||
|
#vengono salvati in una lista tutte le armoniche di quella nota
|
||||||
|
while infima < 4200:
|
||||||
|
for i in pas[1:]:
|
||||||
|
accordo.append(nota_armonica(infima, i)
|
||||||
|
|
||||||
|
|
4
kostacivos/durata.py
Normal file
4
kostacivos/durata.py
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
class Durata():
|
||||||
|
# TODO combiare la durata in fuzione di quello che si fa
|
5
kostacivos/evaluate.py
Normal file
5
kostacivos/evaluate.py
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
class Evaluate():
|
||||||
|
# TODO deve avere delle funzioni che prendano in input pezzi del codice che devono essere eseguiti
|
||||||
|
# analisi dinamica del codice
|
72
kostacivos/function_node.py
Normal file
72
kostacivos/function_node.py
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# dictionary che raccoglie tutti i tipi che vengono parserati da ast e ne restituisce le funzioni che quel tipo deve eseguire
|
||||||
|
# tuple, contengono funzioni: cercare in prondita' o caricando valori foglia dell'albero, chiare le funzioni di traduttore musicale
|
||||||
|
class function_node():
|
||||||
|
typeOfNode = {
|
||||||
|
'ast.Num' : ('node.n',),
|
||||||
|
'ast.Str' : ('node.s',),
|
||||||
|
'ast.FormattedValues' : ('node.value',),
|
||||||
|
'ast.JoinedStr' : ('node.values',),
|
||||||
|
'ast.Bytes' : ('node.s',),
|
||||||
|
'ast.List' : ('node.elts',),
|
||||||
|
'ast.Tuple' : ('node.elts',),
|
||||||
|
'ast.Set' : ('node.elts',),
|
||||||
|
'ast.Dict' : ('node.keys',),
|
||||||
|
'ast.NameConstant' : ('node.value',),
|
||||||
|
'ast.Name' : ('node.id',),
|
||||||
|
'ast.Starred' : ('node.value',),
|
||||||
|
'ast.Expr' : ('node.value',),
|
||||||
|
'ast.UnaryOP' : ('node.operand',),
|
||||||
|
'ast.BinOp' : ('[node.left, node.right]',),
|
||||||
|
'ast.BoolOP' : ('[node.op, node.values]',),
|
||||||
|
'ast.Compare' : ('[node.left, node.ops, node.comparators]',),
|
||||||
|
'ast.Call' : ('[node.func, node.args, node.keywords]',),
|
||||||
|
'ast.keyword' : ('[node.arg, node.value]',),
|
||||||
|
'ast.ifExp' : ('[node.test, node.body, node.orelse]',),
|
||||||
|
'ast.Attribute' : ('[node.attr, node.value]',),
|
||||||
|
'ast.Subscript' : ('[node.slice, node.value]',),
|
||||||
|
'ast.Index' : ('node.value',),
|
||||||
|
'ast.Slice' : ('[node.lower, node.upper, node.step]',),
|
||||||
|
'ast.ExtSlice' : ('node.dims',),
|
||||||
|
'ast.ListCompe' : ('[node.generators, node.elt]',),
|
||||||
|
'ast.SetCompe' : ('[node.generators, node.elt]',),
|
||||||
|
'ast.GeneratorExp' : ('[node.generators, node.elt]',),
|
||||||
|
'ast.DictComp' : ('[node.key, node.value, node.generator]',),
|
||||||
|
'ast.comprehension' : ('[node.target, node.iter, node.ifs]',),
|
||||||
|
'ast.Assign' : ('[node.targets, node.value]',),
|
||||||
|
'ast.AnnAssign' : ('[node.targets, node.target, node.value, node.simple]',),
|
||||||
|
'ast.AugAssign' : ('[node.targets, node.op, node.value]',),
|
||||||
|
'ast.Print' : ('[node.dest, node.values]',),
|
||||||
|
'ast.Raise' : ('[node.exc, node.cause]',),
|
||||||
|
'ast.Assert' : ('[node.test, node.msg]',),
|
||||||
|
'ast.Delete' : ('node.targets',),
|
||||||
|
'ast.Import' : ('node.names',),
|
||||||
|
'ast.ImportFrom' : ('[node.module, node.names, node.level]',),
|
||||||
|
'ast.Alias' : ('node.name',),
|
||||||
|
'ast.If' : ('[node.test, node.body, node.orelse]',),
|
||||||
|
'ast.For' : ('[node.target, node.iter, node.body, node.orelse]',),
|
||||||
|
'ast.While' : ('[node.test, node.body, node.orelse]',),
|
||||||
|
'ast.Try' : ('[node.handlers, node.body, node.orelse, node.finalbody]',),
|
||||||
|
'ast.TryFinally' : ('[node.body, node.finalbody]',),
|
||||||
|
'ast.TryExcept' : ('[node.handlers, node.body, node.orelse]',),
|
||||||
|
'ast.ExceptHandler' : ('[node.type, node.name, node.body]',),
|
||||||
|
'ast.With' : ('[node.items, node.body]',),
|
||||||
|
'ast.withitem' : ('[node.context_expr]',),
|
||||||
|
'ast.FunctionDef' : ('[node.name, node.args, node.body, node.decorator_list]',),
|
||||||
|
'ast.Lambda' : ('[node.args, node.body]',),
|
||||||
|
'ast.arguments' : ('[node.args, node.default]',),
|
||||||
|
'ast.arg' : ('[node.arg, node.annotation]',),
|
||||||
|
'ast.Return' : ('node.value',),
|
||||||
|
'ast.Yield' : ('node.value',),
|
||||||
|
'ast.YieldFrom' : ('node.value',),
|
||||||
|
'ast.Global' : ('node.names',),
|
||||||
|
'ast.Nonlocal' : ('node.names',),
|
||||||
|
'ast.ClassDef' : ('[node.name, node.bases, node.keywords, node.starargs, node.body, , node.kwargs, node.decorator_list]','armonia(store.get_nota())'),
|
||||||
|
'ast.Await' : ('node.value',),
|
||||||
|
'ast.AsyncFunctionDef' : ('[node.name, node.args, node.body, node.decorator_list, node.returns]',),
|
||||||
|
'ast.AsyncFor' : ('[node.target, node.iter, node.body, node.orelse]',),
|
||||||
|
'ast.AsyncWith' : ('[node.items, node.body]',),
|
||||||
|
'ast.Module' : ('node.body', 'nota()'),
|
||||||
|
}
|
||||||
|
|
459
kostacivos/kostacivos
Normal file
459
kostacivos/kostacivos
Normal file
File diff suppressed because one or more lines are too long
459
kostacivos/kostacivos.xmi
Normal file
459
kostacivos/kostacivos.xmi
Normal file
File diff suppressed because one or more lines are too long
5
kostacivos/linker.py
Normal file
5
kostacivos/linker.py
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
def linker(nodo):
|
||||||
|
# TODO uesto linker dovrebbe cercare i riferimenti e mandare
|
||||||
|
return nuovo_sorgente
|
20
kostacivos/main.py
Normal file
20
kostacivos/main.py
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import parser
|
||||||
|
import z
|
||||||
|
import player
|
||||||
|
import struttura
|
||||||
|
from sys import argv
|
||||||
|
|
||||||
|
# Questo codice non funziona!
|
||||||
|
|
||||||
|
#def main():
|
||||||
|
f = open(argv[1], "r")
|
||||||
|
source = "".join(x for x in f.readlines())
|
||||||
|
nodo = parser.parser(source)
|
||||||
|
visitor = z()
|
||||||
|
visitor.visit(nodo)
|
||||||
|
# TODO mancano delle verifiche
|
||||||
|
return
|
||||||
|
|
||||||
|
|
73
kostacivos/note.csv
Normal file
73
kostacivos/note.csv
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
DO2, 66
|
||||||
|
DO#2, 70
|
||||||
|
RE2, 74
|
||||||
|
RE#2, 78
|
||||||
|
MI2, 83
|
||||||
|
FA2, 88
|
||||||
|
FA#2, 93
|
||||||
|
SOL2, 98
|
||||||
|
SOL#2, 104
|
||||||
|
LA2, 110
|
||||||
|
LA#2, 117
|
||||||
|
SI2, 124
|
||||||
|
DO3, 131
|
||||||
|
DO#3, 139
|
||||||
|
RE3, 147
|
||||||
|
RE#3, 156
|
||||||
|
MI3, 165
|
||||||
|
FA3, 175
|
||||||
|
FA#3, 185
|
||||||
|
SOL3, 196
|
||||||
|
SOL#3, 208
|
||||||
|
LA3, 220
|
||||||
|
LA#3, 233
|
||||||
|
SI3, 247
|
||||||
|
DO4, 262
|
||||||
|
DO#4, 277
|
||||||
|
RE4, 294
|
||||||
|
RE#4, 311
|
||||||
|
MI4, 330
|
||||||
|
FA4, 349
|
||||||
|
FA#4, 370
|
||||||
|
SOL4, 392
|
||||||
|
SOL#4, 415
|
||||||
|
LA4, 440
|
||||||
|
LA#4, 466
|
||||||
|
SI4, 494
|
||||||
|
DO5, 523
|
||||||
|
DO#5, 554
|
||||||
|
RE5, 587
|
||||||
|
RE#5, 622
|
||||||
|
MI5, 659
|
||||||
|
FA5, 698
|
||||||
|
FA#5, 740
|
||||||
|
SOL5, 784
|
||||||
|
SOL#5, 831
|
||||||
|
LA5, 880
|
||||||
|
LA#5, 932
|
||||||
|
SI5, 988
|
||||||
|
DO6, 1046
|
||||||
|
DO#6, 1109
|
||||||
|
RE6, 1175
|
||||||
|
RE#6, 1245
|
||||||
|
MI6, 1319
|
||||||
|
FA6, 1397
|
||||||
|
FA#6, 1480
|
||||||
|
SOL6, 1568
|
||||||
|
SOL#6, 1661
|
||||||
|
LA6, 1760
|
||||||
|
LA#6, 1865
|
||||||
|
SI6, 1976
|
||||||
|
DO7, 2093
|
||||||
|
DO#7, 2217
|
||||||
|
RE7, 2349
|
||||||
|
RE#7, 2489
|
||||||
|
MI7, 2637
|
||||||
|
FA7, 2794
|
||||||
|
FA#7, 2960
|
||||||
|
SOL7, 3136
|
||||||
|
SOL#7, 3322
|
||||||
|
LA7, 3520
|
||||||
|
LA#7, 3729
|
||||||
|
SI7, 3951
|
||||||
|
DO8, 4186
|
|
12
kostacivos/parser.py
Normal file
12
kostacivos/parser.py
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import parser
|
||||||
|
import ast
|
||||||
|
|
||||||
|
def parser(self, source):
|
||||||
|
tree = ast.parse(source)
|
||||||
|
return tree
|
||||||
|
|
||||||
|
def linker(self, node):
|
||||||
|
# e' da leggere il codice
|
||||||
|
#linker(source, glob())
|
14
kostacivos/player.py
Normal file
14
kostacivos/player.py
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import pyaudio
|
||||||
|
import struttura
|
||||||
|
|
||||||
|
def player(songa):
|
||||||
|
|
||||||
|
volume = songa.volume
|
||||||
|
onda = songa.waveform
|
||||||
|
p = pyaudio.PyAudio()
|
||||||
|
stream = p.open(format=pyaudio.paFloat32, channels=1, rate=fs, output=True)
|
||||||
|
stream.write(volume*onda)
|
||||||
|
stream.stop_stream()
|
||||||
|
|
44
kostacivos/scale.py
Normal file
44
kostacivos/scale.py
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# per il momento questa parte di codice e' di dubbia utilita'
|
||||||
|
# TODO
|
||||||
|
|
||||||
|
ACOUSTIC_SCALE = [0, 2, 4, 6, 7, 9, 10]
|
||||||
|
ADONAI_MALAKH = [0, 2, 4, 5, 7, 8, 10]
|
||||||
|
AEOLIAN_MODE = [0, 2, 3, 5, 7, 8, 10]
|
||||||
|
ALGERIAN_SCALE = [0, 2, 3, 6, 7, 8, 11]
|
||||||
|
ALTERED_SCALE = [0, 1, 3, 4, 6, 8, 10]
|
||||||
|
AUGMENTED_SCALE = [0, 3, 4, 7, 8, 11]
|
||||||
|
BEBOP_DOMINANT = [0, 2, 4, 5, 7, 9, 10, 11]
|
||||||
|
BLUES_SCALE = [0, 3, 5, 6, 7, 10]
|
||||||
|
DORIAN_MODE = [0, 2, 3, 5, 7, 9, 10]
|
||||||
|
DOUBLE_HARMONIC_SCALE = [0, 1, 4, 5, 7, 8, 11]
|
||||||
|
ENIGMATIC_SCALE = [0, 1, 4, 6, 8, 10, 11]
|
||||||
|
FLAMENCO_MODE = [0, 1, 4, 5, 7, 8, 11]
|
||||||
|
GYPSY_SCALE = [0, 2, 3, 6, 7, 8, 10]
|
||||||
|
HALF_DIMINISHED_SCALE = [0, 2, 3, 5, 6, 8, 10]
|
||||||
|
HARMONIC_MAJOR_SCALE = [0, 2, 4, 5, 7, 8, 11]
|
||||||
|
HARMONIC_MINOR_SCALE = [0, 2, 3, 5, 7, 8, 11]
|
||||||
|
HIRAJOSHI_SCALE = [0, 4, 6, 7, 11]
|
||||||
|
HUNGARIAN_GYPSY_SCALE = [0, 2, 3, 6, 7, 8, 11]
|
||||||
|
INSEN_SCALE = [0, 1, 5, 7, 10]
|
||||||
|
IONIAN_MODE = [0, 2, 4, 5, 7, 9, 11]
|
||||||
|
IWATO_SCALE = [0, 1, 5, 6, 11]
|
||||||
|
LOCRIAN_MODE = [0, 1, 3, 5, 6, 8, 10]
|
||||||
|
LYDIAN_AUGMENTED_SCALE = [0, 2, 4, 6, 8, 9, 11]
|
||||||
|
LYDIAN_MODE = [0, 2, 4, 6, 7, 9, 11]
|
||||||
|
MAJOR_LOCRIAN = [0, 2, 4, 5, 6, 8, 10]
|
||||||
|
MELODIC_MINOR_SCALE = [0, 2, 3, 5, 7, 9, 11]
|
||||||
|
MIXOLYDIAN_MODE = [0, 2, 4, 5, 7, 9, 10]
|
||||||
|
NEAPOLITAN_MAJOR_SCALE = [0, 1, 3, 5, 7, 9, 11]
|
||||||
|
NEAPOLITAN_MINOR_SCALE = [0, 1, 3, 5, 7, 8, 11]
|
||||||
|
PERSIAN_SCALE = [0, 1, 4, 5, 6, 8, 11]
|
||||||
|
PHRYGIAN_MODE = [0, 1, 3, 5, 7, 8, 10]
|
||||||
|
PROMETHEUS_SCALE = [0, 2, 4, 6, 9, 10]
|
||||||
|
TRITONE_SCALE = [0, 1, 4, 6, 7, 10]
|
||||||
|
UKRAINIAN_DORIAN_SCALE = [0, 2, 3, 6, 7, 9, 10]
|
||||||
|
WHOLE_TONE_SCALE = [0, 2, 4, 6, 8, 10]
|
||||||
|
MAJOR = [0, 2, 4, 5, 7, 9, 11]
|
||||||
|
MINOR = [0, 2, 3, 5, 7, 8, 10]
|
||||||
|
|
||||||
|
|
BIN
kostacivos/schemaKostacivosUML.png
Normal file
BIN
kostacivos/schemaKostacivosUML.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 56 KiB |
38
kostacivos/struttura.py
Normal file
38
kostacivos/struttura.py
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# getter e setter delle variabili sonore
|
||||||
|
|
||||||
|
class stuttura():
|
||||||
|
nota = 0
|
||||||
|
accordo = []
|
||||||
|
waveform = []
|
||||||
|
tempo = 0
|
||||||
|
volume = 0
|
||||||
|
scala = []
|
||||||
|
|
||||||
|
def get_nota():
|
||||||
|
return nota
|
||||||
|
def get_accordo():
|
||||||
|
return accordo
|
||||||
|
def get_tempo():
|
||||||
|
return tempo
|
||||||
|
def get_waveform():
|
||||||
|
return waveform
|
||||||
|
def get_volume():
|
||||||
|
return volume
|
||||||
|
def get_scala():
|
||||||
|
return scala
|
||||||
|
|
||||||
|
def set_nota(self, nota):
|
||||||
|
return nota
|
||||||
|
def set_accordo(self, accordo):
|
||||||
|
return accordo
|
||||||
|
def set_tempo(self, tempo):
|
||||||
|
self.tempo = tempo
|
||||||
|
def set_waveform(self, waveform):
|
||||||
|
self.waveform = waveform
|
||||||
|
def set_volume(self, volume):
|
||||||
|
self.volume = volume
|
||||||
|
def set_scala( scala):
|
||||||
|
self.scala = scala
|
4
kostacivos/tempo.py
Normal file
4
kostacivos/tempo.py
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
class Tempo():
|
||||||
|
# TODO combiare il tempo in fuzione di quello che si fa
|
121
kostacivos/visit_superpotente.py
Normal file
121
kostacivos/visit_superpotente.py
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
import ast
|
||||||
|
import re
|
||||||
|
from Note import nota
|
||||||
|
from Armonia import armonia
|
||||||
|
import struttura
|
||||||
|
|
||||||
|
store = struttura()
|
||||||
|
|
||||||
|
# dictionary che raccoglie tutti i tipi che vengono parserati da ast e ne restituisce le funzioni che quel tipo deve eseguire
|
||||||
|
# tuple, contengono funzioni: cercare in prondita' o caricando valori foglia dell'albero, chiare le funzioni di traduttore musicale
|
||||||
|
typeOfNode = {
|
||||||
|
'ast.Num' : ('node.n',),
|
||||||
|
'ast.Str' : ('node.s',),
|
||||||
|
'ast.FormattedValues' : ('node.value',),
|
||||||
|
'ast.JoinedStr' : ('node.values',),
|
||||||
|
'ast.Bytes' : ('node.s',),
|
||||||
|
'ast.List' : ('node.elts',),
|
||||||
|
'ast.Tuple' : ('node.elts',),
|
||||||
|
'ast.Set' : ('node.elts',),
|
||||||
|
'ast.Dict' : ('node.keys',),
|
||||||
|
'ast.NameConstant' : ('node.value',),
|
||||||
|
'ast.Name' : ('node.id',),
|
||||||
|
'ast.Starred' : ('node.value',),
|
||||||
|
'ast.Expr' : ('node.value',),
|
||||||
|
'ast.UnaryOP' : ('node.operand',),
|
||||||
|
'ast.BinOp' : ('[node.left, node.right]',),
|
||||||
|
'ast.BoolOP' : ('[node.op, node.values]',),
|
||||||
|
'ast.Compare' : ('[node.left, node.ops, node.comparators]',),
|
||||||
|
'ast.Call' : ('[node.func, node.args, node.keywords]',),
|
||||||
|
'ast.keyword' : ('[node.arg, node.value]',),
|
||||||
|
'ast.ifExp' : ('[node.test, node.body, node.orelse]',),
|
||||||
|
'ast.Attribute' : ('[node.attr, node.value]',),
|
||||||
|
'ast.Subscript' : ('[node.slice, node.value]',),
|
||||||
|
'ast.Index' : ('node.value',),
|
||||||
|
'ast.Slice' : ('[node.lower, node.upper, node.step]',),
|
||||||
|
'ast.ExtSlice' : ('node.dims',),
|
||||||
|
'ast.ListCompe' : ('[node.generators, node.elt]',),
|
||||||
|
'ast.SetCompe' : ('[node.generators, node.elt]',),
|
||||||
|
'ast.GeneratorExp' : ('[node.generators, node.elt]',),
|
||||||
|
'ast.DictComp' : ('[node.key, node.value, node.generator]',),
|
||||||
|
'ast.comprehension' : ('[node.target, node.iter, node.ifs]',),
|
||||||
|
'ast.Assign' : ('[node.targets, node.value]',),
|
||||||
|
'ast.AnnAssign' : ('[node.targets, node.target, node.value, node.simple]',),
|
||||||
|
'ast.AugAssign' : ('[node.targets, node.op, node.value]',),
|
||||||
|
'ast.Print' : ('[node.dest, node.values]',),
|
||||||
|
'ast.Raise' : ('[node.exc, node.cause]',),
|
||||||
|
'ast.Assert' : ('[node.test, node.msg]',),
|
||||||
|
'ast.Delete' : ('node.targets',),
|
||||||
|
'ast.Import' : ('node.names',),
|
||||||
|
'ast.ImportFrom' : ('[node.module, node.names, node.level]',),
|
||||||
|
'ast.Alias' : ('node.name',),
|
||||||
|
'ast.If' : ('[node.test, node.body, node.orelse]',),
|
||||||
|
'ast.For' : ('[node.target, node.iter, node.body, node.orelse]',),
|
||||||
|
'ast.While' : ('[node.test, node.body, node.orelse]',),
|
||||||
|
'ast.Try' : ('[node.handlers, node.body, node.orelse, node.finalbody]',),
|
||||||
|
'ast.TryFinally' : ('[node.body, node.finalbody]',),
|
||||||
|
'ast.TryExcept' : ('[node.handlers, node.body, node.orelse]',),
|
||||||
|
'ast.ExceptHandler' : ('[node.type, node.name, node.body]',),
|
||||||
|
'ast.With' : ('[node.items, node.body]',),
|
||||||
|
'ast.withitem' : ('[node.context_expr]',),
|
||||||
|
'ast.FunctionDef' : ('[node.name, node.args, node.body, node.decorator_list]',),
|
||||||
|
'ast.Lambda' : ('[node.args, node.body]',),
|
||||||
|
'ast.arguments' : ('[node.args, node.default]',),
|
||||||
|
'ast.arg' : ('[node.arg, node.annotation]',),
|
||||||
|
'ast.Return' : ('node.value',),
|
||||||
|
'ast.Yield' : ('node.value',),
|
||||||
|
'ast.YieldFrom' : ('node.value',),
|
||||||
|
'ast.Global' : ('node.names',),
|
||||||
|
'ast.Nonlocal' : ('node.names',),
|
||||||
|
'ast.ClassDef' : ('[node.name, node.bases, node.keywords, node.starargs, node.body, , node.kwargs, node.decorator_list]','armonia(store.get_nota())'),
|
||||||
|
'ast.Await' : ('node.value',),
|
||||||
|
'ast.AsyncFunctionDef' : ('[node.name, node.args, node.body, node.decorator_list, node.returns]',),
|
||||||
|
'ast.AsyncFor' : ('[node.target, node.iter, node.body, node.orelse]',),
|
||||||
|
'ast.AsyncWith' : ('[node.items, node.body]',),
|
||||||
|
'ast.Module' : ('node.body', 'nota()'),
|
||||||
|
}
|
||||||
|
|
||||||
|
# visitatore padre che cerca funzioni di tipo nodo
|
||||||
|
class v(ast.NodeVisitor):
|
||||||
|
def generic_visit(self, node):
|
||||||
|
print (type(node).__name__)
|
||||||
|
ast.NodeVisitor.generic_visit(self, node)
|
||||||
|
|
||||||
|
# visitatore figlio, dato un nodo percorre tutto l'albero
|
||||||
|
# esegue anche le funzioni di traduzione assegnate ad ogni nodo
|
||||||
|
class z(v):
|
||||||
|
import ast
|
||||||
|
def visit(self, node):
|
||||||
|
a = 0
|
||||||
|
funzione = 0
|
||||||
|
for i in typeOfNode:
|
||||||
|
if re.match(i, str(type(node))[9:]):
|
||||||
|
print (type(node), typeOfNode.get(i))
|
||||||
|
locals()
|
||||||
|
a = eval(typeOfNode.get(i)[0], locals())
|
||||||
|
try:
|
||||||
|
funzione = eval(typeOfNode.get(i)[1], locals(), globals())
|
||||||
|
print (funzione)
|
||||||
|
except: pass
|
||||||
|
l = z()
|
||||||
|
print (typeOfNode.get(i)[0]+'\n')
|
||||||
|
try:
|
||||||
|
print (type(a))
|
||||||
|
for i in a:
|
||||||
|
if type(i) == list:
|
||||||
|
for j in i:
|
||||||
|
l.visit(j)
|
||||||
|
else :
|
||||||
|
l.visit(i)
|
||||||
|
except:
|
||||||
|
try:
|
||||||
|
if re.match('ast', str(type(a))[9:]):
|
||||||
|
l.visit(a)
|
||||||
|
else:
|
||||||
|
print(a)
|
||||||
|
except: print ('---------------------> Pass'),
|
||||||
|
return a
|
||||||
|
|
||||||
|
a = z()
|
||||||
|
g = a.visit(tree01)
|
||||||
|
|
4
kostacivos/volume.py
Normal file
4
kostacivos/volume.py
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
class Volume():
|
||||||
|
# TODO combiare il volume in fuzione di quello che si fa
|
4
kostacivos/waveform.py
Normal file
4
kostacivos/waveform.py
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
class Waveform():
|
||||||
|
# TODO combiare le onde in fuzione di quello che si fa
|
73
note.csv
Normal file
73
note.csv
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
DO2, 66
|
||||||
|
DO#2, 70
|
||||||
|
RE2, 74
|
||||||
|
RE#2, 78
|
||||||
|
MI2, 83
|
||||||
|
FA2, 88
|
||||||
|
FA#2, 93
|
||||||
|
SOL2, 98
|
||||||
|
SOL#2, 104
|
||||||
|
LA2, 110
|
||||||
|
LA#2, 117
|
||||||
|
SI2, 124
|
||||||
|
DO3, 131
|
||||||
|
DO#3, 139
|
||||||
|
RE3, 147
|
||||||
|
RE#3, 156
|
||||||
|
MI3, 165
|
||||||
|
FA3, 175
|
||||||
|
FA#3, 185
|
||||||
|
SOL3, 196
|
||||||
|
SOL#3, 208
|
||||||
|
LA3, 220
|
||||||
|
LA#3, 233
|
||||||
|
SI3, 247
|
||||||
|
DO4, 262
|
||||||
|
DO#4, 277
|
||||||
|
RE4, 294
|
||||||
|
RE#4, 311
|
||||||
|
MI4, 330
|
||||||
|
FA4, 349
|
||||||
|
FA#4, 370
|
||||||
|
SOL4, 392
|
||||||
|
SOL#4, 415
|
||||||
|
LA4, 440
|
||||||
|
LA#4, 466
|
||||||
|
SI4, 494
|
||||||
|
DO5, 523
|
||||||
|
DO#5, 554
|
||||||
|
RE5, 587
|
||||||
|
RE#5, 622
|
||||||
|
MI5, 659
|
||||||
|
FA5, 698
|
||||||
|
FA#5, 740
|
||||||
|
SOL5, 784
|
||||||
|
SOL#5, 831
|
||||||
|
LA5, 880
|
||||||
|
LA#5, 932
|
||||||
|
SI5, 988
|
||||||
|
DO6, 1046
|
||||||
|
DO#6, 1109
|
||||||
|
RE6, 1175
|
||||||
|
RE#6, 1245
|
||||||
|
MI6, 1319
|
||||||
|
FA6, 1397
|
||||||
|
FA#6, 1480
|
||||||
|
SOL6, 1568
|
||||||
|
SOL#6, 1661
|
||||||
|
LA6, 1760
|
||||||
|
LA#6, 1865
|
||||||
|
SI6, 1976
|
||||||
|
DO7, 2093
|
||||||
|
DO#7, 2217
|
||||||
|
RE7, 2349
|
||||||
|
RE#7, 2489
|
||||||
|
MI7, 2637
|
||||||
|
FA7, 2794
|
||||||
|
FA#7, 2960
|
||||||
|
SOL7, 3136
|
||||||
|
SOL#7, 3322
|
||||||
|
LA7, 3520
|
||||||
|
LA#7, 3729
|
||||||
|
SI7, 3951
|
||||||
|
DO8, 4186
|
|
46
parser/syntax.py
Normal file
46
parser/syntax.py
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
import json
|
||||||
|
import parser
|
||||||
|
import ast
|
||||||
|
from sys import argv
|
||||||
|
|
||||||
|
|
||||||
|
#f = open(argv[1], "r")
|
||||||
|
f = open("../test.py", "r")
|
||||||
|
source = "".join(x for x in f.readlines())
|
||||||
|
#print(parser.suite(source).tolist())
|
||||||
|
tree = ast.parse(source)
|
||||||
|
#print(ast.dump(tree))
|
||||||
|
|
||||||
|
#class Tree(ast.NodeTransformer):
|
||||||
|
# def __init__(self, source):
|
||||||
|
# r = ast.parse(source)
|
||||||
|
# self.visit(r)
|
||||||
|
# def vist_Str(self, node):
|
||||||
|
# print(ast.Str(node.body))
|
||||||
|
|
||||||
|
a = ast.parse(source)
|
||||||
|
#Tree().vist_Str(a)
|
||||||
|
def nodes(parsed_source):
|
||||||
|
r = []
|
||||||
|
for i in ast.walk(parsed_source):
|
||||||
|
r.append(i)
|
||||||
|
return r
|
||||||
|
#print(nodes(a))
|
||||||
|
f = open("../test.py", "r")
|
||||||
|
linee = f.readlines()
|
||||||
|
|
||||||
|
# da completare sta puttanata dello strip
|
||||||
|
#for i in linee:
|
||||||
|
# i = i.rstrip()
|
||||||
|
|
||||||
|
for i in ast.walk(a):
|
||||||
|
try:
|
||||||
|
print(str(i.lineno-1) + " " + linee[i.lineno-1])
|
||||||
|
except:
|
||||||
|
print("SALTATA" + " " + str(i))
|
||||||
|
|
||||||
|
# Divagazioni notturne importanti
|
||||||
|
# Ecco come funziona Visitor
|
||||||
|
my_visit = ast.NodeVisitor()
|
||||||
|
print(my_visit.visit(a))
|
||||||
|
# peccato non stampi nulla
|
53
test.py
Executable file
53
test.py
Executable file
|
@ -0,0 +1,53 @@
|
||||||
|
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# Semplice file per far vedere come possono essere
|
||||||
|
# regolate altezza,intensita`, durata, e timbro
|
||||||
|
# di un suono tramite pyaudio
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
import pyaudio
|
||||||
|
|
||||||
|
from Armonia import armonica
|
||||||
|
|
||||||
|
# dati per l'inizializzazione dell'onda
|
||||||
|
duration = 2.0
|
||||||
|
fs = 44100
|
||||||
|
volume = 1.0
|
||||||
|
# frequenza la 66 Hz il DO piu' basso udibile
|
||||||
|
f = 66.0
|
||||||
|
i=0
|
||||||
|
nota = armonica(f, "5")
|
||||||
|
while i<7:
|
||||||
|
# inizializzo questo oggetto pyaudio
|
||||||
|
p = pyaudio.PyAudio()
|
||||||
|
# onda sinusoidale, non so bene perche` e` da fare cosi`
|
||||||
|
prima = (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32)
|
||||||
|
print(prima)
|
||||||
|
stream = p.open(format=pyaudio.paFloat32, channels=1, rate=fs, output=True)
|
||||||
|
# riproduce lo stream al volume impostato
|
||||||
|
stream.write(volume*prima)
|
||||||
|
stream.stop_stream()
|
||||||
|
# genera la quinta nota armonica naturale della nota di partenza
|
||||||
|
h = armonica(f, "3_maj")
|
||||||
|
p = pyaudio.PyAudio()
|
||||||
|
terza = (np.sin(2*np.pi*np.arange(fs*duration)*h/fs)).astype(np.float32)
|
||||||
|
print(terza)
|
||||||
|
stream = p.open(format=pyaudio.paFloat32, channels=1, rate=fs, output=True)
|
||||||
|
stream.write(volume*terza)
|
||||||
|
stream.stop_stream()
|
||||||
|
# genera la terza nota armonica naturale della nota di partenza
|
||||||
|
g = armonica(f, "5")
|
||||||
|
p = pyaudio.PyAudio()
|
||||||
|
quinta = (np.sin(2*np.pi*np.arange(fs*duration)*g/fs)).astype(np.float32)
|
||||||
|
print(quinta)
|
||||||
|
stream = p.open(format=pyaudio.paFloat32, channels=1, rate=fs, output=True)
|
||||||
|
stream.write(volume*quinta)
|
||||||
|
stream.stop_stream()
|
||||||
|
# passa alla prossima ottava
|
||||||
|
f=f*2-1+i
|
||||||
|
i=i+1
|
||||||
|
|
||||||
|
|
||||||
|
stream.close()
|
||||||
|
p.terminate()
|
||||||
|
|
71
visit_superpotente.py
Normal file
71
visit_superpotente.py
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
import ast
|
||||||
|
arm = open("Armonia.py")
|
||||||
|
source02 = "".join(x for x in arm.readlines())
|
||||||
|
tree02 = ast.parse(source02)
|
||||||
|
t = open("test.py")
|
||||||
|
source = "".join(x for x in t.readlines())
|
||||||
|
tree = ast.parse(source)
|
||||||
|
p = open("Prova_main.py")
|
||||||
|
source01 = "".join(x for x in p.readlines())
|
||||||
|
tree01 = ast.parse(source01)
|
||||||
|
|
||||||
|
ast.dump(tree01, annotate_fields = False)
|
||||||
|
|
||||||
|
def visitor_pers(self, node):
|
||||||
|
typeOfNode = { ast.Num : node.n,
|
||||||
|
ast.Str : node.s,
|
||||||
|
ast.FormattedValues : node.value,
|
||||||
|
ast.JoinedStr : node.values,
|
||||||
|
ast.Bytes : node.s,
|
||||||
|
ast.List : node.elts,
|
||||||
|
ast.Tuple : node.elts,
|
||||||
|
ast.Set : node.elts,
|
||||||
|
ast.Dict : node.keys,
|
||||||
|
ast.NameConstant : node.value,
|
||||||
|
ast.Name : node.id,
|
||||||
|
ast.Starred : node.value,
|
||||||
|
ast.Expr : node.value,
|
||||||
|
ast.UnaryOP : node.operand,
|
||||||
|
ast.BinOp : [node.left, node.right],
|
||||||
|
ast.BoolOP : node.values,
|
||||||
|
ast.Compare : [node.left, node.comparators],
|
||||||
|
ast.Call : node.args,
|
||||||
|
ast.keyword : [node.arg, node.value],
|
||||||
|
ast.ifExp : node.body,
|
||||||
|
ast.Attribute : [node.attr, node.value],
|
||||||
|
ast.Subscript : node.value,
|
||||||
|
ast.Index : node.value,
|
||||||
|
ast.Slice : [node.lower, node.upper],
|
||||||
|
ast.ExtSlice : node.dimis,
|
||||||
|
ast.ListCompe : [node.generators, node.elt],
|
||||||
|
ast.SetCompe : [node.generators, node.elt],
|
||||||
|
ast.GeneratorExp : [node.generators, node.elt],
|
||||||
|
ast.DictComp : [node.key, node.value, node.elt],
|
||||||
|
ast.comprehension : [node.target, node.iter],
|
||||||
|
ast.Assign : [node.targets, node.value],
|
||||||
|
ast.AnnAssign : [node.targets, node.value, node.simple],
|
||||||
|
ast.AugAssign : [node.targets, node.value],
|
||||||
|
ast.Print : [node.dest, node.values],
|
||||||
|
ast.Raise : [node.exce, node.cause],
|
||||||
|
ast.Assert : [node.test, node.msg],
|
||||||
|
ast.Delete : node.targets,
|
||||||
|
ast.Import : node.names,
|
||||||
|
ast.ImportFrom : [node.module, node.names],
|
||||||
|
ast.Alias : node.name,
|
||||||
|
ast.Assign : [node.targets, node.value],
|
||||||
|
ast.If : [node.test, node.body, node.orelse],
|
||||||
|
ast.For : [node.target, node.iter, node.body, node.orelse],
|
||||||
|
ast.While : [node.test, node.body, node.orelse],
|
||||||
|
ast.Try : [node.handlers, node.body, node.orelse, node.finalbody],
|
||||||
|
ast.TryFinally : [node.body, node.finalbody],
|
||||||
|
ast.TryExcept : [node.handlers, node.body, node.orelse],
|
||||||
|
ast.ExceptHandler : [node.type, node.name, node.body}
|
||||||
|
ast.With : [node.items, node.body],
|
||||||
|
ast.withitem : [node.context_expr],
|
||||||
|
ast.FunctionDef : [node.name, node.args, node.body],
|
||||||
|
ast.Lambda : [node.args, node.body],
|
||||||
|
ast.arguments : [node.args, node.default],
|
||||||
|
ast.arg : [node.items, node.body],
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user