SoundEditor 19-2

Vous avez développé un logiciel en PureBasic et vous souhaitez le faire connaitre ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

alors voila mon vibrato renomme "tremolo" (tremolo.pb)
j'ai modifier le fait qu'en demandant un tremolo plus rapide cela baissais
lamentablement le volume
voila qui donne un son plus regulier quelque soit la periode demande
(je travaille toujour dessus ! :wink: )

Code : Tout sélectionner

; FILTRE VOLUME - VOLUME FILTER
; By ZapMan
;
; You can use this filter as an exemple to create new one's
;
; Vous pouvez utiliser ce filtre comme exemple pour en créer de nouveaux 
;
; A filter need 2 or 3 procedures to be operational
; - the first one will add your controls (gadgets) in the filter window when it's open. If you have no need of control, you can forget it.
; - the second one will be called by the event loop of the filter window (this exemple has not this one)
; - the third must apply your effect on the sound
;
; Un filtre nécessite 2 à 3 procédures pour être opérationnel
; - la première ajoutera vos gadgets dans la fenêtre de filtre quand elle sera ouverte. Si votre filtre ne nécessite aucun gadget, vous pouvez l'oublier.
; - la deuxième sera appellée par la boucle des évènement de cette fenêtre (cet exemple n'en comporte pas)
; - la troisième doit appliquer votre effet sur le son

Procedure tremCreateButtons ()
      #ComboGadget=1 ; gadgets can have any number from 1 to 399. But don't re-use the same number in two different filters !!
                     ; les gadgets peuvent avoir un numéro compris entre 1 et 399. Attention a ne pas utiliser le même numéro dans deux filtres différents !!
      values$="1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20"
      ComboBoxGadget(#ComboGadget,100,23,70,250)
      FontID1 = LoadFont(1, "Arial", 16, #PB_Font_Bold)
      SetGadgetFont(#ComboGadget, FontID1)
      For lcg=1 To 20
        AddGadgetItem(#ComboGadget,-1,StringField(values$, lcg, ","))
      Next 
      SetGadgetState(#ComboGadget,5) 
      PBase=40 ; this filter gadget is 40 points high. You can use more !
               ; Le gadget de ce filtre occupe un espace de 40 points de haut. Vous pouvez faire plus grand !
  ProcedureReturn PBase
EndProcedure

Procedure tremCompute (*hsound) ; *hsound is the adress of the WAVE sound on wich you will apply your effect
                              ; *hsound est l'adresse du son WAVE sur lequel vous allez appliquer votre effet
  CValues$="1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20"
  vol.f = ValF(StringField(CValues$, GetGadgetState(#ComboGadget)+1, ","))
  wBitsPerSample.w=PeekW(*hsound+34)
  *pt=*hsound+44
  lim = *hsound+44+PeekL(*hsound+40)
  While *pt<=lim
    Select wBitsPerSample
        Case 8
            
            sv1 = PeekB(*pt)
            If sv1<0
                sv1+256  ; Convert signed to unsigned
            EndIf
            sv1-128    ; 8bits wave signal is from 0 to 256 with a midpoint at 128
            
            ; ici tremolo by dobro
            compt+sens
            If compt=0
                sens=1
            EndIf
            If compt>10000*(vol/10)
                sens=-1
            EndIf  
            sv = Round(sv1*compt/10000/(vol*5)*50,0)  
            ;Debug sv
            ; ******************************
            
            If sv>127 ; saturation
                sv=127
            EndIf
            If sv<-127
                sv=-127
            EndIf
            sv+128 
            PokeB(*pt,sv) 
        
        Case 16 
            
          ; ici tremolo by dobro
        compt+sens
        If compt=0
            sens=1
        EndIf
        If compt>10000*(vol/5)
            sens=-1
        EndIf 
            sv =Round(PeekW(*pt)*compt/10000/(vol*5)*50,0)   
        If sv>($FFFF/2)-1
          sv=($FFFF/2)-1  ; saturation
        EndIf
        If sv<-($FFFF/2)+1
          sv=-($FFFF/2)+1 ; saturation
    EndIf
    PokeW(*pt,sv)
Case 32
    ; ici tremolo by dobro
    compt+sens
    If compt=0
        sens=1
    EndIf
    If compt>10000*(vol/5)
        sens=-1
    EndIf 
     sv =Round(PeekW(*pt)*compt/10000/(vol*5)*50,0)   
    If sv>($FFFFFFFF/2)-1
        sv=($FFFFFFFF/2)-1  ; saturation
    EndIf
    If sv<-($FFFFFFFF/2)+1
        sv=-($FFFFFFFF/2)+1 ; saturation
    EndIf
    PokeL(*pt,sv)
    EndSelect
    *pt+wBitsPerSample/8 
  Wend
  ProcedureReturn *hsound ; this is very important !!!!!!!!!
EndProcedure 
;
; Now, give the names of your effect and register the adresses of your procedures
RegisterFilter("tremolo","tremolo","tremolo","by Dobro",@tremCreateButtons (),0,@tremCompute ())
;              "FrenchName","EnglishName","GermanName","Your name",procedure adress for create button, procedure adress for events managing, procedure adress for filtering computing
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Puisque tout lemonde donne un bout de code mais si il est pas totalement fini (dobro t'es dénnoncé :P ) en voilà un autre : Il accèlère par 2

Code : Tout sélectionner

; FILTRE VITESSE - SPEED FILTER 
; By Oliv 
; 
; You can use this filter as an exemple to create new one's 
; 
; Vous pouvez utiliser ce filtre comme exemple pour en créer de nouveaux 
; 
; A filter need 2 or 3 procedures to be operational 
; - the first one will add your controls (gadgets) in the filter window when it's open. If you have no need of control, you can forget it. 
; - the second one will be called by the event loop of the filter window (this exemple has not this one) 
; - the third must apply your effect on the sound 
; 
; Un filtre nécessite 2 à 3 procédures pour être opérationnel 
; - la première ajoutera vos gadgets dans la fenêtre de filtre quand elle sera ouverte. Si votre filtre ne nécessite aucun gadget, vous pouvez l'oublier. 
; - la deuxième sera appellée par la boucle des évènement de cette fenêtre (cet exemple n'en comporte pas) 
; - la troisième doit appliquer votre effet sur le son 

Procedure ViCreateButtons () 

EndProcedure 

Procedure ViCompute (*hsound) ; *hsound is the adress of the WAVE sound on wich you will apply your effect 
                              ; *hsound est l'adresse du son WAVE sur lequel vous allez appliquer votre effet 
  wBitsPerSample.w=PeekW(*hsound+34) 
  *pt=*hsound+44 
  Taille_Header.l = PeekL(*hsound + 16) 
  Taille_Totale.l = PeekL(*hsound + 4) 
  Taille_Data.l = PeekL(*hsound + 40) 
  NTaille_Totale.l = Round(Taille_Header + (Taille_Totale/2),1) 
  NTaille_Data.l =  Round(Taille_Data/2,1) 
  nChannels.l = PeekW(*hsound + 22) 
  compteur.w = 1 
  *hsound2 = AllocateMemory(NTaille_Totale) 
  If *hsound2 
    CopyMemory(*hsound,*hsound2,44) 
    PokeL(*hsound2 + 4,NTaille_Totale) 
    PokeL(*hsound2 + 40,Ntaille_Data) 
    *pt2 = *hsound2 + 44 
    lim = *hsound+44+PeekL(*hsound+40) 
    While *pt<=lim 
      Select wBitsPerSample 
        Case 8 
          sv = PeekB(*pt) 
          If sv<0 
            sv+256  ; Convert signed to unsigned 
          EndIf 
          sv-128    ; 8bits wave signal is from 0 to 256 with a midpoint at 128 
          sv2 = PeekB(*pt + wBitsPerSample/8 * nChannels) 
          If sv2<0 
            sv2+256  ; Convert signed to unsigned 
          EndIf 
          sv2-128    ; 8bits wave signal is from 0 to 256 with a midpoint at 128 
          sv=Round((sv + sv2)/2,0) ; apply volume 
          If sv>127 ; saturation 
            sv=127 
          EndIf 
          If sv<-127 
            sv=-127 
          EndIf 
          sv+128 
          PokeB(*pt2,sv) 
        Case 16 
          sv = Round((PeekW(*pt) + PeekW(*pt + (wBitsPerSample/8 * nChannels))) / 2,0) 
          If sv>($FFFF/2)-1 
            sv=($FFFF/2)-1  ; saturation 
          EndIf 
          If sv<-($FFFF/2)+1 
            sv=-($FFFF/2)+1 ; saturation 
          EndIf 
          PokeW(*pt2,sv) 
        Case 32 
          sv = Round((PeekL(*pt) + PeekL(*pt + (wBitsPerSample/8 * nChannels))) / 2,0) 
          If sv>($FFFFFFFF/2)-1 
            sv=($FFFFFFFF/2)-1  ; saturation 
          EndIf 
          If sv<-($FFFFFFFF/2)+1 
            sv=-($FFFFFFFF/2)+1 ; saturation 
          EndIf 
          PokeL(*pt2,sv) 
      EndSelect 
      If nChannels = 1 
        *pt + (wBitsPerSample/8 * 2) 
      Else 
        *pt + wBitsPerSample/8 
        compteur + 1 
        If compteur > nChannels 
          *pt + (wBitsPerSample/8 * nChannels) 
          compteur = 1 
        EndIf 
      EndIf 
      *pt2 + wBitsPerSample/8 
    Wend 
  EndIf 
  FreeMemory(*Hsound) 
  ProcedureReturn *HSound2 ; this is very important !!!!!!!!! 
EndProcedure 
; 
; Now, give the names of your effect and register the adresses of your procedures 
RegisterFilter("Vitesse","Speed","Geschwindigkeit","by Oliv",@ViCreateButtons (),0,@ViCompute ()) ; traduction de "vitesse" en allemand par google 
;              "FrenchName","EnglishName","GermanName","Your name",procedure adress for create button, procedure adress for events managing, procedure adress for filtering computing 

Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ya quelques chose qui me fait plante avec ton module !!

je cherche !! :)
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Pourtant chez moi tout fonctionne, enfin en 16bits, faut que je trouve un extrait en 8bits pour essayer.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

je comprend pas !!
j'ai desactivé tout les autres modules
malgres ça lorsque j'utilise ton module en cliquant sur "voir le resultat"
ça quit le module , le programme , et je me retrouve sous Japbe

:( ???
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

bon j'ai refait un tremolo axée sur une sinusoide cette fois
(la courbe est plus jolie en gros plan :D )


Code : Tout sélectionner

; FILTRE Tremolo d'apres le code a Zapman du Volume
; By dobro
;
; You can use this filter as an exemple to create new one's
;
; Vous pouvez utiliser ce filtre comme exemple pour en créer de nouveaux 
;
; A filter need 2 or 3 procedures to be operational
; - the first one will add your controls (gadgets) in the filter window when it's open. If you have no need of control, you can forget it.
; - the second one will be called by the event loop of the filter window (this exemple has not this one)
; - the third must apply your effect on the sound
;
; Un filtre nécessite 2 à 3 procédures pour être opérationnel
; - la première ajoutera vos gadgets dans la fenêtre de filtre quand elle sera ouverte. Si votre filtre ne nécessite aucun gadget, vous pouvez l'oublier.
; - la deuxième sera appellée par la boucle des évènement de cette fenêtre (cet exemple n'en comporte pas)
; - la troisième doit appliquer votre effet sur le son

Procedure trem2CreateButtons ()
      #ComboGadget=1 ; gadgets can have any number from 1 to 399. But don't re-use the same number in two different filters !!
                     ; les gadgets peuvent avoir un numéro compris entre 1 et 399. Attention a ne pas utiliser le même numéro dans deux filtres différents !!
      values$="1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20"
      ComboBoxGadget(#ComboGadget,100,23,70,250)
      FontID1 = LoadFont(1, "Arial", 16, #PB_Font_Bold)
      SetGadgetFont(#ComboGadget, FontID1)
      For lcg=1 To 20
        AddGadgetItem(#ComboGadget,-1,StringField(values$, lcg, ","))
      Next 
      SetGadgetState(#ComboGadget,5) 
      PBase=40 ; this filter gadget is 40 points high. You can use more !
               ; Le gadget de ce filtre occupe un espace de 40 points de haut. Vous pouvez faire plus grand !
  ProcedureReturn PBase
EndProcedure

Procedure trem2Compute (*hsound) ; *hsound is the adress of the WAVE sound on wich you will apply your effect
                              ; *hsound est l'adresse du son WAVE sur lequel vous allez appliquer votre effet
  CValues$="1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20"
  vol.f = ValF(StringField(CValues$, GetGadgetState(#ComboGadget)+1, ","))
  wBitsPerSample.w=PeekW(*hsound+34)
  *pt=*hsound+44
  lim = *hsound+44+PeekL(*hsound+40)
  While *pt<=lim
    Select wBitsPerSample
        Case 8 
            sv1= Round(PeekB(*pt),0)
            If sv1<0
                sv1+256  ; Convert signed to unsigned
            EndIf
            sv1-128    ; 8bits wave signal is from 0 to 256 with a midpoint at 128
            
            ; ici tremolo 2 by dobro
            compt+1 
            
            y=Sin(compt/500/vol)*sv1
            
            sv1=sv1+y*1
            
            ;Debug sv
            ; ******************************
            
            If sv1>127 ; saturation
                sv1=127
            EndIf
            If sv1<-127
                sv1=-127
            EndIf
            sv1+128 
            PokeB(*pt,sv1) 
        
        Case 16 
            
        ; ici tremolo 2 by dobro
        compt+1   
        sv = Round(PeekW(*pt),0)
        y=Sin(compt/500/vol)*sv/10
      
        sv=sv+y*10 
     
        If sv>($FFFF/2)-1
          sv=($FFFF/2)-1  ; saturation
        EndIf
        If sv<-($FFFF/2)+1
          sv=-($FFFF/2)+1 ; saturation
    EndIf 
    PokeW(*pt,sv)
Case 32 
   ; ici tremolo 2 by dobro
    compt+1 
    
    sv = Round(PeekL(*pt),0)
    y=Sin(compt/500/vol)*sv/10 
    sv=sv+y*10  
    If sv>($FFFF/2)-1
        sv=($FFFF/2)-1  ; saturation
    EndIf
    If sv<-($FFFF/2)+1
        sv=-($FFFF/2)+1 ; saturation
    EndIf
    
    PokeL(*pt,sv)
    EndSelect
    *pt+wBitsPerSample/8 
  Wend
  ProcedureReturn *hsound ; this is very important !!!!!!!!!
EndProcedure 
;
; Now, give the names of your effect and register the adresses of your procedures
RegisterFilter("tremolo2","tremolo2","tremolo2","by Dobro",@trem2CreateButtons (),0,@trem2Compute ())
;              "FrenchName","EnglishName","GermanName","Your name",procedure adress for create button, procedure adress for events managing, procedure adress for filtering computing
dit moi ce que tu en pense !!

testé en 16 et 8 Bits
en 32 bit je sais pas !!!
ZapMan
Messages : 393
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Message par ZapMan »

Beau boulot, les gars !

Je ne vais pas pouvoir tester ça tout de suite parce que ce soir je donne la première d'une pièce de théatre dans laquelle j'incarne le roi Arthur (ça a l'air d'une blague, mais c'est vrai !) et je ne serais pas derrière mon écran. Le pire c'est que j'ai aussi une représentation vendredi et samedi. Ca va être long ! Je me permets de répondre aux messages pendant mes heures de boulot (aprés tout, je suis le patron, je fais ce que je veux) mais je ne pousse pas le bouchon jusqu'à faire joujou sur PureBasic pendant que mes employés bossent.

En tout cas, ça me fait déjà chaud au coeur de voir à quelle vitesse vous avancez. Aprés les petites péripéties décrites ci-dessus, j'ai l'impression que vous avez passé le cap le plus difficile. Reste à voir jusqu'où vos imaginations vont vous amener !

Tel que je vois les choses, il existe deux types de filtres (c'est un peu comme les femmes)
- les "dingues" : ceux qui font quelquechose qu'on avait jamais vu, qui nous surprennent et nous font vibrer et à qui ont pardonne tout, y compris certaines limitations, ou une interface un peu sauvage
- les "utilitaires" : ceux qui correspondent à un besoin courant et dont on ne peut pas se passer. On exige de ceux-là qu'ils soient bien foutus, pratiques, bien présentés et si possible mieux que ceux qu'on peut trouver dans d'autres programmes. Si l'intérêt n'est pas dans la nouveauté, il faut bien qu'il soit dans la perfection !

A vous de choisir votre camp... En tout cas, c'est en raison de cette classification que j'ai conseillé à Dobro, pour la version finale de son Tremolo, de pouvoir choisir la forme et la fréquence de l'onde qui module le signal. Personnellement, je classerai ce type de filtre dans les "utilitaires". Même topo pour Oliv : aussi complexe que puisse paraître le fait de pouvoir changer la fréquence d'un son sans modifier sa durée, ce type de filtre existe dans quasiment tous les logiciels de son. SoundEditor se doit donc d'avoir un filtre qui soit au moins aussi fonctionnel que ce que l'on trouve ailleurs. On doit pouvoir choisir la nouvelle fréquence au % prés et obtenir un résultat sonore qui tienne la route. C'est pas évident à réussir, mais si ce filtre n'atteint pas cet objectif, il me semble présenter peu d'intérêt. Cela dit, je ne fait qu'exprimer mon avis. SoundEditor est maintenant un logiciel "ouvert" et je n'ai pas à jouer les censeurs. A vous de me dire si vous placez la barre à la même hauteur que moi ou pas.

De toute façon, je crois qu'on en est pas encore tout à fait là : sauf erreur, vous en êtes à l'entraînement, pour le moment, non ?

Suite à l'examen du code d'Oliv, j'ai apporté une petite modif à la doc sur le format wave. J'ai ajouté toute la fin de ce paragraphe (à partir de ATTENTION) :
o Taille des datas sous la forme d’un entier long (soit 4 octets). Cette taille est le nombre total d’octets des datas. Elle nous permet, par exemple, de calculer la durée du sample en appliquant la formule :
Durée = Taille des datas/ nAvgBytesPerSec
ATTENTION : la taille des données doit TOUJOURS être un multiple de nBlockAlign. Lorsqu’une modification d’un son amène une modification de la taille des données, on peut « arrondir » la taille à un multiple de nBlockAlign à l’aide des deux opérations suivantes :
NouvelleTaille = NouvelleTaille/ nBlockAlign
NouvelleTaille = NouvelleTaille* nBlockAlign

Cela ne fonctionne bien sur que si NouvelleTaille est un entier, ce qui doit normalement être le cas.
Si par ailleurs, vous avez besoin d’extraire une partie d’un son, les deux extrémités de votre tronçon doivent également être des multiples de nBlockAlign (tous les échantillons extraits doivent être entiers). Vous pouvez « arrondir » vos extrémités avec un calcul identique à celui proposé ci-dessus.
Quand on y réfléchit, ça tombe sous le sens, mais comme le disait l'un de mes maître Jedi : "Ce qui va sans dire, va souvent mieux en le disant".

Oliv, je sais que je te sollicite beaucoup, mais si tu veux bien me faire un copier/coller dans le document qui est en ligne, ça serait cool :D

J'ai trouvé ton...

Code : Tout sélectionner

NTaille_Totale.l = Round(Taille_Header + (Taille_Totale/2),1) 
NTaille_Data.l =  Round(Taille_Data/2,1)
... un peu louche, voilà pourquoi j'ai pondu le petit paragraphe ci-dessus.

Tu me demande pourquoi j'ai mis dans mon filtre : lim = *hsound+44+PeekL(*hsound+40) au lieu de PeekL(*hsound + 4). Je t'accorde que le résultat est (en principe) exactement le même. Si toutefois, dans le cas d'un son mal fabriqué, tel n'était pas le cas, il m'a semblé que j'avais moins de risque en me basant sur la taille des datas que sur la taille du fichier. Je te concède que l'argument est tout à fait discutable.

L'ami Flype m'a envoyé sur ma M.P. des rapports de bugs extrêmement pertinents... accompagnés du code modifié pour corriger le problème. La classe ! Comme tout ça s'est passé dans le secret le plus total, je n'aurais pas à affronter, en public, la honte de mes insuffisances (ça concernait la commande "Fichiers récents" du menu "Fichier"). C'est juste pour vous dire que la fiabilité du programme continue à grimper (comme la trés fameuse bébête qui monte).

De mon côté, je mets la touche finale au "Resampler" qui permet de modifier :
- la fréquence d'échantillonage
- le nombre de bits par échantillon
- le nombre de canaux
sans toucher, bien entendu, à la durée ou à la fréquence du son.

Le code n'est pas trés long mais il est assez pointu et devrait intéresser ceux d'entre vous qui veulent se lancer (ou persévérer, comme Oliv) dans les problèmes un peu compliqués du traitement de signal.
C'est prêt à 95%. Je vous proposerai donc la version 19-4 la semaine prochaine.

Bisous, mes chéris !
Tout obstacle est un point d'appui potentiel.
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Quand on y réfléchit, ça tombe sous le sens, mais comme le disait l'un de mes maître Jedi : "Ce qui va sans dire, va souvent mieux en le disant".

Je n'avais pas compris ça moi :oops: Mais bon, pas grave, maitre Jedi m'a rappelé à l'orde. De plus, en relisant, mon code est faux, il aurait falut faire (selon se que je pensais)

Code : Tout sélectionner

NTaille_Data.l =  Round(Taille_Data/2,1)
NTaille_Totale.l = Round(Taille_Header + NTaille_Data,1) 
Si j'ai fait ça c'est que je me suis dit : je divise le nombre d'échantillon par deux, donc, ça fait une taille data divisée par 2, et à partir de là je n'ai pas été chercher plus loin :oops:
J'ai modifié le document sur mon site
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

alors voilà, comme l'ami Zapman l'a dèjà dit plus haut, je rejoinds la fine équipe :P sur ce projet décidemment passionnant...
bon pour l'instant je suis un peu pris par d'autres projets et mes vacances bientôt, mais je me rendrais aussi utile que possible (corrections de bug par exemple).

J'ai surtout aussi en tête une fonctionnalité qu'il serait intéressant d'intégrer à SoundEditor : un recorder audio !
y a t il qq qui bosse déjà là dessus ?
pour les plus anciens du forum et si vous avez bonne mémoire j'avais posté un programme d'enregistrement audio basé sur les api win32.
Ce qui nous offre de quoi enregistrer les flux audio de notre choix : MIXER, LINE, MICRO, CDAudio... ( bref toutes sources sonores reconnues dans le panneau 'Enregistrement' du programme fournit avec Windows : 'Volum Control' ( vous savez le truc qui se met dans la systray qui permet de faire 'mute' entre autres )

ce sera ma prochaine contribution à SoundEditor si personne ne l'a déjà fait (apparemment non je crois)

puisque tout le monde s'embrasse ds ce post, alors gros bisous à tous :wink:
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

Correction de bug

Quand on veut ouvrir un fichier qui n'est pas un son reconnu, SoundEditor se bloque ! Example, balancer une icone du bureau dans l'interface de SoundEditor, il va se bloquer, obliger de killer le processus.

voici un correctif possible même si Zapman va forcéement devoir adapter un peu :

Code : Tout sélectionner

Procedure.b FileExist(file$)
  FichierId.l = ReadFile(#PB_Any,file$)
  If FichierId
    CloseFile(FichierId)
    ProcedureReturn #True
  EndIf
EndProcedure
;
#SoundType_RAW  = "RAW"
#SoundType_WAV  = "WAV"
#SoundType_AIFF = "AIFF"
;
Procedure.b IsSupportedSound(file$)
  
  Result = #False
  
  Select UCase(GetExtensionPart(file$))
    
    Case #SoundType_AIFF : Result = #False
    Case #SoundType_RAW  : Result = #False
    Case #SoundType_WAV  : Result = #True
    
  EndSelect
  
  ProcedureReturn Result
  
EndProcedure
;
Procedure CreateWindowSE (fn$)
  If FindFreeSession()
    If FileExist(fn$) Or Right(fn$,1)="*"
      If IsSupportedSound(fn$) Or Right(fn$,1)="*"
        WSessions(ActWin)\SoundFileName$=fn$
        n$=GetFilePart(fn$)
        mActWin = ActWin
        StartPos = (ActWin-1)*20
        GetClientRect_ (WSessions(0)\HWin,@WinRect.RECT)
        a = CreateWindowEx_(#WS_EX_MDICHILD, @"mdi_child", @n$, #MDIS_ALLCHILDSTYLES|#WS_HSCROLL, (WinRect\left+StartPos),(WinRect\top+StartPos),(WinRect\right-22-StartPos+(2*ActWin)),(WinRect\bottom-52-StartPos+(2*ActWin)), MDIClient , #NULL, GetModuleHandle_(0) , #NULL)
        ActWin = mActWin
        WSessions(ActWin)\HWin = a
        If CreateStatusBar(WSessions(ActWin)\NWin, WSessions(ActWin)\HWin)
          AddStatusBarField(230)
          AddStatusBarField(150)
          AddStatusBarField(150)
        EndIf
        ShowWindow_(WSessions(ActWin)\HWin , #SW_SHOW)
        ; Merci Regis
        If WSessions(ActWin)\HWin=0
          ShowError()
          CloseSound(ActWin)
        Else
          GetClientRect_ (WSessions(ActWin)\HWin,@WSessions(ActWin)\DrawRect)
          WSessions(ActWin)\DrawRect\bottom= WSessions(ActWin)\DrawRect\bottom - #BotLim
          DragAcceptFiles_(WSessions(ActWin)\HWin, 1)
        EndIf 
        bttndown=0
        ClipCursor_(0)
        Result=1
      Else
        MessageRequester("Erreur / Error","Fichier non supporté")
        Result=0
      EndIf
    Else
      MessageRequester("Erreur / Error","Fichier inexistant")
      Result=0
    EndIf
  Else
    Result=0
  EndIf
  ProcedureReturn Result 
EndProcedure
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

ce serait sympa une petite interface d'importation d'un fichier son brut .RAW en plus du support déjà existant des fichiers .WAV
je rappelle qu'un fichier .raw en matière de son, c'est un fichier sans aucune entête (header) descriptive, c'est l'utilisateur qui choisit lui meme en connaissance de cause les paramêtres du son (résolution,fréquence,mono-stéréo,etc).
Image
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Flype a écrit :alors voilà, comme l'ami Zapman l'a dèjà dit plus haut, je rejoinds la fine équipe :P sur ce projet décidemment passionnant...
bon pour l'instant je suis un peu pris par d'autres projets et mes vacances bientôt, mais je me rendrais aussi utile que possible (corrections de bug par exemple).

J'ai surtout aussi en tête une fonctionnalité qu'il serait intéressant d'intégrer à SoundEditor : un recorder audio !
y a t il qq qui bosse déjà là dessus ?
pour les plus anciens du forum et si vous avez bonne mémoire j'avais posté un programme d'enregistrement audio basé sur les api win32.
Ce qui nous offre de quoi enregistrer les flux audio de notre choix : MIXER, LINE, MICRO, CDAudio... ( bref toutes sources sonores reconnues dans le panneau 'Enregistrement' du programme fournit avec Windows : 'Volum Control' ( vous savez le truc qui se met dans la systray qui permet de faire 'mute' entre autres )

ce sera ma prochaine contribution à SoundEditor si personne ne l'a déjà fait (apparemment non je crois)

puisque tout le monde s'embrasse ds ce post, alors gros bisous à tous :wink:
Si, j'ai regardé ce matin, mais comme c'est ton code, je te laisse le faire :wink: . Il y a 2-3 passages que je ne comprends pas
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

oki, c'est vrai que c pas très simple d'utiliser la dll 'winmm.lib' :x
Image
Avatar de l’utilisateur
Jacobus
Messages : 1520
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

:D Salut à tous,
@ ZapMan : j'ai réussi à obtenir l'ouverture de SoundEditor après le changement de la procédure que tu m'a envoyé, mais le résultat est spécial. #aieaieaie
- Certaines icônes sont hachurées et si je positionne le curseur sur Edition là j'obtiens un vibrato, voire un tremolo, de la fenêtre... très sexy.
- Si j'ouvre un son quelconque, même l'exemple, ça plante avec des messages d'erreur sympa : Trop de fenêtres ouvertes puis Fichier RIFF/WAV non reconnu
- Dans les fichiers récents je trouve ton bureau :
Documents and settings\Luc\Bureau\SoundEditor\01 Suga Suga Baby Bash.wav :??:
===> je ne peux toujours pas me servir de SoundEditor !
Pour tout le monde :
Je bosse sur un éditeur sonore et visuel. dans l'immédiat j'ai fait un lecteur (format wav) muni de multiples claviers (style piano) me permettant d'obtenir une super cacophonie ou une belle mélodie, l'utilisateur pouvant choisir ce qu'il veut faire :mrgreen:
Je travaille donc à l'association des deux (pas simple) pour obtenir un résultat similaire au truc utilisé dans Rencontre du troisième type.
(Ce que je t'ai envoyé ZapMan a évolué, heureusement... devrait avoir dépassé le cap du machin :lol: )
Donc si il y'en a qui sont intéressés qu'ils le disent, je fournirai le code et une appli sous forme d'exe pour une vision rapide du bidule avec les images et les sons indispensables à la vue d'ensemble.
J'aurai bientôt besoin de vous taquiner avec des questions techniques, donc attendez à voir ce topic gonflé par mes questions, de débutant je le rappelle #spin

Je vous laisse, car comme pour beaucoup mon temps est compté, alors à une prochaine fois, dès que possible.
@+ Jacobus ... ah oui j'allais oublier, euh... bisous (pas mon genre :roll: ça )
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Dans les fichiers récents je trouve ton bureau :
Documents and settings\Luc\Bureau\SoundEditor\01 Suga Suga Baby Bash.wav
C'est pareil partout puisque zapinou a laissé ses fichiers récents dans le zip
Répondre