2009-12-27 14 views
7

Sono confuso perché ci sono molti programmi. Ma sto guardando qualcosa del genere. Scriverò una melodia come "a4 c3 h3 a2" ecc. E poi voglio sentirlo. Qualcuno sa cosa sto cercando? grazie in anticipoCome posso creare una melodia? C'è qualche modulo sonoro?

+0

"h3"? Oltre alla h3, la tua notazione ricorda la notazione usata da lilypond. Cerca un'app lilypond-to-audio o lilypond-to-midi. –

+3

Ah, Ubicazione: Berlino. Come sospettavo. @Ewan: nella notazione musicale tedesca, è "cdefgah". "h" invece di (inglese/internazionale) "b". –

+1

Nitpick: come ho capito, "H" è in realtà che noi chiamiamo B flat - B (naturale) è ancora solo B. Il compositore Bach è stato in grado di utilizzare questo per codificare il suo nome in note in uno dei suoi pezzi. –

risposta

7

calcolare le frequenze dal nome della nota è facile. ogni mezza nota è 2^(1/12) di distanza dalla nota precedente, 440 Hz è A4.

se per caso siete su Windows, è possibile provare questo pezzo di codice, che gioca una canzone attraverso l'altoparlante 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) 

(si prega di notare che io sto usando python 3.x, è potrebbe essere necessario adattare alcune parti del codice per utilizzarlo su python 2.x.)

ho, a proposito, ho usato abcdefg come scala, ma sicuramente troverai il modo di usare h invece di b.

+0

NameError: nome globale 'nomi' non è definito – kame

+0

ooops, mi dispiace, questo è quello che succede quando non cancelli il tuo la sessione di Python prima del test. corretta ora! –

2

è possibile utilizzare qualsiasi libreria che produce uscita MIDI, in caso di .net io consiglierei quello creato da Stephen Toub da Microsoft (non riesce a trovare da dove l'ho preso, ma per google it.)

3

Un'opzione esterna è JFugue come shown here (con Groovy). Nota che dovresti usare Jython invece di Python, che si spera che rientri nei limiti come risposta.

Problemi correlati