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 »

mon zapiminou d'amour !!


pourquoi dans tes modules dans les

case 8

case 16

case 32

si l'on retire les "sv = Round(PeekW(*pt),0)"

on entend toujours le son !!!???
en principe si j'ai bien compris c'est la que l'on recupere les valeur qui forme le son non ??
avant de le modifier et de le repoker dans le buffer

ou alors j'ai rien pigé !!
8O

une petite info serai bienvenu pour les "pros" dans mon genre :lol: :lol:
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Dobroninouchet a écrit :on entend toujours le son !!!???
Il y a du son parce-que sv a toujours une valeur, même si on ne la change pas, fait un debug et tu verras qu'il y a forcément un chiffre, après c'est sur que le chiffre étant à 0, le son devrait en être modifié :?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

olivinou mon choux

je suis d'accord !!, d'ailleur j'ai bien la valeur 0 (apres avoir viré les peek)
donc je poke du 0 !!! et alors ? ben je suis d'accord avec toi
on ne devrai pas entendre un pet de mouche qui sort du haut parleur
(chez moi du haut hurleur !! (300 watt) ) (mais pas toujours a fond hein !!?)


:? :? quand tu veux zapinou , je sais bien que la nouvelle caledonie
c'est loin et tout et tout ! , mais debout que diable !!
et reste reveillé avec nous !! la vraie heure c'est nous qui l'avons !
alors oublie cette fausse heure qui vous est imposé par ces sauvages
d'australien !!!

lorqu'il fait nuit chez toi il fait jour ici !! en fait chez toi il fait pas nuit
c'est juste une illusion , une sensation , ..... la! la! la! la!

bon je retourne picoler moi !! hips .....
:D



reedit :

en fait j'ai l'impression que l'on travaille sur *pt
qui est une copie de *hsound+44
"*pt=*hsound+44"

mais nous on modifie que *pt (une copie du buffer ) c'est çà ??

mais apres comment *pt modifie le son dans *hsound+44 ??


je nage, je nage !!

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

Message par Oliv »

Dobro a écrit :olivinou mon choux

je suis d'accord !!, d'ailleur j'ai bien la valeur 0 (apres avoir viré les peek)
donc je poke du 0 !!! et alors ? ben je suis d'accord avec toi
on ne devrai pas entendre un pet de mouche qui sort du haut parleur
(chez moi du haut hurleur !! (300 watt) ) (mais pas toujours a fond hein !!?)


:? :? quand tu veux zapinou , je sais bien que la nouvelle caledonie
c'est loin et tout et tout ! , mais debout que diable !!
et reste reveillé avec nous !! la vraie heure c'est nous qui l'avons !
alors oublie cette fausse heure qui vous est imposé par ces sauvages
d'australien !!!


lorqu'il fait nuit chez toi il fait jour ici !! en fait chez toi il fait pas nuit
c'est juste une illusion , une sensation , ..... la! la! la! la!

bon je retourne picoler moi !! hips .....
:D
Même si on additionne (ou soustrait) une valeur, ça fait juste changer la courbe de hauteur, le son n'est en rien modifié, je pensais ça normal moi :( , mais je suppose que ce doit être à cause de la même chose. Quand aux pets de mouches, je peux pas entendre, faut que je demande mais ça doit être "juste" 80ou 100Watt par enceinte avec un ampli qui ne peux pas suivre (60watt) donc je ne peux pas les entendre et là........je peux plus aider :( :( :( :( (surtout que pour pas géner, je suis en ce moment sur un casque à 2€ :P . il y a un moyen d'entendre un pet de mouche sur un ampli marantz de la guerre, une carte son de la même époque et un casque à 2€ ??????
Je retourne picoler aussi moi


edit
J'avais pas vu ton edit:
Quand on fait *pt = *hsound +44, c'est pour ce placer au début des data du son, car les 44 premiers octet c'est le header
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

le son n'est en rien modifié, je pensais ça normal moi Sad ,

ben non en principe par exemple si on balance a coup de poke des 0 dans le buffer sensé avoir les data sonore on devrai avoir une courbe plate !! si tenté qu'une courbe soit plate !!
on ne devrai rien entendre !! or la on entend parfaitement l'echantillon (wav)
chargé !! c'est ça qui est louche !!

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

Message par Backup »

edit
J'avais pas vu ton edit:
Quand on fait *pt = *hsound +44, c'est pour ce placer au début des data du son, car les 44 premiers octet c'est le header

oui on se place au debut mais en utilisant *pt comme reference pour poker
on modifie le contenu de l'adresse *pt pas de *hsound +44 non ??

ah bah oui *pt est une adresse point barre pas une variable !! :D

quel idiot !! enfin ça n'empeche pas le blem cité plus haut !!
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

oui, mais t'as pas lu ce que j'ai mis, au lieu de tout supprimer, rajoute un peu :D . "sv = Round(PeekW(*pt) + 45,0) ne change rien non plus sur le son 8O
Avatar de l’utilisateur
ZapMan
Messages : 460
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Message par ZapMan »

Mes petits chéris,

Me revoilà. Désolé d'avoir besoin de dormir. J'ai un peu rattrapé ma petite nuit d'avant hier !
Oliv a écrit :sv = Round(PeekW(*pt) + 45,0) ne change rien non plus sur le son
Ca ne change rien à l'écoute du son mais on voit bien que ça décale le son vers le haut à l'affichage. L'oreille ne perçoit que les vibrations, donc si tu ajoute une constante (la valeur 45) à ton signal, ça ne s'entend pas. Mais si Dobro regarde la membrane de son haut-parleur 300 watts à la loupe, il pourra constater qu'elle n'occupe pas (en moyenne) la même position avec sv = Round(PeekW(*pt) + 45,0) que avec sv = Round(PeekW(*pt),0). En tout cas, dans la théorie, et si sa chaine à une qualité parfaite (en vérité, tous les équipements éliminent les sons dont la fréquence est trop haute ou trop basse pour être audible. Une valeur constante correspond à une fréquence de 0 hertz, ce qui est vraiment trés trés bas !!!)

Pour Dobro : il doit y avoir un blème dans ton code modifié (pas celui qui est sur le forum). Chez moi, si je fais PokeW(*pt,0) (ou si je comment le PeekW, comme tu le suggère), j'obtiens bien un beau silence spectral (et doré)... à condition de travailler sur un son 16 bits !!!!!!
Comme le même code est répété 3 fois en fonction des 3 formats possibles de son, quand tu fais une manip, il faut la faire 3 fois !! Ai-je mis le doigt au bon endroit ?
Deux autres trucs auxquels il faut penser :
- les fichiers Include ne sont pas automatiquement enregistrés quand on lance la compilation du programme principal. Enregistre bien ton programme avant de faire un essai
- le curseur de mixage doit être sur Wet(100%) pour être sur ne n'avoir plus aucune trace du signal d'origine.

Concernant les sons 32 bits, il s'avère que la fonction PlaySound_ de Microsoft est bêtement incapable de lire ce format. J'ai essayé sans succès de faire un player avec DirectX 8 sur la base d'un code de Danilo. Et puis finalement, j'ai essayer la fonction PlaySound de PureBasic (basée sur DirectX 7, d'aprés la documentation) qui marche à la perfection. Ma première version de SoundEditor utilisait cette fonction, c'est pour ça que j'étais parti du principe que le programme marchait avec les sons 32 bits. Et puis, je ne sais plus pour quelle raison j'avais voulu utiliser le PlaySound de l'API à la place... C'est donc la queue entre les jambes que je me prosterne humblement devant Fred. Reste le problème de visualisation dans le module filtre (le son est correctement visualisé dans la fenêtre normale) que je n'ai pas eu le temps de régler. Ca doit pas être grand chose.

J'en profite pour répondre à Oliv qui m'a demandé comment modifier la fréquence d'un son sans changer sa durée.
C'est pas simple !!!!!!
Prenons un exemple basic : un signal triangulaire d'une durée trés courte (mettons 1 milliseconde). Supposons qu'on ait seulement pu loger deux périodes dans cette durée (deux montées et deux descentes). Si tu veux doubler la fréquence de ce signal, tu veux en fait loger 4 périodes dans la même durée. D'où sors-tu les deux périodes qui te manquent ? Dans cet exemple, on peut se contenter de recopier les deux premières périodes et le tour est joué. OK. Maintenant, supposons que tu veuille doubler la fréquence d'un signal complexe constitué d'un mélange de son (comme un morceau de musique, par exemple). Où va tu pêcher les périodes à recopier dans tout ce fatra ? Là, je lis dans ton oeil gauche que tu commence à piger et à paniquer. Cool, man, relax, tire doucement sur le tarpé, ça va aller.
Honnêtement, je n'ai pas encore essayer de m'attaquer à ce problème, mais j'ai une idée :
On peut considérer qu'on à le droit de dupliquer toutes les séquences situées entre deux passages par zéro. On pêche ces séquences de la façon la plus régulière possible tout au long du signal d'origine et on les duplique jusqu'à obtenir la durée souhaitée. Je suppose qu'il vaut mieux éviter les séquences trop longues qui peuvent être constituées d'une porteuse (signal principal) de basse fréquence à laquelle des signaux de haute fréquence sont peut-être additionnées.
Il faudrait voir ce que ça donne en pratique. Ce problème est peut-être un peu trop prise de tête pour une première approche d'un travail sur le son. Mais, bon, si tu es du genre têtu et maso comme ton éminent professeur, tu peux y arriver. En tout cas, ne te dégoute pas tout de suite avec un truc comme ça.

Oliv m'a aussi fait remarqué que ma documentation sur le son ( http://www.freesoundeditor.com/download ... matwav.zip ) prétend que les sons codés en 8 bits on un point zéro positionné à +127 alors que dans les filtres que j'ai écrit, on peut lire "8 bits signals have a mid point at 128". Je crois que nous sommes tous d'accord pour dire que le valeur maximum d'un octet est 255 et que la moitié de 255, c'est 127,5. Selon les documentations que j'ai pu trouver sur le net, le point milieu est positionné à 127 ou à 128. Il y a peut-être une norme officielle qui définit ça. En tout cas, en attendant et aprés réflexion, j'ai décidé d'opter pour la valeur 127 indiquée dans ma doc. Je suis en train de corriger mes filtres pour être plus cohérent. Dans tous les cas, cela n'a pas d'incidence audible sur le son.

Oliv nous a proposé un lien :
http://perso.wanadoo.fr/vb-audio/us/sp/ ... ffect0.htm
que je recommande chaudement à tous ceux qui veulent en savoir plus sur le traitement du son. C'est remarquablement bien écrit. D'ailleurs, j'ai envoyé un mail au concepteur pour le féliciter.

Toute la communauté PureBasic attend une version évoluée du Tremolo de Dobro (ils n'ont pas encore de forum en Turquie, mais je suis sûr que si c'était le cas, ils en parleraient déjà). Alors, ça vient ?



ETAT DES LIEUS

Participants au projet SoundEditor


Chef de projet :
- Zapman (pour le moment)

Déclarés partants :
- Zapman : nettoyage du code existant, resampler, Fade In/Out, et heu... plein d'autres trucs
- KarlKox : encodeurs et décodeurs et sûrement d'autres trucs
- Oliv : tout ce qui l'éclate
- Flype : le système de plugin
- Dobro : à temps partiel sur des modules
- Jacobus : n'a pas précisé. Disons qu'il va tout refaire en mieux

Réservent leurs réponses :
- Le Soldat Inconnu
- Heis Spiter

Ont déjà participé au debuggage :
- Zapman
- Le soldat Inconnu
- Chris
- cederavic
- Flype
- Dobro
- Rings (forum anglais)
- Lars et NickTheQuick (forum allemand)
- j'espère n'avoir oublié personne

Ont déjà créé une fonction ou un module :
- Zapman
- Dobro

M'ont encouragé :
Ouhla ! Y'a trop de monde ! Merci à tous pour vos encouragements.


Ouf... j'ai réussi à terminer mon message sans dépasser la limite de 62535 caractères que nous impose ce forum.
Dernière modification par ZapMan le mar. 14/sept./2004 1:55, modifié 2 fois.
Tout obstacle est un point d'appui potentiel.

Bibliothèques PureBasic et autres codes à télécharger :https://www.editions-humanis.com/downlo ... ads_FR.htm
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

il doit y avoir un blème dans ton code modifié (pas celui qui est sur le forum). Chez moi, si je fais PokeW(*pt,0) (ou si je comment le PeekW, comme tu le suggère), j'obtiens bien un beau silence spectral (et doré)... à condition de travailler sur un son 16 bits !!!!!!

la on a un souci !!!

j'utilise Xp pro

je sauvegarde mon module modifié avant chaque compil

je prend mon "vibrato" je commente les lignes comprenant l'instruction "peek"

je sauvegarde mon module modifié
je lance l'apli principale
je charge mon son (16Bits)
je choisi mon module "vibrato"
et je met en lecture !
la j'entend le son comme si mon module n'y faisait rien !!
(alors que du fait d'avoir retiré les peek, je poke des 0 !!)
et ce , que le curseur soit a 100% ou pas , n'y change rien !!
alors que je devrai rien n'entendre !!!
j'ai mem essaye ça

Code : Tout sélectionner

 sv=sin(compt*50/1024)*100 
je voulais qu'il affiche une courbe sinuzoidale
(en utilisant mon module vibrato turemplace la ligne qui contien le peekw
par ça )

en principe je poke sv , donc une sinuzoidale
que l'on devrai appercevoir dans la courbe du logiciel
et bien non !!!!
on appercois le son d'origine comme si de rien n'etait !!!

@oliv : fait l'essai chez toi pour voir !!

du fait il m'est difficile de developper un module
alors que mes modifications ne change pas grand chode a l'histoire
si ce n'est comme pour oliv l'amplitude !! c'est le seul paramettre
que l'on peut toucher !!!
@oliv : fait sv = Round(PeekW(*pt) * 45,0)
la ça va changer l'amplitude !!! (le volume a l'ecoute)
:)

ps pour te prouver que ma formule affiche bien une sinuzoidale
voici mon code "ossiloscope" qui me sert de temoin !!

Code : Tout sélectionner

#dobro=1
#Police=1
#Sprite=1
; ***********************************
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
WindowID = OpenWindow(1, 0, 0, EcranX, EcranY,  #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered , "hello") 

WindowID = WindowID(1) 
Result = OpenWindowedScreen(WindowID,0,0, EcranX, EcranY, 1, 0,0)


;  creation d'un Sprite
CreateSprite(#Sprite, 50, 50)  ; cree un sprite
StartDrawing(SpriteOutput(#Sprite) ) ; on dessine dedans
Box(0, 0, 50, 40,RGB(255,0,255) ) ; un carre violet
StopDrawing() 
For spr=1 To 5
CreateSprite(spr, 50, 50)  ; cree un sprite
StartDrawing(SpriteOutput(spr) ) ; on dessine dedans
Box(0, 0, 50, 40,RGB(255,0,255) ) ; un carre violet
StopDrawing() 
Next spr
Resultat = InitMouse() 

Repeat
   ExamineMouse() 
    Event=WaitWindowEvent()
 
        StartDrawing( ScreenOutput()) 
        ;Plot(WindowMouseX(), WindowMouseY(), RGB(255,255,255)) 
        
        compt+1
        y=Cos(compt*50/1024)*100 ; <------ ICI FORMULE A TESTER
        ;sin*compt*phase/nmbr de point *amplitude
        
        Box(compt, y+200,2, 2 ,RGB(255,255,255)) 
        
        StopDrawing() 
        FlipBuffers():; affiche l'ecran
  
    If MouseButton(2)
        End
    EndIf  


;FlipBuffers():; affiche l'ecran
;ClearScreen(0, 0, 0) :;efface l'ecran

  Until Event=#PB_Event_CloseWindow 
:D
Avatar de l’utilisateur
ZapMan
Messages : 460
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Message par ZapMan »

Y'a un truc pas logique, Dobro !

Tu ne peux pas avoir à la fois la possibilité de modifier le son (avec ton sv = Round(PeekW(*pt) * 45,0)) et pas la possibilité de le mettre à zéro ! Il n'y a rien de magique, la-dedans. Le son que tu écoute est bel est bien le résultat de toutes les valeurs que tu as stocké ou modifié avec ton filtre. Si tu les mets à zéro, tu ne PEUX PAS continuer à entendre quelque chose, ou alors, l'explication est dans la quatrième dimension (ou la cinquième, je sais pas, j'ai toujours confondu...).

D'ailleurs, ton tremolo fait bien baisser le volume jusqu'à zéro, à certains moments (trés courts, d'accord, mais on entends bien que le son baisse, par moment)

Envoie-moi ton code censé fabriquer du silence, que je regarde ça.

Code : Tout sélectionner

; FILTRE SINUS - SINUS FILTER
; 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 TremCreateButtons ()
      #ComboGadget=1 ; gadgets can have any number from 1 to 399.
                     ; les gadgets peuvent avoir un numéro compris entre 1 et 399.
      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,0)  
        sv=Sin(compt*50/1024)*100
        If sv>127 ; saturation
            sv=127
        EndIf
        If sv<-127
            sv=-127
        EndIf
        sv+128 
        PokeB(*pt,sv) 
      
      Case 16 
         ; Tremolo by dobro 
        compt+sens
        If compt=0
            sens=1
        EndIf
        If compt>10000*(vol/10)
            sens=-1
        EndIf 
        ; sv = Round(PeekW(*pt)*compt/10000,0)
        sv=Sin(compt*50/1024)*100  
        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
        ; Tremolo by dobro 
        compt+sens
        If compt=0
            sens=1
        EndIf
        If compt>10000*(vol/10)
            sens=-1
        EndIf 
        ;sv = Round(PeekL(*pt)*compt/10000,0)
        sv=Sin(compt*50/1024)*100   
        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("Sinus","Sinus","Sinus","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
Me fabrique bien une magnifique sinusoide !!
Tout obstacle est un point d'appui potentiel.

Bibliothèques PureBasic et autres codes à télécharger :https://www.editions-humanis.com/downlo ... ads_FR.htm
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

euhhhh, c'était des bêtises :oops: (voir ma réponse)
Dernière modification par Oliv le mer. 04/août/2004 16:59, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

tout a fait !!!


et on est pas dans twilhightzone !! <--- chui pas sur de l'ortographe

:lol: :lol:


bref oliv et moi on a le meme comportement !! donc c'est pas du hazard
c'est scientifiquement prouvé !!!
:D
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

NAN j'ai mis une énorme bétise, prend mon code et fait un mixage à 100% et là, pas aucun pet de mouche :wink: . Je suis vraiment *** moi :twisted: . Bon pour me rattrapper, le filtre pour la vitesse renvoi maintenant un fichier à la taille du son :wink: , je te l'enverrai quand il supportera le stéréo et plus
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ha bah non !! t'a raison maintenant ça marche !!
j'avais peut etre oublie de mettre a 100%


@zapman : pas trop dur de trouver du pain et de l'essence sur ton cailloux isolé au millieu de pas grand choses ? :D
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

Salut tout le monde :)
Je n'ai pas eu le temps de tout lire et je n'avais plus d'acces au net (merci wanadoo ...) mais me revoila.
Je profite de mon passage éclaire pour ma 1ere contribution en attendant d'ajouter l'ogg/mp3 :

Code : Tout sélectionner

; EXTRA STEREO - EXTRA STEREO FILTER (hmm or something like that ^_^ )
; By KarLKoX
;
; 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 VCreateButtonsExtraStereo ()
      #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"
      ComboBoxGadget(#ComboGadget,100,23,70,150)
      FontID1 = LoadFont(1, "Arial", 16, #PB_Font_Bold)
      SetGadgetFont(#ComboGadget, FontID1)
      For lcg=1 To 8
        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 VComputeExtraStereo (*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
  Protected avg.f, tmp.f, ldiff.f, rdiff.f
  intensity = GetGadgetState(#ComboGadget)
  nChannels.w=PeekW(*hsound+22)  
  wBitsPerSample.w=PeekW(*hsound+34)
  *pt=*hsound+44
  lim = *hsound+44+PeekL(*hsound+40) 
  If (nChannels = 1) : ProcedureReturn *hsound : EndIf  ; process only stereo sounds ... (you know why :) )
                                                        ; traite les sons stereo uniquement (devinez pourquoi :) )
   While *pt<=lim
    Select wBitsPerSample
      Case 8
        
          sv  = PeekB(*pt) & $FF
          sv2 = PeekB(*pt+1) & $FF
          ;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
          avg   = (sv + sv2) / 2
          ldiff = sv - avg
          rdiff = sv2 - avg
          tmp   = avg + ldiff * intensity
          sv    = tmp
          If sv > 127 ; saturation
            sv  = 127
          EndIf
          If sv < -127
            sv  = -127
          EndIf
          sv + 128
        
          tmp   = avg_b + rdiff_b * intensity
          sv2   = tmp
          If sv2 > 127 ; saturation
            sv2 = 127
          EndIf
          If sv2 < -127
            sv2 = -127
          EndIf
       
          PokeB(*pt,sv)
          *pt = *pt+wBitsPerSample/8           
          PokeB(*pt,sv2)
          *pt = *pt+wBitsPerSample/8           
          
     Case 16

           sv    = PeekW(*pt)
           sv2   = PeekW(*pt+2)
          
          avg   = (sv + sv2) / 2
          ldiff = sv - avg
          rdiff = sv2 - avg
          
          tmp   = avg + ldiff * intensity
          If tmp > 32767
            tmp = 32767  ; saturation
          EndIf
          If tmp < -32768
            tmp = -32768 ; saturation
          EndIf
          sv    = tmp
          
          tmp   = avg + rdiff * intensity
          If tmp > 32767
            tmp = 32767  ; saturation
          EndIf
          If tmp < -32768
            tmp = -32768 ; saturation
          EndIf
          sv2   = tmp
          
          PokeW(*pt,sv)
          *pt = *pt+wBitsPerSample/8 
          PokeW(*pt,sv2)
          *pt = *pt+wBitsPerSample/8
        
         
      Case 32
          
          sv    = PeekL(*pt)
          sv2   = PeekL(*pt+4)
          
          avg   = (sv + sv2) / 2
          ldiff = sv - avg
          rdiff = sv2 - avg
          tmp   = avg + ldiff * intensity
          If tmp > 2147483647
            tmp = 2147483647  ; saturation
          EndIf
          If tmp < -2147483648
            tmp = -2147483648 ; saturation
          EndIf
          sv    = tmp
          
          tmp   = avg + rdiff * intensity
          If tmp > 2147483647
            tmp = 2147483647  ; saturation
          EndIf
          If tmp < -2147483648
            tmp = -2147483648 ; saturation
          EndIf
          sv2   = tmp
          
          PokeL(*pt,sv)
          *pt = *pt+wBitsPerSample/8 
          PokeL(*pt,sv2)
          *pt = *pt+wBitsPerSample/8 

    EndSelect
  Wend
  ProcedureReturn *hsound ; this is very important !!!!!!!!!
EndProcedure 
;
; Now, give the names of your effect and register the adresses of your procedures
RegisterFilter("Extra Stereo","Extra Stereo","Extra Stereo","by KarLKoX",@VCreateButtonsExtraStereo(),0,@VComputeExtraStereo())
;              "FrenchName","EnglishName","GermanName","Your name",procedure adress for create button, procedure adress for events managing, procedure adress for filtering computing
Et un bout de quelque chose qui ressemble à un plugin (testé avec succes) :

Code : Tout sélectionner

#include <windows.h>

/* embryon de plugin
   ca va surement changer vers une struct qui contiendra dsp_struct + les pointeurs sur fonction (init, process, close ...)
*/
#define API __stdcall
#define EXPORTAPI __declspec(dllexport)
#define	clip(a) (short)((a<=-32768)?-32768:((a>=32767)?32767:a))

/* 
je pense passer par une structure que je passerais en param
ca me permettra d'avoir plusieurs instance d'effet
typedef struct
{
	void *	data;
	int    	size;
	int		res;
} dsp_struct;
static dsp_struct *dsp;
static float cfg_intensity = 2.0;
*/

/* avoid stupid CRT silliness */
BOOL WINAPI _DllMainCRTStartup(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
{ 
	return TRUE; 
}

void process_char(char *buffer, int samples)
{
char  avg, tmp, ldiff, rdiff;	
	
}

void process_short(short *buffer, int samples)
{
short avg, tmp, ldiff, rdiff;		
short *data=(short*)buffer;

	//for(n=0; n < samples<<1; n+=2) 
	for(;samples;samples-=4, data+=2) /* plus rapide ? */
	{
		avg = (data[0] + data[1]) / 2;

		ldiff = data[0] - avg;
		rdiff = data[1] - avg;

		tmp = avg + ldiff * cfg_intensity;

		data[0] = clip(tmp);

		tmp = avg + rdiff * cfg_intensity;
		data[1] = clip(tmp);

	}
}

void process_int32(__int32 *buffer, int samples)
{
__int32  avg, tmp, ldiff, rdiff;	

}

void process_float(float *buffer, int samples)
{
float  avg, tmp, ldiff, rdiff;


}


EXPORTAPI void API process_fx(void *buffer, int samples, int res)
{
char      *char_sample_buffer = (char*)buffer;
short     *short_sample_buffer = (short*)buffer;
int         *int_sample_buffer = (int*)buffer;
float	*float_sample_buffer = (float*)buffer;

	switch (res)
	{
		case 0:
			process_char(char_sample_buffer, samples);
			break;
		case 1:
			process_short(short_sample_buffer, samples);
			break;			
		case 2:
			process_int32(int_sample_buffer, samples);
			break;			
		case 3:
			process_float(float_sample_buffer, samples);
			break;
		default:
			process_short(short_sample_buffer, samples);
			break;			
	}

	
}

EXPORTAPI void API init_fx(int param)
{
	cfg_intensity = (float)param;
}
"Qui baise trop bouffe un poil." P. Desproges
Répondre