2013-10-29 21 views
5

Sto lavorando a un'applicazione che converte accordi di chitarra in accordi banjo e mentre sto creando gli oggetti, mi piacerebbe anche creare una sorta di "stampa" audio "Questo suona velocemente l'accordo che ho tabulato/scritto.Riproduzione di suoni in streaming in python da frequenza, accordi

Mi trovo molto confuso su come riprodurre più suoni simultaneamente usando Python senza alcun tipo di missaggio, o l'inclusione di tutti i pygame, o la scrittura su file.

Quello che sto cercando è qualcosa che può ...

  1. frequenze prendere - come 440 per produrre una A, 880 per la produzione di un'ottava di che --- come un iterabile
  2. Suonali senza scrivere sul disco, magari attraverso uno strumento midi.

mi hanno funzioni in atto in grado di convertire da tasti a frequenze, dato accordature dello strumento, e sulla base di quelli, mi piacerebbe dire:

fretboard.play([440, 880]) 

e sentire i toni. O se potessi specificare il tempo ...

fretboard.play([(440,1), (880,1)]) 

sentire ogni simultaneamente per un secondo.

Qual è l'approccio migliore per ottenere questo tipo di suono in modo semplice e, si spera, in un modo che mi consenta di sequenziare molti di questi se volessi creare alcune melodie primitive?

Inoltre, se questo è solo un tipo completamente diverso di programmazione e se sembra che la mia domanda sia ingenua ("Ehi mittenchops, hai bisogno di saperne di più sui canali!"), Per favore fammi sapere, soprattutto se puoi indirizzarmi verso buone risorse di apprendimento

risposta

1

Mentre cercavo l'analisi del suono per Python in precedenza, mi sono imbattuto in questo sito PythonInMusic, che ha un sacco di collegamenti software musicali per Python.

Ripensandoci, penso che la prima cosa che cercherò di utilizzare per generare note midi in tempo reale è chiamata PyFluidSynth. È un synth midi per python. Ecco alcuni esempi di codice dal loro sito:

import time 
import fluidsynth 

fs = fluidsynth.Synth() 
fs.start() 

sfid = fs.sfload("example.sf2") 
fs.program_select(0, sfid, 0, 0) 

fs.noteon(0, 60, 30) 
fs.noteon(0, 67, 30) 
fs.noteon(0, 76, 30) 

time.sleep(1.0) 

fs.noteoff(0, 60) 
fs.noteoff(0, 67) 
fs.noteoff(0, 76) 

time.sleep(1.0) 

fs.delete() 

La speranza che ti aiuta a orientarti nella giusta direzione!

+1

Freddo, grazie! È un progetto morto o qualcosa del genere? L'ho scaricato e installato con successo, eppure, anche seguendo l'esempio che hai copiato da https://code.google.com/p/pyfluidsynth /, ottengo '' ' tempo import importazione FluidSynth fs = fluidsynth.Synth(): Traceback (chiamata più recente scorso): file "", linea 1, in AttributeError: 'modulo' oggetto non ha attributo 'Synth' '' ' – Mittenchops

+1

È necessario assicurarsi di avere FluidSynth installato troppo (non solo PyFluidSynth) Ecco un link ad un articolo per come farlo su Windows : http://stackoverflow.com/questions/5783913/python-synthesize-midi-with-fluidsynth an d un link aggiornato per esso su Linux/OSX (poiché uno elencato nella sezione Requisiti è giù: http://sourceforge.net/apps/trac/fluidsynth/ – user1475777

+0

Queste sono note MIDI, però, non frequenze. Cercando di convertire le frequenze arbitrarie in numeri di note MIDI produce 'ArgumentError: argomento 3: : type errato' – endolith

1

Se sei su Windows, potresti ottenere qualcosa di simile usando il metodo usato su vecchie console che non potevano suonare molte note contemporaneamente - invece di suonare, ad esempio, C, E e G contemporaneamente, riproduci C poi E poi G molto veloce, possibilmente aggrappandosi un po 'alla nota finale (preferibilmente il tonico). Questo dà l'effetto di accordi, ma se vuoi dimostrare come diversi accordi su un suono di chitarra o banjo (comprese le differenze tra i diversi modi di suonare lo stesso accordo) potrebbe non essere abbastanza buono. Tuttavia, questo metodo è possibile (almeno su Windows) senza utilizzare nulla al di fuori della libreria standard. Codice

Esempio:

import winsound 
import time 

def chord(root_frequency): 
winsound.Beep(int(root_frequency), 60) 
winsound.Beep(int(root_frequency*1.25), 60) 
winsound.Beep(int(root_frequency*1.5), 60) 
winsound.Beep(int(root_frequency*2), 100) 

while True: 
    chord(261.626) 
    time.sleep(0.35) 
    chord(261.626) 
    time.sleep(0.05) 
    chord(233.082) 
    time.sleep(0.35) 
    chord(233.082) 
    time.sleep(0.05) 
    chord(207.652) 
    time.sleep(0.35) 
    chord(207.652) 
    time.sleep(0.05) 
    chord(195.998) 
    time.sleep(0.35) 
    chord(195.998) 
    time.sleep(0.05)