DESSINER UNE COURBE SONORE

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 8 juin 2006 à 12:19
cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010 - 21 juin 2006 à 14:46
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/38000-dessiner-une-courbe-sonore

cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
21 juin 2006 à 14:46
Je connaissais pas du tout !!
En tout cas je trouve ca vraiment fun !
Je viens de faire mumuse avec pendant 10 minutes ...

Je cherchai a mes heures perdu ce genre de chose (pas très activement, pour ne pas dire "j'attendais de tomber dessus" :) )
J'ai jamais vu ce genre de source sur le site encore... (Attention j'ai jamais dit qu'il n'y en avait jamais eu )
C'est une source simple (pas de truc trop inutile dans lequel est cache le code source utile ), pile ce que j'aime trouver quoi ...
En plus ca permet de tester des application qui reagissent en fonction de la sortie audio, ca nous oblige pas a devoir creer des wav de test, en live c carrement mieux.

P.S.: Merci d'avoir mis a jour l'indentation et l'amelioration du tracé

8/10
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
10 juin 2006 à 22:58
normal que ce soit plus lent vus qu'on utilise un buffer pour eviter les clignotements ...
et vus les performances mediocre de la GDI ...
mais bon a moins d'avoir un pc en choux fleur ...
ça devrait passer vus que sur mon pc (athlon 1.5Ghz et 512mo) je n'ai pas remarqer de ralentissement.

sinon y'a toujours moyen de threadé le dessins ... mais est-ce vraiment utile ? ...

et aussi, oublis pas que le generateur de son bouffe pas mal de ressources vus que tout est calculer par le CPU.
cs_ralebol Messages postés 3 Date d'inscription mercredi 15 juin 2005 Statut Membre Dernière intervention 10 juin 2006
10 juin 2006 à 13:48
Merci, c'est cool.

mais un petit detail me gene :

procedure TDragPos.Paint;
var i,x,y : integer;
Buffer: Tbitmap; // buffer de dessin
begin
// creation du buffer
Buffer := TBitmap.Create;
Buffer.Width := width;
Buffer.Height:= Height;
Buffer.PixelFormat:= pf24bit;

with Buffer.canvas do begin
// on dessine la grille
Draw(0,0,fGridBitmap);

if list.Count <> 0 then begin
for i := 0 to list.count-1 do begin
Pen.Color:=$0a0aff;
amarker := list.Items[i];
x := amarker^.cxpos;
y := amarker^.cypos;
// ellipse, plus rapide que Arc.
Ellipse(x-4,y-4,x+4,y+4);

Pen.Color:=$00FF00;
if i = 0 then
MoveTo(x,y)
else
LineTo(x,y);
end;
end;
end;

J'ai remarqué que le fait de déssiné sur un bitmap puit de l'appliqué sur le panel provoquait un ralentisement de l'apli. L'orsque je deplacais un trackbar je constate que le maskedit corespondant prenait plus de temp pour affiché la nouvelle valeur.

Sinon la grille est vraiment une bonne ideé (c'est presque nécesaire).
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
9 juin 2006 à 01:59
mmm peut etre des erreurs au niveau de la creation ...

deja si je peut te donner un conseil pour la creation de composant :

ordre des sections de la classe :

private
protected
published
public

pourquoi mettre published avant public ? tout simplement pour que dans la fenetre de completion de code les propriétées soit en haut de la liste, mais la tout depend du composant...
parfois on mettras published puis public (pour un composant a poser sur la fiche) ou l'inverse (pour un objet a créer dynamiquement)...


dans l'implementation on devrait trouver dans cet ordre :

constructeur
destructeur
procedure et fonction, Set... Get... (private)
procedure d'appel des evenements (protected)
gestionnaire d'evenements pour les objets contenus dans la classe, Do... (private)
procedure et fonction (public)

ça permet d'obtenir une hierarchie simple et efficace et surtout conventionnelle car la plus souvent rencontrée.
cs_ralebol Messages postés 3 Date d'inscription mercredi 15 juin 2005 Statut Membre Dernière intervention 10 juin 2006
8 juin 2006 à 21:13
1000 * Merci,
Je suis super content de conaitre la fonction 'format()' c'est une revolution pour moi, je me disait bien qu'il devait y avoir un moyen plus simple et moins sougrenu.
Je pence que pas mal de mes applis subiront des modification;
Cella faisais assez longtemp que je gardais cette appli au fond de mon disque,(depuis je manque d'inspiration).
D'appré mes souvenirs, le composant s'installe mais lorsque je la depose sur la fiche ya plein de messages d'ereurs et il ne s'affiche pas bien.
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
8 juin 2006 à 20:16
au fait, je cherche pour ton probleme d'installation mais il semble qu'il n'y ai pas de soucis.

je vais tester plus en amont pour voir ... mais a premiere vue je ne vois pas d'erreur dans la prog.
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
8 juin 2006 à 12:19
hey! amazing!


pas mal du tout, amusant meme, on dirait un vieux generateur de son bien pourris de l'epoque et donc vachement cool! (vraiment)

toute fois coté code, quelques petite amelioration :

on oublis pas d'indenté un peu, de passer des lignes et aussi ajouter des commentaires pour savoir de quoi il en retourne.

procedure TForm1.FormCreate(Sender: TObject);
begin
markers := tdragpos.Create(self);
with Markers do begin
ParentWindow := form1.Handle;
Width := 792;
Height := 380;
startpos := maxword div 2;
EndPos := maxword div 2;
ArrayLength := 820;
DoubleBuffered := true;
end;

sound := soundgen.create;
sound.start;
//sound.vo:=true;

form1.Caption := inttostr(maxword div 2);

markers.ArrayLength := trackbar1.Position;
sound.vfreq := trackbar2.Position/100;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
sound.stop;
sound.free;
markers.free;
end;

function getgoodstr(const bar : byte; const val : integer) : string;
begin
{ format permet de supprimer pas mal de code inutile et donc d'eviter des cycles d'horloge
tout aussi inutile }
case bar of
0: result := format('%.4d',[val]);
1: result := format('%.6d',[val]);
else
result := format('%d',[val]);
end;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
markers.ArrayLength := trackbar1.Position;
maskedit1.Text := getgoodstr(0,trackbar1.position);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
markers.clear;
end;

procedure TForm1.TrackBar2Change(Sender: TObject);
begin
sound.vfreq := trackbar2.Position/100;
maskedit2.Text := getgoodstr(1,trackbar2.Position);
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
sound.vo := checkbox1.Checked;
end;

procedure TForm1.MaskEdit1Change(Sender: TObject);
begin
{ StrToIntDef permet d'eviter les erreurs de saisie }
trackbar1.Position := StrToIntDef(maskedit1.Text,TrackBar1.Position);
end;

procedure TForm1.MaskEdit2Change(Sender: TObject);
begin
trackbar2.Position := StrToIntDef(maskedit2.Text,TrackBar2.Position);
end;



petite amelioration aussi dans la classe TDragPos :

TDragPos = class(tpanel)
private
//++
fGridBitmap : TBitmap;
procedure DoGridPaint;
//++
protected
public
published
end;

// dessine une grille
procedure TDragPos.DoGridPaint;
var IcrH,IcrW,N : integer;
begin
fGridBitmap.Width := Self.Width;
fGridBitmap.Height:= Self.Height;
with fGridBitmap.Canvas do begin
Brush.Color := $706060;
FillRect(Rect(0,0,width,height));

IcrH := Self.Height div 4;
IcrW := Self.Width div 8;

Pen.Color := $c0c0c0;
for N := 1 to 4 do begin
MoveTo(0,N*IcrH);
LineTo(Self.Width,N*IcrH);
end;
for N := 1 to 8 do begin
MoveTo(N*IcrW,0);
LineTo(N*IcrW,Self.Height);
end;
end;
end;

// dessin de la vue de l'enveloppe
procedure TDragPos.Paint;
var i,x,y : integer;
Buffer: Tbitmap; // buffer de dessin
begin
// creation du buffer
Buffer := TBitmap.Create;
Buffer.Width := width;
Buffer.Height:= Height;
Buffer.PixelFormat:= pf24bit;

with Buffer.canvas do begin
// on dessine la grille
Draw(0,0,fGridBitmap);

if list.Count <> 0 then begin
for i := 0 to list.count-1 do begin
Pen.Color:=$0a0aff;
amarker := list.Items[i];
x := amarker^.cxpos;
y := amarker^.cypos;
// ellipse, plus rapide que Arc.
Ellipse(x-4,y-4,x+4,y+4);

Pen.Color:=$00FF00;
if i = 0 then
MoveTo(x,y)
else
LineTo(x,y);
end;
end;
end;
// on dessine dans le canvas de TDragPos
Canvas.Draw(0,0,Buffer);
// on libere le buffer
Buffer.Free;
end;

constructor TDragPos.Create(aOwner:TComponent);
begin
// ++
// creation de la grille
fGridBitmap := TBitmap.Create;
with fGridBitmap do begin
width := self.Width;
height:= self.Height;
PixelFormat := pf24bit;
end;
// dessin de la grille (on ne redessineras pas a chaque fois)
DoGridPaint;
// ++
end;

destructor tdragpos.destroy;
begin
// ++
// liberation de la grille
fGridBitmap.Free;
// ++
end;
Rejoignez-nous