MUSICMAKER

Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 - 27 juin 2005 à 22:27
EddiTheHead Messages postés 58 Date d'inscription mercredi 16 février 2005 Statut Membre Dernière intervention 2 juin 2006 - 10 févr. 2006 à 00:54
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/32372-musicmaker

EddiTheHead Messages postés 58 Date d'inscription mercredi 16 février 2005 Statut Membre Dernière intervention 2 juin 2006
10 févr. 2006 à 00:54
Slt,

J'viens de découvrir ton prog. Bonne idée d'utiliser plusieurs mediaplayer pour émettre des sons. C'est plus agréable qu'un playsound et c'est facile à utiliser.
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
2 nov. 2005 à 21:55
Merci Bcp pour ton intervention ...
J'etais sur qu il y avait moyen de raccourcir cette histoire mais je ne savais pas comment ...
En tout cas c est tres simple.
Merci pour augmenter le nbr de CheckBox c est vachement plus facile maintenant enfin moins emmerd*** en tt cas !!!

Ciao
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
1 nov. 2005 à 11:07
Juste un peu de code qui vient suite à un de tes commentaires dans le source :
"Pr ne pas devoir tjs taper la meme chose encore que Qd on voit la suite... C'est Tjs la meme chose [...] surement moyen de faire moins long"

const
NOMBRE_VOIES = 8 ;
NOMBRE_INSTRUMENTS = 8 ;

INSTRUMENT : array[1..NOMBRE_INSTRUMENTS ] of String =
( 'Clap'
, 'Hat'
, 'Drumb'
, 'Rimshot'
, 'Tom'
, 'Woodpipe'
, 'Snare'
, 'bass'
) ;

procedure TForm1.SonoTimer(Sender: TObject);
var
i,j : integer ;
cb : TCheckBox ;
mp : TMediaPlayer ;
begin
with ImageTemps do
begin
for i:=1 to NOMBRE_VOIES do
begin
for j:=1 to NOMBRE_INSTRUMENTS do
begin
mp := TMediaPlayer ( Form1.FindComponent( 'MediaPlayer' + IntToStr(j) ) ) ;
cb := TCheckBox ( Form1.FindComponent( INSTRUMENT[j] + IntToStr(i) ) ) ;
if ( cb.Checked ) and ( left=cb.Left ) then mp.Play ;
end ;
end ;
end ;
end;

procedure TForm1.LitFichier(FileName: String);
var
i,j: Integer;
begin
with TIniFile.Create(FileName) do
begin
for i := 1 to NOMBRE_VOIES do
begin
for j := 1 to NOMBRE_INSTRUMENTS do
begin
cb := TCheckBox ( Form1.FindComponent( Instruments[j] + IntToStr(i) ) ) ;
cb.Checked := ReadBool('save',Instruments[j] + IntToStr(i), False) ;
end ;
end ;
end;
end;

N.B. tous les NxClick pourrait de la même façon etre regroupés au sein d'une unique procedure (c'est à dire une seule procedure OnClick) qui se chargera de faire le traitement adequate en fonction du menu appelant.

Cordialement.
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
13 juil. 2005 à 19:42
Merci,

Tout simplement parce que si on va trop vite,les sons ne sont pas joués
-->on ne sait pas joué 2 sons en meme temps(Du moins pas ac MediaPlayer).

Pour ton idee de BPM je ne l'ai pas fait car je ne sais pas ce que ca vaut.

Si tu as des idées pas de probleme dit les et j'y reflechirai.

Slt
Nico
@+
djmmix Messages postés 152 Date d'inscription lundi 28 juillet 2003 Statut Membre Dernière intervention 29 avril 2009
13 juil. 2005 à 17:47
ta source est nikel mais pk le tempo va jusqu'a trois ????

de plus il serai mieux de le mettre en BPM sa serai plus cool ^^

sinon génial @+++++
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
30 juin 2005 à 11:54
C'est clair que je me rends bien compte que ca a l'air bien+ difficille
meme quasiment impossible , mais comme tu le sais impossible n'est pas francais...
Je vais essayer de me documenter sur TCollection,TMemoryStream et tt le reste qui sont de grands inconnus pour moi!!!
Mais tt ceci ne sera pas pour tout de suite a mon avis...

Sinon qu'est ce que tu en penses?

Slt
Nico
@+
cs_shining Messages postés 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 mars 2012
30 juin 2005 à 02:30
on peut aussi par soucis d'esthetisme écrire celà:

for i := 1 to 8 do
TCheckBox(FindComponent(Format('clap%u', [i]))).Checked :=...

l'idéal pour ton projet, serait de créer un composant 'maître', qui serait un TScrollBox, ensuite chaque élément, sera dérivé d'un TPaintBox, avec align := alTop, et biensûr lorsqu'on clique sur un élément qu'on puisse au moins modifier certaines données, telle que le son à jouer, effets, ect..., je sais celà demande un niveau assez elever !!! , si tu comprends où je veux en venir ça vas faire de ce projet, un excellent logiciel pour le sampling ;), et dance Ejay et compagnie n'aura qu'a bien se tenir :p, bonne continuation, et concernant le TiniFile, je pense que le mieux serait d'utiliser un TCollection, ça permet de travailler en temps réel avec un accès beaucoup plus rapide qu'un fichier *.ini, de plus le TCollectionItem permet d'ajouter autant de propriétés que tu veux, example : les Effets, le nom du son, position, ainsi que des pointeurs des éléments "coller", à celui-ci., et seulement à la fin, lorsque l'utilisateur veut enregistrer son projet, qu'il faudra, non pas mettre ça dans un TiniFile mais créer sa propre structure, exemple

TMusicMakerHeader = record
Sign : array [0..2] of Char; //MMF
ElementCount : integer;
end;

TElementInfo = record
Sound : String;
BeginPos : Integer;// où Int64 si long fichier(tel que *.wav)
EndPos : Integer;//
Effect : TElementEffect;
ect ...
end;

et avec un TMemoryStream où TFileStream, mais pour un gain de rapidité je conseil vivement le TMemoryStream !!!
ensuite c'est simple il faut definir son propre format
exemple MusicMakerFile format fichier *.mmf

MS.position := 0;// ça revient au même que Seek(0 , fromBeginning);
MS.WriteBuffer(Header, SizeOf(TMusicMakerHeader));

bon je sais !!!, c'est beaucoup demander pour un débutant, mais c'est à force de se lancer des défis qu'on progressent :)
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
30 juin 2005 à 00:39
Allez une derniere pour la route...
Voir Description MAJ...
SLT
NICO
@+
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
29 juin 2005 à 23:21
Pas besion de MAJ pr si peux!
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
29 juin 2005 à 23:20
Ca y est j'ai trouve,
Remplacer l'ancienne procedure TForm1.LitFichier(FileName: String);

par celle ci

procedure TForm1.LitFichier(FileName: String);
var
i: Integer;

begin
with TIniFile.Create(FileName) do
begin

for i := 1 to 8 do
TCheckBox(FindComponent('clap' + IntToStr(i))).Checked :=
ReadBool('save','clap' + IntToStr(i), False);
for i := 1 to 8 do
TCheckBox(FindComponent('hat' + IntToStr(i))).Checked :=
ReadBool('save','hat' + IntToStr(i), False);
for i := 1 to 8 do
TCheckBox(FindComponent('drumb' + IntToStr(i))).Checked :=
ReadBool('save','drumb' + IntToStr(i), False);
for i := 1 to 8 do
TCheckBox(FindComponent('rimshot' + IntToStr(i))).Checked :=
ReadBool('save','rimshot' + IntToStr(i), False);
for i := 1 to 8 do
TCheckBox(FindComponent('tom' + IntToStr(i))).Checked :=
ReadBool('save','tom' + IntToStr(i), False);
for i := 1 to 8 do
TCheckBox(FindComponent('woodpipe' + IntToStr(i))).Checked :=
ReadBool('save','woodpipe' + IntToStr(i), False);
for i := 1 to 8 do
TCheckBox(FindComponent('snare' + IntToStr(i))).Checked :=
ReadBool('save','snare' + IntToStr(i), False);
for i := 1 to 8 do
TCheckBox(FindComponent('bass' + IntToStr(i))).Checked :=
ReadBool('save','bass' + IntToStr(i), False);
Free;

end;
end;

Je ne sais pas si c'est la meilleure maniere mais ca marche ne tt cas!
slt
Nico
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
29 juin 2005 à 23:04
AAH,
viens seulement de m'en rendre compte: le fait d'avoir renomme les Checkboxs,
la methode de lecture du fichier INI depose par Japee ne marche +.
"J'aurais mieux fait de rester faineant finalement!!!",lol
Vais regarde a ca.
Slt
Nico
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
29 juin 2005 à 22:16
ce n'est pas lourd si c'est fait au fur et a mesure des checkbox posées sur la form =) mais tout reprendre a la fin oui c'est lourd.
"un bon informaticien est un informaticien paresseux" on m'a dit, donc fait en le moins le plus vite possible pour eviter de revenir sur tes pas ^^

bien joué sinon
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
29 juin 2005 à 21:57
Voila JulioDelphi,
J'ai nomme toutes les checkbox en
Clap1 ... clap2..
hat 1.. hat2 ...
...
Et tu avais raison c'est qd meme + clair ainsi
Merci pr ton conseil
C'est peut etre lourd a tous renommer mais c'est mieux.
Slt
Nico
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
29 juin 2005 à 18:32
Ben tu sais je veux bien les nommer mais a la place de

checkbox1,checkbox2 ...
Tu auras Son 1,Son 2....

Il n'y a pas gd difference(A mon point de vue)
Mais si tu veux je vais le faire.
Slt
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
29 juin 2005 à 18:04
hello
nomme tes composants. avec tes 230 checkbox c'est fouilli ^^
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
29 juin 2005 à 00:58
Voila normalement la source est MAJ
Pr finir J'ai ete + vite que prevu.
J'ai juste rajouté ce que tu m'a mis Japee.
J'en ferai 1 + grosse ds qq tps.
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
28 juin 2005 à 23:53
ouais Merci,c'est sur ca doit etre ca qui monte au crane!!! lol

Je vais suivre tes conseils(qui mon été plusieurs * utiles,si si serieux(Me la joue vieux flatteur la!!! lol))---> Tjs la chaleur,put*** de chaleur!!!

Tjs et encore Merci
Slt
Nico

Mettrais le source a jour peut etre Dmain sinon apres Dmain.
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
28 juin 2005 à 23:27
Je te dirais bien bon courage, mais en fait, tu verras, c'est très simple.
N'hésite pas à consulter l'aide en ligne de Delphi, à TInifile.
Tu peux stocker toutes sortes de valeurs avec les méthodes appropriées (WriteString, WriteFloat, WriteBool, WriteDate, etc...) et les lire (avec ReadString, ReadFloat, etc...).

Dans mon code, plus haut, je me rends compte que j'ai répété de manière inutile l'instruction
PathAppli := ExtractFilePath(Application.ExeName);
qui sert à déterminer le répertoire où s'exécute l'application.
Une fois suffit, dans OnCreate par exemple.

Pfff... la chaleur...

Bonne prog'

japee
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
28 juin 2005 à 23:00
Merci Japee pour ton devouevement,
pas encore eu le temps de tester ce que tu m'as ecrit mais je compte le faire tt de suite.
Faut que je vois comment marche 1 peu les fichiers ini,jamais utilisés.
Slt
Nico
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
28 juin 2005 à 12:27
Ca te permet de lire et d'enregistrer quand tu le désires, par forcément dans FormCreate ou FormClose, j'avais oublié de préciser.
Je vais y arriver...
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
28 juin 2005 à 12:25
En fait, j'ai été un peu vite, il vaut mieux faire ainsi :

private
{ Déclarations privées }
procedure LitFichier(FileName: String);
procedure EnregistreFichier(FileName: String);

uses IniFiles;

const
NbreCheckBox: Integer = 9;

var
PathAppli: String;

procedure TForm1.LitFichier(FileName: String);
var i: Integer;
begin
PathAppli := ExtractFilePath(Application.ExeName);
with TIniFile.Create(FileName) do
begin
for i := 1 to NbreCheckBox do
TCheckBox(FindComponent('CheckBox' + IntToStr(i))).Checked :=
ReadBool('save', 'CheckBox' + IntToStr(i), False);
Free;
end;
end;

procedure TForm1.EnregistreFichier(FileName: String);
var i: Integer;
begin
with TIniFile.Create(FileName) do
begin
for i := 0 to ComponentCount - 1 do
if Components[i] is TCheckBox then
with TCheckBox(Components[i]) do
WriteBool('save', Name, Checked);
Free;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
PathAppli := ExtractFilePath(Application.ExeName);
LitFichier(PathAppli + 'sauve01.ini');
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var i: Integer;
begin
EnregistreFichier(PathAppli + 'sauve01.ini');
end;

japee
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
28 juin 2005 à 12:13
Intéressant, il donne des idées, ce code...

Pour sauvegarder la configuration des CheckBox cochées, tu peux utiliser un fichier ini placé dans ton répertoire. Par exemple :

uses IniFiles;

const
NbreCheckBox: Integer = 9; // le nombre de CheckBoxes

var
PathAppli: String;

procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
PathAppli := ExtractFilePath(Application.ExeName);
with TIniFile.Create(PathAppli + 'sauve01.ini') do
begin
for i := 1 to NbreCheckBox do
TCheckBox(FindComponent('CheckBox' + IntToStr(i))).Checked :=
ReadBool('savecb', 'CheckBox' + IntToStr(i), False);
Free;
end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var i: Integer;
begin
PathAppli := ExtractFilePath(Application.ExeName);
with TIniFile.Create(PathAppli + 'sauve01.ini') do
begin
for i := 0 to ComponentCount - 1 do
if Components[i] is TCheckBox then
with TCheckBox(Components[i]) do
WriteBool('savecb', Name, Checked);
Free;
end;
end;

Bonne prog'

japee
Scalpweb Messages postés 1467 Date d'inscription samedi 13 mars 2004 Statut Membre Dernière intervention 5 mai 2010 4
28 juin 2005 à 00:24
J'utilise Paint aussi tu sais ! lol
Je vais voir ton prog now :-p

@+, Scalpweb
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
27 juin 2005 à 22:27
Je suis ouvert aux commentaires et desole pour les fautes s'il y en a(Et il y en a surement!)
Rejoignez-nous