2009-12-27 15 views
7

Estoy confundido porque hay muchos programas. Pero estoy buscando algo como esto. Escribiré una melodía como "a4 c3 h3 a2", etc. y luego quiero escuchar esto. ¿Alguien sabe lo que estoy buscando? gracias de antemano¿Cómo puedo crear una melodía? ¿Hay algún módulo de sonido?

+0

"h3"? Además del h3, tu notación se parece a la notación utilizada por lilypond. Busque una aplicación lilypond-to-audio o lilypond-to-midi. –

+3

Ah, ubicación: Berlín. Como sospechaba. @Ewan: en la notación musical alemana, es "cdefgah". "h" en lugar de (inglés/internacional) "b". –

+1

Nitpick: como yo lo entiendo, "H" es en realidad nosotros llamamos B plano - B (natural) sigue siendo solo B. El compositor Bach fue capaz de usar esto para codificar su nombre en notas en una de sus piezas. –

Respuesta

7

frecuencias de computación desde el nombre de la nota es fácil. cada media nota está a 2^(1/12) de distancia de la nota anterior, 440 Hz es A4.

si por casualidad está en Windows, puede probar este pedazo de código, que toca una canción a través del altavoz del PC:

import math 
import winsound 
import time 

labels = ['a','a#','b','c','c#','d','d#','e','f','f#','g','g#'] 
# name is the complete name of a note (label + octave). the parameter 
# n is the number of half-tone from A4 (e.g. D#1 is -42, A3 is -12, A5 is 12) 
name = lambda n: labels[n%len(labels)] + str(int((n+(9+4*12))/12)) 
# the frequency of a note. the parameter n is the number of half-tones 
# from a4, which has a frequency of 440Hz, and is our reference note. 
freq = lambda n: int(440*(math.pow(2,1/12)**n)) 

# a dictionnary associating note frequencies to note names 
notes = {name(n): freq(n) for n in range(-42,60)} 

# the period expressed in second, computed from a tempo in bpm 
period = lambda tempo: 1/(tempo/60) 

# play each note in sequence through the PC speaker at the given tempo 
def play(song, tempo): 
    for note in song.lower().split(): 
     if note in notes.keys(): 
      winsound.Beep(notes[note], int(period(tempo)*1000)) 
     else: 
      time.sleep(period(tempo)) 

# "au clair de la lune"!! 'r' is a rest 
play('c4 c4 C4 d4 e4 r d4 r c4 e4 d4 d4 c4 r r r ' 
     'c4 C4 c4 d4 e4 r d4 r c4 e4 d4 d4 c4 r r r ' 
     'd4 d4 d4 d4 A3 r a3 r d4 c4 B3 a3 g3 r r r ' 
     'c4 c4 c4 d4 e4 r d4 r c4 e4 d4 d4 c4 r r r ', 180) 

(tenga en cuenta que estoy utilizando 3.x Python, puede que tenga que adaptar alguna parte del código con el fin de usarlo en 2.x. pitón)

ho, por cierto, yo solía abcdefg como una escala, pero seguramente encontrará la manera de utilizar en lugar de hb.

+0

NameError: nombre global 'nombres' no está definido – kame

+0

ooops, lo siento. Eso es lo que sucede cuando no borras tu sesión de Python antes de la prueba. ¡Corregido ahora! –

2

se puede utilizar cualquier biblioteca que produce una salida MIDI, en el caso de .NET Me gustaría recomendar el creado por Stephen Toub de Microsoft (no puede encontrar desde donde lo tengo, pero Google para).

3

Una opción exterior es JFugue como shown here (con Groovy). Tenga en cuenta que usaría Jython en lugar de Python, que con suerte está dentro de los límites como respuesta.

Cuestiones relacionadas