From 2158849c5c44caf0c79380f4b134f189e4a62bd3 Mon Sep 17 00:00:00 2001 From: Matteo Date: Mon, 20 Nov 2017 18:08:55 +0000 Subject: [PATCH] initial commit --- Armonia.py | 25 ++ Prova_main.py | 62 ++++ README.txt | 44 +++ kostacivos/armonia.py | 38 +++ kostacivos/durata.py | 4 + kostacivos/evaluate.py | 5 + kostacivos/function_node.py | 72 +++++ kostacivos/kostacivos | 459 +++++++++++++++++++++++++++++ kostacivos/kostacivos.xmi | 459 +++++++++++++++++++++++++++++ kostacivos/linker.py | 5 + kostacivos/main.py | 20 ++ kostacivos/note.csv | 73 +++++ kostacivos/parser.py | 12 + kostacivos/player.py | 14 + kostacivos/scale.py | 44 +++ kostacivos/schemaKostacivosUML.png | Bin 0 -> 57095 bytes kostacivos/struttura.py | 38 +++ kostacivos/tempo.py | 4 + kostacivos/visit_superpotente.py | 121 ++++++++ kostacivos/volume.py | 4 + kostacivos/waveform.py | 4 + note.csv | 73 +++++ parser/syntax.py | 46 +++ test.py | 53 ++++ visit_superpotente.py | 71 +++++ 25 files changed, 1750 insertions(+) create mode 100644 Armonia.py create mode 100755 Prova_main.py create mode 100644 README.txt create mode 100644 kostacivos/armonia.py create mode 100644 kostacivos/durata.py create mode 100644 kostacivos/evaluate.py create mode 100644 kostacivos/function_node.py create mode 100644 kostacivos/kostacivos create mode 100644 kostacivos/kostacivos.xmi create mode 100644 kostacivos/linker.py create mode 100644 kostacivos/main.py create mode 100644 kostacivos/note.csv create mode 100644 kostacivos/parser.py create mode 100644 kostacivos/player.py create mode 100644 kostacivos/scale.py create mode 100644 kostacivos/schemaKostacivosUML.png create mode 100644 kostacivos/struttura.py create mode 100644 kostacivos/tempo.py create mode 100644 kostacivos/visit_superpotente.py create mode 100644 kostacivos/volume.py create mode 100644 kostacivos/waveform.py create mode 100644 note.csv create mode 100644 parser/syntax.py create mode 100755 test.py create mode 100644 visit_superpotente.py diff --git a/Armonia.py b/Armonia.py new file mode 100644 index 0000000..6f795cf --- /dev/null +++ b/Armonia.py @@ -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) + + diff --git a/Prova_main.py b/Prova_main.py new file mode 100755 index 0000000..410faab --- /dev/null +++ b/Prova_main.py @@ -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() diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..5c77900 --- /dev/null +++ b/README.txt @@ -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. diff --git a/kostacivos/armonia.py b/kostacivos/armonia.py new file mode 100644 index 0000000..56e99f6 --- /dev/null +++ b/kostacivos/armonia.py @@ -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) + + diff --git a/kostacivos/durata.py b/kostacivos/durata.py new file mode 100644 index 0000000..c9a335b --- /dev/null +++ b/kostacivos/durata.py @@ -0,0 +1,4 @@ +#!/usr/bin/env python3 + +class Durata(): + # TODO combiare la durata in fuzione di quello che si fa diff --git a/kostacivos/evaluate.py b/kostacivos/evaluate.py new file mode 100644 index 0000000..9c63632 --- /dev/null +++ b/kostacivos/evaluate.py @@ -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 diff --git a/kostacivos/function_node.py b/kostacivos/function_node.py new file mode 100644 index 0000000..e20571e --- /dev/null +++ b/kostacivos/function_node.py @@ -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()'), + } + diff --git a/kostacivos/kostacivos b/kostacivos/kostacivos new file mode 100644 index 0000000..811d995 --- /dev/null +++ b/kostacivos/kostacivos @@ -0,0 +1,459 @@ + + + + + umbrello uml modeller http://umbrello.kde.org + 1.6.10 + UnicodeUTF8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kostacivos/kostacivos.xmi b/kostacivos/kostacivos.xmi new file mode 100644 index 0000000..22052ae --- /dev/null +++ b/kostacivos/kostacivos.xmi @@ -0,0 +1,459 @@ + + + + + umbrello uml modeller http://umbrello.kde.org + 1.6.10 + UnicodeUTF8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kostacivos/linker.py b/kostacivos/linker.py new file mode 100644 index 0000000..c9726eb --- /dev/null +++ b/kostacivos/linker.py @@ -0,0 +1,5 @@ +#!/usr/bin/env python3 + +def linker(nodo): + # TODO uesto linker dovrebbe cercare i riferimenti e mandare + return nuovo_sorgente diff --git a/kostacivos/main.py b/kostacivos/main.py new file mode 100644 index 0000000..82462ba --- /dev/null +++ b/kostacivos/main.py @@ -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 + + diff --git a/kostacivos/note.csv b/kostacivos/note.csv new file mode 100644 index 0000000..212cc63 --- /dev/null +++ b/kostacivos/note.csv @@ -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 diff --git a/kostacivos/parser.py b/kostacivos/parser.py new file mode 100644 index 0000000..5fae5c9 --- /dev/null +++ b/kostacivos/parser.py @@ -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()) diff --git a/kostacivos/player.py b/kostacivos/player.py new file mode 100644 index 0000000..87abd8b --- /dev/null +++ b/kostacivos/player.py @@ -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() + diff --git a/kostacivos/scale.py b/kostacivos/scale.py new file mode 100644 index 0000000..52ad843 --- /dev/null +++ b/kostacivos/scale.py @@ -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] + + diff --git a/kostacivos/schemaKostacivosUML.png b/kostacivos/schemaKostacivosUML.png new file mode 100644 index 0000000000000000000000000000000000000000..25a8eff103c8333cf329e2babefe75aeb22f8399 GIT binary patch literal 57095 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 literal 0 HcmV?d00001 diff --git a/kostacivos/struttura.py b/kostacivos/struttura.py new file mode 100644 index 0000000..91dd989 --- /dev/null +++ b/kostacivos/struttura.py @@ -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 diff --git a/kostacivos/tempo.py b/kostacivos/tempo.py new file mode 100644 index 0000000..f236449 --- /dev/null +++ b/kostacivos/tempo.py @@ -0,0 +1,4 @@ +#!/usr/bin/env python3 + +class Tempo(): + # TODO combiare il tempo in fuzione di quello che si fa diff --git a/kostacivos/visit_superpotente.py b/kostacivos/visit_superpotente.py new file mode 100644 index 0000000..fc28cde --- /dev/null +++ b/kostacivos/visit_superpotente.py @@ -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) + diff --git a/kostacivos/volume.py b/kostacivos/volume.py new file mode 100644 index 0000000..8771ebc --- /dev/null +++ b/kostacivos/volume.py @@ -0,0 +1,4 @@ +#!/usr/bin/env python3 + +class Volume(): + # TODO combiare il volume in fuzione di quello che si fa diff --git a/kostacivos/waveform.py b/kostacivos/waveform.py new file mode 100644 index 0000000..7f7b034 --- /dev/null +++ b/kostacivos/waveform.py @@ -0,0 +1,4 @@ +#!/usr/bin/env python3 + +class Waveform(): + # TODO combiare le onde in fuzione di quello che si fa diff --git a/note.csv b/note.csv new file mode 100644 index 0000000..212cc63 --- /dev/null +++ b/note.csv @@ -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 diff --git a/parser/syntax.py b/parser/syntax.py new file mode 100644 index 0000000..3446c87 --- /dev/null +++ b/parser/syntax.py @@ -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 diff --git a/test.py b/test.py new file mode 100755 index 0000000..72569de --- /dev/null +++ b/test.py @@ -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() + diff --git a/visit_superpotente.py b/visit_superpotente.py new file mode 100644 index 0000000..8f9457c --- /dev/null +++ b/visit_superpotente.py @@ -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], + + +}