Topic: Generatore di toni  (Letto 1509 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline nico86

  • python unicellularis
  • *
  • Post: 6
  • Punti reputazione: 0
    • Mostra profilo
Generatore di toni
« il: Dicembre 30, 2016, 18:33 »
Ciao a tutti!
Ho iniziato a scrivere un programma per emettere dei toni audio via radio secondo uno specifico standard.
Per la generazione dei toni ho utilizzato Winsound ed il programma funziona correttamente ma è troppo lento.
Nello specifico intendo dire che vi è troppo ritardo fra un tono ed il successivo.
Sapreste dirmi come posso risolvere questo problema? Esistono qualcosas di più veloce che mi permetta di mettere in fila i 5 toni di mio interesse con un ritardo massimo tra l'uno e l'altro di 10ms? Dove sto sbagliando?
Allego il listato:
[codice]
import winsound
import string

treno = "32172"               #selettiva a 5 toni di esempio
spazio_ms = 10               #ritardo fra toni (da implementare)
periodo_tono_ms = 40    #durata del singolo tono
lun_treno = 5                   #numero di digit che costituiscono la selcall (per future implementazioni)
tono_ripetizione = 'E'      #tono di ripetizione
zvei1 = {'0':2400,'1':1060,'2':1160,'3':1270,'4':1400,'5':1530,'6':1670,'7':1830,'8':2000,'9':2200,'A':2800,'B':810,'C':970,'D':885,'E':2600,'F':680}
indici_toni = []
treno_frequenze = []

for i in range (0,len(treno)):
   
    indici_toni.append(treno)
   

for n in range (0,len(treno)):
    treno_frequenze.append(zvei1[str(n)])


print treno_frequenze

for n in range (0,len(treno_frequenze)):
    winsound.Beep(treno_frequenze[n],periodo_tono_ms)

[/codice]

Scusate le domande sicuramente banali, sto provando ad imparare  :confused:
Grazie a tutti! Auguroni!

Nicolò

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.146
  • Punti reputazione: 9
    • Mostra profilo
Re: Generatore di toni
« Risposta #1 il: Dicembre 30, 2016, 19:19 »
non ho capito bene che cosa intendi per "troppo ritardo", ritardo massimo, etc.
Comunque, lasciando perdere le prime 22 righe del tuo codice che complicano una cosa semplice, se io faccio
[codice]
>>> import winsound
>>> for i in range(1000, 5000, 100):
            winsound.Beep(i, 1000)
[/codice]
sento che i suoni di per sé durano un secondo (almeno per quel che mi è possibile apprezzare... ma mi chiedo tu come fai a misurare 40 millisecondi di durata...), ma ovviamente sento anche un breve stacco tra un suono e l'altro. Cioè, non è quello che sentirei se qualcuno solfeggiasse col flauto, per dire. Questo è il ritardo normale delle varie chiamate alle librerie sottostanti. E figurati che il ritardo aumenta se mentre gira il loop mi metto a pasticciare con il browser, e aumenta ancora di più se nel frattempo gioco a Doom o faccio ray tracing con 3dstudio max. Dopo tutto, il sistema operativo fa quello che può.

Offline nico86

  • python unicellularis
  • *
  • Post: 6
  • Punti reputazione: 0
    • Mostra profilo
Re: Generatore di toni
« Risposta #2 il: Dicembre 31, 2016, 09:54 »
Ciao!
Ok, ora mi è chiaro che un valore di tempo preciso non è raggiungibile in questo modo. Nella mia profonda ignoranza ritenevo che scrivendo winsound.Beep(frequenza, durata) avrei ottenuto il suono preciso...mi sbagliavo. Verrebbe da chiedermi a cosa serva avere una funzione che richiede in ingresso un valore espresso in ms se poi la precisione è così fortemente influenzata dai fattori che hai citato.
Esiste un modo per ottenere il risultato da me voluto, ossia toni della durata precisa intervallati da ritardi altrettanto precisi?
Le 22 righe che complicano la cosa semplice sono l'unico sistema che ho pensato per prendere una stringa di 5 cifre contenuta nella variabile treno, assegnare a ciascuna cifra la frequenza corrispondente contenuta nel dizionario zvei1, riprodurre il treno di toni audio da trasmettere tramite radio.
Chiedo venia se ho scritto delle porcherie...sono un esordiente totale  :sick:

Grazie!Tanti auguri per l'anno nuovo!

Nicolò

Offline GlennHK

  • python sapiens sapiens
  • ******
  • Post: 1.658
  • Punti reputazione: 1
    • Mostra profilo
    • La Tana di GlennHK
Re: Generatore di toni
« Risposta #3 il: Dicembre 31, 2016, 10:54 »
Crea un midi a questo punto.

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.146
  • Punti reputazione: 9
    • Mostra profilo
Re: Generatore di toni
« Risposta #4 il: Dicembre 31, 2016, 11:44 »
> avrei ottenuto il suono preciso...mi sbagliavo
E invece OTTIENI il risultato "preciso". TI sbagli adesso.

> a cosa serva avere una funzione che richiede in ingresso un valore espresso in ms
serve a generare un suono che dura esattamente quel numero di millisecondi.
Guarda che non hai capito. Una volta che il suono è partito, dura quello che deve durare. Il gap tra due suoni che dovrebbero essere "uniti", diciamo, dipende dal ritardo tra le chiamate (ma poi... probabilmente anche dall'hardware), non dal fatto che un suono viene arbitrariamente accorciato. Magari è il gap che può durare di più o di meno. Ma il suono dura sempre il giusto. Il gap varia. Il suono no. Il gap. Il suono. Capito?

>  toni della durata precisa intervallati da ritardi altrettanto precisi?
Ma winsound non ha il concetto di "ritardo" tra due suoni (che poi, che cosa vuol dire "ritardo"? Immagino che tu intenda dire "intervallo" tra due suoni). Non capisco come speravi di ottenerlo, un "ritardo" preciso. Quando chiami winsound.Beep ci metti dentro due parametri: uno indica la frequenza, l'altro indica la durata del suono. Mi dici dove sta l'informazione sul "ritardo"?


Del resto non è un problema di python: è che la beep api di windows non è progettata per fare cose del genere, immagino. Se faccio la stessa cosa senza python, sento gli stessi gap tra un suono e l'altro:
[codice]
# powershell
$f = 1000
Do
{
[console]::beep($f, 1000)
$f += 100
} while ($f -le 2000)
[/codice]

Direi che Glenn ha ragione, crea un midi, o un waw.

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re: Generatore di toni
« Risposta #5 il: Dicembre 31, 2016, 19:20 »
Oh, ma che la gente e' stronza a comprarsi software da migliaia di euro se la beep di windows solvesse ogni problema?

Offline nico86

  • python unicellularis
  • *
  • Post: 6
  • Punti reputazione: 0
    • Mostra profilo
Re: Generatore di toni
« Risposta #6 il: Dicembre 31, 2016, 20:06 »
Ciao, sì mi riferisco proprio all'intervallo tra i toni...intervallo che non è stato definito all'interno del programma poichè al momento non sussiste la reale necessità visto che a priori la funzione winsound introduce un intervallo esageratamente lungo fra un tono e l'altro.
Era chiaro che winsound non sia nata per introdurre intervalli definiti dall'utente, non pretendevo che facesse nulla di simile.
Banalmente avrei usato uno sleep(ms).
Non penso assolutamente che la gente sia imbecille ad acquistare software da migliaia di Euro per assolvere a suddette funzioni, semplicemente non immaginavo che fosse così ostico, ciò deriva da ignoranza che sto cercando di colmare e non da presunzione.
Grazie!Buon anno!

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re: Generatore di toni
« Risposta #7 il: Gennaio 03, 2017, 01:58 »
Ti hanno dato la soluzione: passa per midi. O un qualcosa di analogo.
No, sleep non risolve il tuo problema. In generale sleep e' un aggeggio che serve di rado e spesso quando compare e' un segno che qualcos'altro non va.