/
f-modos.py
67 lines (48 loc) · 1.39 KB
/
f-modos.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#coding:utf-8
import math
import struct
import wave
from utils import rotate
raiz_doceava_de_dos = 2 ** (1.0/12)
actual = 220.0
frecuencias = [actual]
for i in range(50):
actual *= raiz_doceava_de_dos
frecuencias.append(actual)
TONO = 2
SEMITONO = 1
notas = []
modo = [TONO, TONO, SEMITONO, TONO, TONO, TONO, SEMITONO]
inicio = 0
# Existen 8 modos, se obtienen rotando los intervalos de la escala
for i in range(8):
actual = inicio
frecuencias_modo = [frecuencias[actual]]
for intervalo in modo:
actual += intervalo
frecuencias_modo.append(frecuencias[actual])
notas += frecuencias_modo
inicio += modo[0]
modo = rotate(modo)
muestras_por_segundo = 44100
duracion = 0.5
muestras_totales = duracion * muestras_por_segundo
muestras = []
for frecuencia in notas:
ciclos_por_muestra = frecuencia / muestras_por_segundo
incremento = 2 * math.pi * ciclos_por_muestra
fase = 0
for i in range(int(muestras_totales)):
muestra = math.sin(fase)
fase += incremento
muestras.append(muestra)
nombre_archivo = 'f.wav'
archivo = wave.open(nombre_archivo, 'w')
archivo.setparams((1, 2, muestras_por_segundo, 0, 'NONE', 'not compressed'))
valores = []
for muestra in muestras:
valor_bit = struct.pack('h', muestra * 32767)
valores.append(valor_bit)
valores_str = ''.join(valores)
archivo.writeframes(valores_str)
archivo.close()