begin process at 2010 02 10 08:39:13
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Multimedia

 > DESSINER UNE COURBE SONORE

DESSINER UNE COURBE SONORE


 Information sur la source

Note :
8 / 10 - par 2 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Multimedia Classé sous :son, dessin, generateur, enveloppe Niveau :Initié Date de création :07/06/2006 Date de mise à jour :10/06/2006 13:41:19 Vu / téléchargé :7 437 / 628

Auteur : ralebol

Ecrire un message privé
Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Cette source permet de dessiné un son à la souris, le resultat sonore obtenu est assé decevant, néanmoins je pence que les sources peuvent se révelé utile, notament les deux unité 'rtoobj.pas' et 'dragpos.pas'.
Cette source est grosomodo mon essais dans le domaine de la création de compossant.


 Conclusion

ATTENTION : Je n'ai pas réusis a terminé 'Tdragpos', (ci quelqu'un sait pourquois je ne peux pas l'instaler dans la vcl sans plantage alors je serais heureux de savoir pourquois), de mon coté sa fait longtemp que j'ais abandoné et que je l'utilise avec 'create(self)'.Donc ne pas l'instalée dans la vcl.

Quant à 'RTOOBJ.PAS', j'en ait fait une class pour pouvoir plus facilement l'integré à different projets.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

10 juin 2006 13:41:20 :
Pris en compte quelques unes des modifs de fOxi, ajouté quelques comentaire (encore trop peu) et un zip contenant les document qui m'on servis à écrire 'rtoobj.pas';

 Sources du même auteur

Source avec Zip Source avec une capture DESSINER DES ENGRENAGES

 Sources de la même categorie

Source avec Zip Source avec une capture SCREENCAMTURE 0.2 par JulioDelphi
Source avec Zip Source avec une capture CHANGEUR DE FOND D'ÉCRAN par John Dogget
Source avec Zip Source avec une capture SCAN THREAD : BASS par Nicolas___
Source avec Zip Source avec une capture PEDALE MULTI EFFETS [BASS ASIO] par Nicolas___
Source avec Zip Source avec une capture POPUP ALERTE STYLE MSN AVAST par strobinateur

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture DECOMPTEUR AVEC ENREGISTREMENT DES OPTIONS par michaelminelli1
Source avec Zip Source avec une capture DESSINE LES FORMES par titout2
Source avec Zip Source avec une capture JOYEUX NOUVEL AN À TOUS ! par Bacterius
Source avec Zip Source avec une capture DIRECTORYDLG (BOÎTE DE DIALOGUE CHOIX DU DOSSIER) par Bacterius
Source avec Zip Source avec une capture CHRONOMÈTRE POUR LE THÉ par Forman

Commentaires et avis

Commentaire de f0xi le 08/06/2006 12:19:42 administrateur CS

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;

Commentaire de f0xi le 08/06/2006 20:16:21 administrateur CS

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.

Commentaire de ralebol le 08/06/2006 21:13:56

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.

Commentaire de f0xi le 09/06/2006 01:59:42 administrateur CS

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.

Commentaire de ralebol le 10/06/2006 13:48:36

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).

Commentaire de f0xi le 10/06/2006 22:58:38 administrateur CS

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.

Commentaire de Zeroc00l le 21/06/2006 14:46:18

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

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

dessin sur un bitmap [ par jlg75 ] J'ai commencé un petit prog de dessin pour mes débuts en DELPHI.Je dessine sur un bitmap (feuille blanche pour l'instant),chargé dans une TImage. J'ut Image dans une TStatusBar !!! [ par MAsterC ] Comment fait-on pour mettre un Tprogresbar et un petit dessin dans l'item TStatusBar ????POUR PLUS DE DÉTAILS ALLER VOIR DANS INTERNET EXPLORER EN BAS Ajouter OnKeyPress à un TPaintBox [ par jlg75 ] J'utilise un TPaintBox pour un programme de dessin, je voudrais qu'il réagisse à l'événement OnKeyPress (ou OnKeyDown) pour sortir de la fonction dess CreateParented et rafraichissement ... [ par almi ] Bonjour à tous,Je cherche à créer un ToolBox dans une application de dessin que je n'ai pas conçu.Pour ce faire, j'utilise la méthode CreateParented e GENERATEUR SQL [ par w38 ] Bonjour afin de gagner du temps, je souhaitais savoir si vous connaissiez un logiciel/composant permettant de générer du code SQL à partir d'un soft q grille de dessin [ par ghassenus ] salut bein je suis débutant en delphi et je souhaite crééer une grille de dessin ( comme papier millimetré )je voudrait que le crayon de dessin ait un dessiner sur un flux vidéo [ par lupoo ] hello,je n'arrive pas à faire apparaître du dessin sur l'image vidéo, elle s'impose toujours par dessus le dessin...comment faire pour inverser cela?m selection de dessin [ par lupoo ] bonjour,g un prog qui dessine une ligne élastique avec la souris. Je peux en faire un nombre indéfini. Mais si je veux reséléctionner une ligne que g Ecrire dans un dessin [ par baygoor ] voila, j ai utiliser un PaintBox pour dessiner un bulletin de notes, grace a de nombreux rectangles (les cellules), mais il faut aue l utilisateur pui Dessin vectoriel (dur dur ???) [ par yoghisan ] Bonjour,Comment peut on dessiner un point ?Comment peut on dessiner une ligne entre deux points ?Comment peut on dessiner une surface entre plusieurs


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,030 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales