Oppure

Loading
08/06/19 8:29
orma674
Buongiorno,
qualcuno mi sa aiutare a trovare un metodo per velocizzare il disegno di una waveform.

Attualmente apro il file wav e dopo aver letto i valori dei byte li passo alla classe graphics e poi li visualizzo.

Dim bp as new bitmap(width, height)
dim g as graphics = graphics.fromImage(bp)

dim x1 as int64
dim y1 as int32

for count as int 64 = 0 to data.count -1
dim x2 as int64 = count
dim y2 as int32 = data(count)
g.drawLine(pen.red, x1, y1, x2, y2)
next

picturebox1.image = bp
g.dispose()

Il problema che ho è che una volta costruita la waveform, se io voglio spostare il punto di partenza la deve ricostruire sempre e parlando di grosse quantità di dati, questo genera un rallentamento nella visualizzazione della stessa.

Se qualcuno ha dei suggerimenti su come posso snellire questa procedura.

Io devo implementare lo zoom e lo spostamento.

per lo zoom non vorrei ricorrere alla lettura a step dei dati della waveform ma ad allargare la distanza x tra i punti.

Grazie per l'aiuto.
Marcello
aaa
08/06/19 12:22
nessuno
Devi usare DirectX. Ovviamente non posso dirti di più in una risposta perché l'argomento è vasto e complesso.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità;) chiamava il gioco del Lotto Tassa sulla stupidità.
04/10/19 10:16
orma674
Ciao, scusa se non ho continuato la discussione ma ho dovuto combattere con un problema più serio.

Riprendendo da dove abbiamo lasciato, ho acquisito i dati con directsound.
Adesso per realizzare il vuMeter per il file 16bit ho addizionato tutti i valori rendendoli positivi e li ho divisi per il numero dei valori addizionati.
Dopo ho convertito il tutto in decibel e verificando il suono in parallelo con un software adobe questo corrisponde in tutto.

Il problema ora mi nasce sul file 8 bit.
Ho preso i byte e li ho trasformati in int16 -> byte - 127
Ho reso tutti i int16 < 0 come numero positivo -> if int16 < 0 then int16 * -1
Ho addizionato tutti i valori e li ho divisi per il numero dei valori.
Ho convertito il valore in decibel -> db = 20*log10(valore / 127).
Controllando con un software parallelo ho notato che i db sono completamente inesatti.

Riesci a darmi un suggerimento inerente questo calcolo.
Grazie
Marcello
aaa
04/10/19 20:25
Carlo
Ciao, anche io tempo fa ho affrontato questo argomento, con buoni risultati nella visualizzazione della forma d'onda, quando ho cercato di approfondire ho trovato questi due programmi scritti da Totem, che da una parte ti schiude un mondo, dall'altra ti fa capire cosa stai per affrontare.

Forse un po' fuori tema, ma interessante.
pierotofy.it/pages/sorgenti/dettagli/18027-TWave_Editor/

In questo forse trovi risposte alle tue domande.
pierotofy.it/pages/sorgenti/dettagli/17972-WaveProof/

I programmi sono affetti da piccoli bug, facilmete correggibili, se non ricordo male uno era che un file Wave mono a 16Bit, veniva visualizzato con una forma d'onda errata, un altro era che il salvataggio della forma d'onda su HD, non controllava se il percorso esisteva.

Purtroppo per i dubbi che hai non ti posso aiutare, è passato troppo tempo, ma ricordo che dei problemi li avevo risolti padroneggiando l'endian dei byte

it.wikipedia.org/wiki/…
Ultima modifica effettuata da Carlo 05/10/19 2:39
in programmazione tutto è permesso