Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Buongiorno a tutti.
Ho una utility ,non mia, trovata nel web, che mi permette di estrarre l'inviluppo (forma d'onda) di un file wave.L'utility è molto vecchia ma funziona bene.Il mio problema è che ai tempi i file wave erano sostanzialmente nel formato cd (44100, 16bt, stereo).Ora purtroppo devo operare con file wave di formati differenti, ed in particolare con 48000, 16bt, stereo.
Ho trovato il modo di far leggere correttamente i due formati modificando questa sezione di codice che si trova nella sezione DICHIARAZIONI del form che fa il lavoro di estrazione.
Io riesco a leggere la frequenza di campionamento del file nel momento in cui lo carico e mi occorrerebbe, che il dato (882 nel caso sopra) possa essere modificato nel momento in cui carico il file wave.
Ho provato a mettere un IF nella mia sub che carica il file wave ma non fuziona.
Qualcuno mi sa indicare se è possibile eseguire la funzione sopra,non all'avvio del form come avviene ora,ma all'interno di un subroutine come ad esempio
Codice sorgente - presumibilmente Delphi
If samplerate = 44100 Then
...modificoin 882
Label25.Caption= "44100"
Else
...modificoin 960
Label25.Caption= "48000"
EndIf
Questo per pemettermi di caricare indistintamente file a 44100 e 48000 di sample rate.
Nella situazione attuale, per caricare uno o l'altro devo uscire dal programma, modficare il dato via codice e ripartire.
Spero di essermi spiegato in maniera comprensibile.
Imposta nel codice due strutture diverse e usa quella che ti serve al momento
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à.
quando carichi il file wave, lo devi analizzare, in base al responso metti in una variabile il valore voluto
in vb6 per analizzare il file puoi usare Shell32.dll:
http://www.pierotofy.it/pages/sorgenti/dettagli/19629-INFO ... è in VB .Net ma il concetto è lo stesso.
Altra possibilità più semplice è mettere due OptionButton, uno che si chiama 44,1KHz e l'altro 48,0KHz quando l'optionbutton viene cliccato cambi il valore della variabile e richiami la routine che crea la forma d'onda.
Il codice con l'If che hai proposto, da solo non è sufficiente, non conosco le tue competenze in VB6, se hai difficoltà posta il codice completo.
Ciao Carlo, grazie per il replay.
LE mie conoscenze vb6 sono abbastanza "basiche". Il file wav riesco ad analizzarlo senza problemi, infatti la mia intenzione era, leggendo il sample rate, quella di automatizzare il dimensionamento di quel numero.
Questa è la parte di dichiarazione al boot del form
Codice sorgente - presumibilmente VB.NET
Option Explicit
Private riga AsInteger
Dim wavtoshow AsString
Dim play AsBoolean
Dim a AsInteger
Dim pos ' posizione cursore in edit
Dim edit
Dim lung AsString
Dim accss AsString
Dim Posizione AsLong' posizione del cursone nella grafica
Dim totale AsLong' totale lunghezza della linea nella grafica
Dim errore AsInteger
Dim ritardo AsInteger'varibili per timer 2
Dim attendi AsInteger'variabili per timer 2 attendoi di arrivare a ritardo
Dim proseguo AsInteger'se rver per sapere se prosegue la cattura
Dim annullata AsInteger'procedura di carico wave annullata per evitare di inizilizzare griglia
PrivateDeclareFunction MoveToEx Lib "gdi32"(ByVal hDC AsLong, ByVal X AsLong, ByVal Y AsLong, lpPoint AsAny)AsLong
PrivateDeclareFunction LineTo Lib "gdi32"(ByVal hDC AsLong, ByVal X AsLong, ByVal Y AsLong)AsLong
Si, ma per agevolarmi il compito, allega uno zip con il progetto che funziona, per fare una cosa fatta bene bisogna implementare il 48000, che non è contamplato in:
Codice sorgente - presumibilmente Visual Basic 6
samplerate As Long ' sampling frequency: 11025, 22050 or 44100
metti anche la riga che ti fa funzionare il codice a 48000 remmata, e l'originale no.
Grazie Carlo.
Ti allego i file originali (waveplay.vbp) dato che nel programma che ho sviluppato, ho dovuto implementarlo modificandolo sostanzialmente per esigenze mie funzioni che necessitano di altri programmi esterni e/o periferiche che altrimenti andrebbero installate.
ma comunque la parte che interessa si vede gia in partenza.
Ho allegato anche due piccoli file wave , uno a 44khz ed uno a 48 khz.
Scopo di questo codice è caricare un file wave e rappresentare la sua forma d'onda (approssimata in mono) in un player.Quando si schiaccia play la forma d'onda scorre.la linea rossa rappresenta il campione che viene eseguito in quel momento.
A prima vista, senza modifiche di codice, i file vengono caricati senza problemi.
Cosa fare:
Con impostato 882 (default), carica il file test_44 e vedrai, facendo il play, che gli eventi sonori (sono dei semplici beep) partono esattamente appena intersecano la linea rossa.
carica successivamento il file test_48 e fai il play. Noterai che gli eventi sonori partiranno sempre piu in ritardo rispetto alla linea rossa.
Se cambi da 882 con 916, avrai il comportamento contrario.
Dato che da codice (waveh.samplerate) riesco a capire che tipo di codifica ha il file, all'atto del LOAD FILE, volevo che il numero 882 o 960 venisse messo in automatico in modo da poter caricare indifferentemente un file anziche l'altro.
Cosi come è adesso ,devo ogni volta ricompilare ed eseguire il programma e riesco a visualizzare correttamento solo un tipo di file
La matrice wavinfo fa parte della variabile definita come tipo WAVEBLOCK, che poi viene assegnata alla variabile ttt.
Tali designazioni pubbliche avvengono in fase di dichiarazione, per cui se ridimensioni la matrice waveinfo in runtime, la modifica non si riperquoterà in ttt
Ritengo che ci sia un metodo per ottenere quanto da te richiesto, ma ammetto che in VB6 non mi è mai capitato di doverlo fare, anche perché la doppia designazione è inutile, è sufficiente dichiarare solo ttt.
Il codice seguente funziona, ma è gradita la conferma.
ATTENZIONE nel codice le righe:
' TimeDisplay.SetVal 0, 0, WavCount 'Parameters: value, min, max
' TimeDisplay.SetVal VScroll.value
le ho remmate perché nel mio VB6 l'user control non funziona e non ho impiegato tempo per capire perché
Codice sorgente - presumibilmente VB.NET
Option Explicit
PrivateDeclareFunction MoveToEx Lib "gdi32"(ByVal hdc AsLong, ByVal x AsLong, ByVal y AsLong, lpPoint AsAny)AsLong
PrivateDeclareFunction LineTo Lib "gdi32"(ByVal hdc AsLong, ByVal x AsLong, ByVal y AsLong)AsLong
Private Type WAVEFMT
signature AsString*4' must contain 'RIFF'
RIFFsize AsLong' size of file (in bytes) minus 8
type AsString*4' must contain 'WAVE'
fmtchunk AsString*4' must contain 'fmt ' (including blank)
fmtsize AsLong' size of format chunk, must be 16
formatAsInteger' normally 1 (PCM)
channels AsInteger' number of channels, 1=mono, 2=stereo
samplerate AsLong' sampling frequency: 11025, 22050 or 44100
average_bps AsLong' average bytes per second; samplerate * channels
Grande Carlo,funziona regolarmente!!
Si, avevo capito il discorso della doppia assegnazione ma non riuscivo a capire, perchè non l'ho mai usato,il discorso dell'aggiornamento dinamico di una variabile e non dell'altra.
Certe finezze cognitive sono molto sopra il mio livello di conoscenze in vb6. Ti ringrazio per l'aiuto e per la spiegazione.
A presto e grazie ancora.