I am confused because there are a lot of programms. But i am looking something like this. I will type a melody like "a4 c3 h3 a2" etc. and then i want to hear this. Does anybody know what i am looking for? thanks in advance
you could use any library that produces MIDI output, in case of .net I'd recommend the one created by Stephen Toub from Microsoft(can't find from where i got it, but google for it.)
Check this out: http://www.algorithm.co.il/blogs/index.php/pytuner/ It's a very similar projet and looks like a very decent reference.
computing frequencies from note name is easy. each half-note is 2^(1/12) away from the preceding note, 440 Hz is A4.
if by any chance you are on windows, you may try this piece of code, which plays a song through the PC speaker:
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 )
(please note that i am using python 3.x, you may need to adapt some part of the code in order to use it on python 2.x.)
ho, by the way, i used abcdefg
as a scale, but you will surely find the way to use h
instead of b
.
One outside option is JFugue as shown here (with Groovy). Note that you would use Jython instead of Python, which hopefully is within bounds as an answer.