IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Naudio.dll, problème création d'un stream


Sujet :

WinDev

  1. #61
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    J'ai testé votre code, cela fonctionne !

    J'ai bien l'entete de créé dans le fichier .wav final

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    RIFFœL WAVEfmt      D¬  ±   dataxL
    Par contre, je n'arrive pas à coller ensuite le contenu du fichier temporaire par le biai du Buffer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    nIDFichFinal est un entier
    nIDFichFinal = fOuvre("C:\Users\Kyle\Documents\test_final.wav", foCréation+foAjout)
     
    MonAudioBuff est un Buffer = fChargeBuffer("C:\Users\Kyle\Documents\test_tempo.wav")
     
    nTailleSon est un entier sans signe sur 4 octets = Taille(MonAudioBuff)
     
    NbrCanaux est un entier sans signe sur 2 octets = 2
    BitsPerSample est un entier sans signe sur 2 octets = 16
    BytePerBloc est un entier sans signe sur 2 octets = NbrCanaux * BitsPerSample / 8
    Frequence est un entier sans signe sur 4 octets = 44100
    BytePerSec est un entier sans signe sur 4 octets = Frequence * BytePerBloc
     
    xbEntete est un Buffer
     
    //	[Bloc de déclaration d'un fichier au format WAVE]
    //	   FileTypeBlocID  (4 octets) : Constante «RIFF»  (0x52,0x49,0x46,0x46)
    //	   FileSize        (4 octets) : Taille du fichier moins 8 octets
    //	   FileFormatID    (4 octets) : Format = «WAVE»  (0x57,0x41,0x56,0x45)
     
    xbEntete = "RIFF"
    xbEntete += (nTailleSon + 44 - 8)
    xbEntete += "WAVE"
     
    //	[Bloc décrivant le format audio]
    //	   FormatBlocID    (4 octets) : Identifiant «fmt »  (0x66,0x6D, 0x74,0x20)
    //	   BlocSize        (4 octets) : Nombre d'octets du bloc - 8  (0x10)
    //	   AudioFormat     (2 octets) : Format du stockage dans le fichier (1: PCM, ...)
    //	   NbrCanaux       (2 octets) : Nombre de canaux (de 1 à 6)
    //	   Frequence       (4 octets) : Fréquence d'échantillonnage (en hertz) [Valeurs standardisées : 11025, 22050, 44100 et éventuellement 48000 et 96000]
    //	   BytePerSec      (4 octets) : Nombre d'octets à lire par seconde (i.e., Frequence * BytePerBloc).
    //	   BytePerBloc     (2 octets) : Nombre d'octets par bloc d'échantillonnage (i.e., tous canaux confondus : NbrCanaux * BitsPerSample/8).
    //	   BitsPerSample   (2 octets) : Nombre de bits utilisés pour le codage de chaque échantillon (8, 16, 24)
     
    xbEntete += "fmt "
    xbEntete += 0x00000010
    xbEntete += BufferSurDeuxOctets(1)
    xbEntete += BufferSurDeuxOctets(NbrCanaux)
    xbEntete += Frequence
    xbEntete += BytePerSec
    xbEntete += BufferSurDeuxOctets(BytePerBloc)
    xbEntete += BufferSurDeuxOctets(BitsPerSample)
     
    //	[Bloc des données]
    //	   DataBlocID      (4 octets) : Constante «data»  (0x64,0x61,0x74,0x61)
    //	   DataSize        (4 octets) : Nombre d'octets des données (i.e. "Data[]", 
    //									i.e. taille_du_fichier - taille_de_l'entête  (qui fait 44 octets normalement).
     
    xbEntete += "data"
    xbEntete += nTailleSon
     
    Trace(xbEntete)
     
    // pour écrire l'entête
    fEcrit(nIDFichFinal, &xbEntete + &MonAudioBuff, Taille(xbEntete) + Taille(MonAudioBuff))
    J'ai l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Erreur à la ligne 69 du traitement Procédure globale CreerWavONE.
    Vous avez appelé la fonction fEcrit.
    L'adresse mémoire fournie pour le buffer : <0x07311058d> est invalide sur une partie au moins de sa taille (<253596> octets).

  2. #62
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 812
    Points
    812
    Par défaut
    Citation Envoyé par WDKyle Voir le message
    J'ai testé votre code, le fichier final ne fais qu'1 Ko donc doit y avoir un soucis

    Lorque je trace l'entete il me renvoi juste ca

    il y a des octets à 0, aussi il faut configurer l'affichage du débogueur en mode hexadécimal.

  3. #63
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    j'ai édité mon post, car je me suis gouré

  4. #64
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Citation Envoyé par OnePoint Voir le message
    La structure c'est bien, car lisible !
    Et tu peux l'écrire directement, sans transiter par un buffer. Mais il faut utiliser la fonction Dimension pour obtenir la taille de la variable (ici c'est 44 octets, on le sait déjà ).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonEnteteWave:FileSize = Dimension(MonEnteteWave) + Taille(MonAudioBuff) - 8

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fEcrit(nIDFichFinal, &MonEnteteWave, Dimension(MonEnteteWave))
    fEcrit(nIDFichFinal, &MonAudioBuff,Taille(MonAudioBuff))
    Parfait ! Cela fonctionne avec ce code. Il faut séparer les écritures ?

    Merci

  5. #65
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 812
    Points
    812
    Par défaut
    Malheureux !

    Quand tu écris &Buffer1 + &Buffer2, tu effectues la somme de 2 adresses mémoire, donc tu obtiens une 3ème adresse mémoire qui se situe quelque part... dans le cosmos...

    Bien sûr, ça ne peut pas fonctionner !


    Alors, soit tu concatènes les buffers, et ensuite tu fEcrit() le buffer concaténé. (mais là ton programme perds du temps et des ressources pour rien)

    Soit tu exécutes 1 fEcrit pour l'entête, suivi d'un fEcrit pour les données. (je préfère cette solution, plus efficace)

  6. #66
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    D'accord, c'est plus clair dans ma tête ! Grand merci OnePoint

    Je suis encore novice sur les adresses donc voila lol erreur de débutant.

    Je vais tenter d'optimiser le code et je reviens ici si il y a un soucis mais je pense que cela sera bon, car là j'ai un fichier audio lisible au final

  7. #67
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Citation Envoyé par Patrice Terrier Voir le message
    Pour pouvoir dessiner le wave form il faut décoder au préalable en mémoire le Stream audio avant de commencer à le jouer.

    Voici le principe a utiliser avec Bass.dll (code écrit en BASIC)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    DO WHILE NOT gnScanKill
            nLevel = BASS_ChannelGetLevel(nScanChannel) '// scan peaks
            nLP = LO(WORD, nLevel)
            nRP = HI(WORD, nLevel)
     
            IF nLpeak < nLP THEN nLpeak = nLP ' set left peak
            IF nRpeak < nRP THEN nRpeak = nRP ' set right peak
     
            IF BASS_ChannelIsActive(nScanChannel) = 0 THEN
               nX = -1 ' reached the end
            ELSE
               nX = BASS_ChannelGetPosition(nScanChannel, %BASS_POS_BYTE) / nBpp
            END IF
     
            IF nX > nXpos THEN
               nL = (nLpeak * nHalfHeight / 32768) - 1
               nR = (nRpeak * nHalfHeight / 32768) - 1
               FOR nY = 0 TO nL
                   IF gnScanKill THEN
                      EXIT FOR
                   ELSE
                      PixelArray(nX, nHalfHeight - nY) = zColorARGB(255, LevelColr(rCoef * nY))
                   END IF
               NEXT
               FOR nY = 0 TO nR
                   IF gnScanKill THEN 
                      EXIT FOR
                   ELSE
                      PixelArray(nX, nHalfHeight - 1 + nY) = zColorARGB(255, LevelColr(rCoef * nY))
                   END IF
               NEXT
               IF nX >= %SCANWIDTH - 1 THEN EXIT DO '// gone off end of display
               nXpos = nX
               nLpeak = 0: nRpeak = 0
            END IF
        LOOP
    Bonjour Patrice,

    Je suis en pleine conversion de votre code pour Windev afin de générer une waveform et je coince sur certaines parties.

    J'ai déclaré bêtement dans un premier temps toutes les variables en entier sans signe sur 4 octects ne sachant pas d’où elle venaient...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    PROCEDURE WAVE_Form()
     
    gnScanKill est un booléen
    nLevel est un entier sans signe sur 4 octets
    nLP est un entier sans signe sur 4 octets
    nRP est un entier sans signe sur 4 octets
    nLpeak est un entier sans signe sur 4 octets
    nRpeak est un entier sans signe sur 4 octets
    nBpp est un entier sans signe sur 4 octets
    nX est un entier sans signe sur 4 octets
    nXpos est un entier sans signe sur 4 octets
    nY est un entier
    nL est un entier sans signe sur 4 octets
    nR est un entier sans signe sur 4 octets
    nHalfHeight est un entier sans signe sur 4 octets
     
     
    TANTQUE PAS gnScanKill
    	nLevel = BASS_ChannelGetLevel(handlerecord) // scan peaks
    	nLP = PoidsFaible(nLevel)
    	nRP = PoidsFort(nLevel)
     
    	// set left peak
    	SI nLpeak < nLP ALORS
    		nLpeak = nLP
    	FIN
    	// set right peak
    	SI nRpeak < nRP ALORS
    		nRpeak = nRP 
    	FIN 
     
    	SI BASS_ChannelIsActive(handlerecord) = 0 ALORS
    		//reached the end
    		nX = -1
    	SINON
    		nX = BASS_ChannelGetPosition(handlerecord, BASS_POS_BYTE) / nBpp
    	FIN
     
    	SI nX > nXpos ALORS
    		nL = (nLpeak * nHalfHeight / 32768) - 1
    		nR = (nRpeak * nHalfHeight / 32768) - 1
    		POUR nY = 0 _A_ nL
    			SI gnScanKill ALORS
    				SORTIR
    			SINON
    				PixelArray(nX, nHalfHeight - nY) = zColorARGB(255, LevelColr(rCoef * nY))
    			FIN
     
    			POUR nY = 0 _A_ nR
    				SI gnScanKill ALORS 
    					SORTIR
    				SINON
    					PixelArray(nX, nHalfHeight - 1 + nY) = zColorARGB(255, LevelColr(rCoef * nY))
    				FIN
     
    				SI nX >= %SCANWIDTH - 1 ALORS
    					SORTIR
    				SINON
    					 // gone off end of display
    					nXpos = nX
    					nLpeak = 0: nRpeak = 0
    				FIN
    			FIN
    		FIN
    	FIN
    FIN
    Ensuite, à quoi correspond les lignes PixelArray ? %SCANWIDTH ? nLpeak = 0: nRpeak = 0 ? gnScanKill est un bien un booléen ?

    Voila, pouvez-vous m'en dire plus sur votre code svp ?

    Merci.

  8. #68
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CONSTANT
    	SCANWIDTH  = 128 // largeur du DIB (bitmap mémoire)
    	SCANHEIGHT = 33  // hauteur du DIB (bitmap mémoire)
    END
     
    PixelArray est un tableau [SCANWIDTH, SCANHEIGHT] entier sans signe
    gnScanKill est booléen
    nLevel, nLpeak, nRpeak sont entier sans signe
    nLP, nRP, nBpp, nX, nY, nXpos, nL, nR, nHalfHeight sont entier
    J'utilise un DIB 32-bit donc toutes les couleurs comportent un canal alpha en plus des 3 composantes RVB.
    La fonction zColorARGB permet de créer un DWORD (entier non signé) le premier paramètre correspond au canal Alpha (0-255), le second paramètre contient la valeur RVB de la couleur utilisée pour le point.
    Note : les entier signés et non signés sont interchangeables (4 octets en mémoire)

    LevelColr est une fonction qui marche en relation avec la procédure ColorInit(), qui initialise le tableau de couleur qui est utilisé pour afficher les pixels.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    SUB ColorInit()
        DIM gColor(1 TO 33) AS LONG, gPeak(1 TO 100, 1 TO 2) AS LONG
        gColor(1)  = RGB(32,32,32)
        gColor(2)  = RGB(0,44,233)
        gColor(3)  = RGB(0,67,210)
        gColor(4)  = RGB(0,89,187)
        gColor(5)  = RGB(0,112,164)
        gColor(6)  = RGB(0,135,142)
        gColor(7)  = RGB(0,159,117)
        gColor(8)  = RGB(0,183,88)
        gColor(9)  = RGB(0,207,58)
        gColor(10) = RGB(0,231,29)
        gColor(11) = RGB(26,234,26)
        gColor(12) = RGB(52,237,23)
        gColor(13) = RGB(79,240,20)
        gColor(14) = RGB(105,243,17)
        gColor(15) = RGB(126,245,14)
        gColor(16) = RGB(147,248,11)
        gColor(17) = RGB(168,250,8)
        gColor(18) = RGB(189,253,5)
        gColor(19) = RGB(210,255,2)
        gColor(20) = RGB(233,255,0)
        gColor(21) = RGB(255,255,0)
        gColor(22) = RGB(255,251,0)
        gColor(23) = RGB(255,235,0)
        gColor(24) = RGB(255,215,0)
        gColor(25) = RGB(255,196,0)
        gColor(26) = RGB(255,176,0)
        gColor(27) = RGB(255,156,0)
        gColor(28) = RGB(253,137,0)
        gColor(29) = RGB(255,117,0)
        gColor(30) = RGB(255,97,0)
        gColor(31) = RGB(255,78,0)
        gColor(32) = RGB(255,58,0)
        gColor(33) = RGB(255,0,0)
    END SUB
     
    FUNCTION LevelColr(BYVAL nLevel AS LONG) AS LONG
        LOCAL nColor AS LONG
        nLevel = nLevel + 1: IF nLevel > 33 THEN nLevel = 33
        nColor = 0: IF nLevel > 0 THEN nColor = gColor(nLevel)
        FUNCTION = nColor
    END FUNCTIO

  9. #69
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    D'accord, mais cela ne m'aide pas vraiment plus...

    Il y a t'il moyen de créer la courbe audio dans un champ image avec les fonctions de dessins de Windev ?

    merci

  10. #70
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    J'ai une DLL (ZSLIB) qui permet d'afficher un oscilloscope comme dans le projet WD17 BassBox Radio ci-dessous



    J'avais l'intention de poster le code source du projet WinDev ici.
    Mais comme il est basé sur basé sur Bass.dll, GDImage.dll, ZSLIB.dll, et OpenGL, je ne suis pas sûr que ce soit le bon forum pour le faire.

    Ce projet effectue tous les traitements temps réel en code Win32 natif (sous forme de DLL, y compris les plugins visuels).

    ...

  11. #71
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Un champ image WinDev, n'est pas adapté pour dessiner un oscilloscope en temps réel.
    Tout au plus ce que vous pouvez faire, c'est dessiner un vu-metre audio en utilisant la fonction WinDev dCopyBlt de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    PROCEDURE DisplayVuMeter()
    IF IsWindowVisible(Handle(IMG_VM..Name)) THEN
    	nFlag is int = NOT GetStaticValue("VuM"); SetStaticValue("VuM", nFlag)
    	IF nFlag THEN RETURN
     
    	nL, nPeak is int
    	rPot is 4-byte real
    	nVmh is int = IMG_VM..Height
     
    	nXL, nXR are int
     
    	FOR K = 1 TO MAXCHANNEL - 1
     
    		nXL = ((K - 1) * 10) + ((K - 1) * 39)
    		nXR = nXL + 18 
    		IF gnChannel[K].led = True THEN 
    			nPeak = BASS_Mixer_ChannelGetLevel(BassGetTempoChannel(K)) 
    			IF nPeak > 0 THEN
    				rPot = gnChannel[K].rMeterValue // Version 3 
     
    				nL = (HiWord(nPeak) * rPot)// ELSE nL = (LoWord(nPeak) * rPot)
     
    				dCopyBlt(Srce_Back, IMG_VM, copySrcCopy, 0, 0, nVmh - nL, 9, nXL, 0, nVmh - nL, 9)
    				IF nL > 0 THEN dCopyBlt(Srce_Front, IMG_VM, copySrcCopy, 0, nVmh - nL, nL, 9, nXL, nVmh - nL, nL, 9)
    			ELSE
    				dCopyBlt(Srce_Back, IMG_VM, copySrcCopy, 0, 0, nVmh, 9, nXL, 0, nVmh, 9)
    			END
    		ELSE
    			dCopyBlt(Srce_Back, IMG_VM, copySrcCopy, 0, 0, nVmh, 9, nXL, 0, nVmh, 9)
    		END
     
    	END
     
    END

  12. #72
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Je cherche à avoir ceci, et non un oscilloscope


  13. #73
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    C'est exactement ce que permet de faire le code que vous avez commencé à traduire.

    Il dessine le waveform dans le fond de l'oscilloscope, de la façon suivante :
    Nom : waveform.jpg
Affichages : 494
Taille : 21,2 Ko

    Pour dessiner le wave form, j'utilise un decoding channel (BASS_STREAM_DECODE), le dessin est réalisé dans la procédure que vous avez commencé à traduire. Elle est appelée par un thread secondaire, pour ne pas bloquer le thread principal qui est entrain de jouer le fichier audio correspondant.

    ...

  14. #74
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Bonjour,

    Cela se fait progressivement selon l'avancé du morceau ? Et non, d'une seule fois ?

    Cela m'intéresserais pour la partie enregistrement, cela permet de voir le waveform se créer au fur et à mesure de l'enregistrement, par contre, connaissez-vous un moyen d'avoir la waveform totale d'un fichier audio ? Même si cela prends quelques secondes, le but étant ensuite de sauvegarder la waveform en jpg dans une base de données.

    J'en reviens à votre code, vous m'avez donné des infos mais en BASIC et je ne connais en rien ce langage.

    Vous faites quoi en gros avec le code ? Vous stockez dans un tableau les points de volume à des moments donnés ?

    Merci encore pour votre aide

  15. #75
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Voilà le principe simple qui permet de dessiner un waveform.

    On utilise l'axe des X pour représenter la durée du fichier audio.
    X= position en Byte dans le fichier audio que l'on obtient par :
    nX = BASS_ChannelGetPosition(nAudioChannel, BASS_POS_BYTE)

    On utilise l'axe Y pour représenter l'amplitude du signal audio que l'on obtient par :
    nLevel = BASS_ChannelGetLevel(nAudioChannel)

    Si le fichier est enregistré en stéréo, on extrait de nLevel, les valeurs de poids fort et de poids faible pour représenter le niveau du canal gauche et du canal droit. On dessine un ligne correspondant au canal gauche sur la partie supérieure de l'axe des X, et le canal droit sur la partie inférieure.

    Si le fichier est en mono, on divise simplement la valeur de nLevel par 2 pour dessiner une ligne verticale dont la hauteur correspond à la moitié de part et d'autre de l'axe des X.

    Si vous tracez le waveform pendant que vous enregistrez, le problème c'est que vous n'avez encore aucune idée de la durée totale de l'enregistrement, vous devez donc mémoriser les données dans un tableau si vous voulez pouvoir ensuite créer une image.

    Si vous voulez simplement dessiner les valeurs au fur et à mesure, il suffit de tracer les lignes en partant du bord gauche du champ image vers la droite, et de faire scroller le graphe d'un pixel sur la gauche lorsque vous atteignez le bord droit de votre champ image.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                    Y   Y
                    |   
                    |   |
    axe des X ------+---+------------------------------ = durée de l'enregistrement
                    |   |
                 nLevel |
                      nLevel = amplitude du signal à l'instant X
    La façon dont vous stockez les valeurs dans le tableau n'a pas grande importance, elle est utile uniquement si vous voulez sauvegarder l'image du waveform à la fin de l'enregistrement, ou le dessiner d'un coup dans le cas de l'utilisation de BASS_STREAM_DECODE.

    Pour dessiner le waveform d'un fichier audio existant, la problématique est différente car vous devez alors faire correspondre le dessin du waveform à celle du champ image, la fonction BASS_ChannelGetLength vous permet de connaître la taille en byte d'un fichier audio, un simple calcul permet de déterminer le pas (en pixel) que l'on doit utiliser sur l'axe des X pour représenter la valeur correspondante sur l'axe Y.

    ...

  16. #76
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Bonsoir,

    J'ai effectué quelques test et cela fonctionne pas mal ! Merci pour l'explication Patrice.
    Images attachées Images attachées  

  17. #77
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Après quelques corrections
    Images attachées Images attachées  

  18. #78
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Je suis content pour vous...

    Je travaille en ce moment sur un nouveau mixer pour "Fly"

    Nom : capture.jpg
Affichages : 676
Taille : 133,5 Ko

    Avec devinez quoi : Bass.dll

  19. #79
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Jolie projet !

    J'arrive à créer une waveform au fur et à mesure que je récolte des points de level avec Bass_ChannelGetLevel,je cherche maintenant à créer une waveform d'un fichier audio existant en instantanée sans lecture du channel est-ce possible ? J'ai cru comprendre qu'il fallait utiliser BASS_ChannelGetData (http://www.un4seen.com/doc/#bass/BAS...elGetData.html) mais j'avou que je ne vois pas bien comment...

    J'ai tenté ceci, mais le buffer ne contient rien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    test est un Buffer
     
    BASS_ChannelGetData(Handle_Stream, &test, 1073741824)
     
    Trace(test) >>> Vide
    Avez-vous déjà effectué ce genre de manip ?

    Merci.

  20. #80
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    C'est exactement ce que fait l'exemple que vous aviez commencer à traduire.

    Je pense qu'avant toute chose vous devez lire la documentation, dont voici le lien
    http://www.un4seen.com/doc/#bass/BAS...reateFile.html

    Regardez :
    BASS_StreamCreateFile avec le flag BASS_STREAM_DECODE
    BASS_ChannelGetLength
    BASS_ChannelGetLevel
    BASS_ChannelGetData

    Regardez également les exemples livrés avec Bass.dll (Spectrum).

    Et pour ceux qui préfèrent DotNET
    http://www.bass.radio42.com/help/htm...0a65f7e545.htm

    ...

Discussions similaires

  1. Problème création DLL
    Par sniperpro dans le forum Langage
    Réponses: 10
    Dernier message: 05/10/2011, 10h11
  2. Problème Création DLL
    Par Fabien25C dans le forum Débuter
    Réponses: 1
    Dernier message: 25/11/2009, 13h57
  3. Réponses: 10
    Dernier message: 05/02/2009, 13h22
  4. Problème création de DLL avec CString
    Par loupdeau dans le forum MFC
    Réponses: 3
    Dernier message: 21/07/2005, 20h55
  5. Problème création de DLL
    Par monsieur.voie.lactee dans le forum C++Builder
    Réponses: 4
    Dernier message: 12/08/2003, 16h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo