Forum Liberty Basic France

Jeux » Un mini BeatBox Looper. un peu comme une pédale de loop...
Le 01/11/2012 à 10h25

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Un jour j'ai vu à TARATATA une nana, seule avec sa guitare utiliser une pédale de loop, pour jouer sa chanson.
J'ai trouvé ça gonflé vu que c'était en direct et génialissime quant au résultat :top :top

Suite au 'sujet' de Roland : le Beat_box, et aux fichiers sons qu'il partage, et aussi suite au petit piano, j'ai pensé essayer de faire un Mini Beatbox Looper...

Voici ma base de travail : MiniBeatBoxLooper.zip

Au pire ça pourra servir de métronôme :top

L'objectif :

- on clique sur un ou plusieurs boutons pour élaborer une base rythmique.
- dès qu'on est content de ce qu'on entend, on décide de le rejouer mais en enregistrant en pressant 'B'.
- quand on arrête l'enregistrement (en pressant à nouveau sur 'B'), la "phrase musicale" se répètera indéfiniment en respectant le tempo c'est à dire un nombre de battement par minute (bpm).
_ on peut alors y ajouter d'autre sons selon la même procédure... en temps réel, enfin ça c'est l'objectif :siffle car je ne sais pas du tout si c'est faisable en JB !

La lenteur relative du langage JB pourrait bien rendre la chose extrêment difficile !

Mais on peut au moins essayer de trouver la solution optimale d'y parvenir, on verra bien la suite :siffle

Mon soucis pour l'instant : quelles données essentielles (au minimum) le code devra mémoriser :
Hormis évidemment le nom du son, je pense à l'écart en temps (millisecondes) depuis le dernier son joué...

Pour enregistrer la première "phrase musicale" ; pas de difficulté particulière.
Le soucis sera d'insérrer dans celle-ci les ajouts de son en temps réel...!

Le code devra connaitre la place dans le temps (mais par rapport à quand ? ) que devra prendre le nouveau son inserré, c'est à dire mémoriser la durée depuis le dernier son joué (entendu) pour pouvoir respecter toujours l'ordre manuellement imposé par le joueur...!

A suivre...

@+



Edité par cassiope01 Le 01/11/2012 à 10h31
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 01/11/2012 à 10h33

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2204
Houla la ! Toi, tu est trop gourmand !
déjà, enregistrer les durées en temps réel, ça parait duraille. il faut y intégrer des coeff de correction.
Mais ajouter des éléments aprés coup ! Cela relève de la mission impossible..
____________________
Roro

   
Le 01/11/2012 à 10h51

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2204
Ici, pas moyen de le faire fonctionner. J'ai essayé toutes les combinaisons d'appui: b/bstop/play, b/b/play....




Edité par Roland Le 01/11/2012 à 10h53
____________________
Roro

   
Le 01/11/2012 à 11h11

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Roland:
Ici, pas moyen de le faire fonctionner. J'ai essayé toutes les combinaisons d'appui: b/bstop/play, b/b/play....

m'enfin Roland, tu n'as pas lu que c'était ma "base de travail" : l'aspect enregistrement et encore moins "looper" n'est pas encore programmé vu que c'est justement l'objet de la discution : comment s'y prendre au mieux et aussi selon les possibilités de JB !!!!!!!

Qu'est-ce que tu entends par "coefficiant de correction" ?

Pour l'instant il n'est pas question de corriger le rythme enregistré par le joueur suivant l'exacte rythme du métronôme !
Il s'agit juste d'enregistrer ce que fait le joueur en donnée brute et de le restituer, mais la boucle de répétition, elle, doit certainement suivre le bpm.

@+



Edité par cassiope01 Le 01/11/2012 à 11h27
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 01/11/2012 à 11h21

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Roland:
Houla la ! Toi, tu est trop gourmand !

C'est toi qui dis ça :heink

Roland:
déjà, enregistrer les durées en temps réel, ça parait duraille.

C'est ce que je fais déjà avec le petit piano, tu n'as pas remarqué ?

Roland:
Mais ajouter des éléments aprés coup ! Cela relève de la mission impossible..

C'est ça le défi.
On verra bien ce qu'en pensent les Anglophones... ;)
Ils m'ont toujours aidé, et trouvés de très bonnes idées ou astuces...
C'est peut-être plus simple qu'il n'y parait :s
Va savoir ;)

@+



Edité par cassiope01 Le 01/11/2012 à 11h29
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 01/11/2012 à 14h03

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2204
Houla ! mais en effet ! je n'avais pas fait gaffe, occupé que j'étais par mes propres "petits", que ton piano enregistrait les durées.
Il faut partir de là.
Tu peux déjà, en remplaçant les waves "piano" par les "percus", avoir l'enregistrement / restitution.
Sur les séquenceurs, les percus sont associées aux touches (en mode "piano roll", et aux lignes de la portée, en mode "partition".
Mais quel avantage y'a t-il à utiliser une chaine plutot qu'un tableau: (nom / durée,n) ?
Insérer des évenements est possible, mais pendant la restitution, je doute.
____________________
Roro

   
Le 01/11/2012 à 16h43

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2204
Juste un conseil:
Pour que le truc soit jouable, je pense qu'il faut que les plages (boutons) soient plus petits, et disposés en cercle.
Ta technique des sprites, qui permettent le jeu par simple passage de la souris serait nickel.



Edité par Roland Le 01/11/2012 à 16h45
____________________
Roro

   
Le 01/11/2012 à 19h15

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Roland:
Mais quel avantage y'a t-il à utiliser une chaine plutot qu'un tableau: (nom / durée,n) ?

Ben je sais pas encore.
Ca dépend certainement de la façon de les exploiter ensuite.
Trouver quelque chose au milieu d'une chaine de caractère est beaucoup plus rapide (avec INSTR(string1, string2, starting) par exemple) que de chercher dans un tableau par exemple, comme inserrer quelque chose au milieu d'ailleurs.
Par contre si on veut trier, un tableau sera évidemment plus pratique bien sûr.
Dans mon cas j'ai bien peur d'avoir besoin des 2 aspects...!

Pour l'instant, j'essaye de comprendre les histoires de 1/8, 1/4, 1/2 notes dans le paragraphe "enregistrement de boucle" de mon Kaossilator : j'y comprend rien ;)
A 120 bpm (battement par minute) par exemple on a donc 1 battement toute les 1/2 seconde donc tout les 500 millisecondes.
A 120 bpm, quand j'appui sur le bouton "enregistrer" je vois défiler un chiffre de 1 à 8 (1/8 de note) puis retour de 1 à 8 etc... mais je ne parviens pas à évaluer la durée exacte de cette boucle de 1 à 8... à quoi correspond 1/8ème de note ?
Ca a un lien avec le paramètre BPM mais c'est pas encore très clair pour moi.

Je sens bien qu'il faut établir une base de temps pour enregistrer tout ça, indépendamment du moment où le joueur va presser un bouton, mais je ne sais pas trop comment m'y prendre.

La lenteur d'exécution des commandes JB est certainement un problème, mais il s'agit de quelques millisecondes, et je sens qu'en s'y prenant bien, on peut quand même jouer des sons et enregistrer des données (un nom et une intervale par exemple) pour qu'un nouveau son puisse venir s'exécuter au milieu des autres...!

@+



Edité par cassiope01 Le 01/11/2012 à 19h22
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 01/11/2012 à 20h55

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2204
Citation:
les histoires de 1/8, 1

c'est simple: 60 à la noire--> 60 noire/mn. Blanche =2 noires, ronde=2 blanches
croche= 1/2 noire, double croche=1/2 croche, triple croche= 1/2 double croche
Méééh sur certaines partitions, c'est 60 à la croche -->60 croches/mn.
Citation:
le paramètre BPM

ça c'est le" temps" dans la valse, y'a 3 temps( 3 noires), dans la plupart du reste , c'est 4 temps (4 noires ou 2 blanches,ou une ronde, ou 8 croches, ou 16 doubles croches)
Si on touche au BPM, forcément le nombre de noires ou de croche à la mn bouge (puisque le nombre de noires ou croches par temps est fixe )
Pour résumer: les histoires de croches et autre sont utilisés par les musiciens (partitions)
Les histoires de BPM sont utilisés dans les séquenceurs et tout le matos électronique.
mais c'est la méme chose ;)
Dans les matos haut de gamme, il y a les deux.(d'où, tes: 1/4 1/8)
Citation:
Je sens bien qu'il faut établir une base de temps

C'est pour ça que dans mon" beat box", j'ai fait une ligne de temps, découpée en 64 rondelles de valeurs fixe
( 4 fois 16 double croches) soit 4 temps complets, qu'on ouvre séparément avec les boutons "temps 1",2, 3, 4
et qu'il faut placer les instruments aux bons endroits.
Citation:
mon Kaossilator : j'y comprend rien

Si ça peut te rassurer, j'ai un Korg PAX 1 ça fait six ou sept ans, et j'ai pas encore tout compris. :heink



Edité par Roland Le 02/11/2012 à 00h13
____________________
Roro

   
Le 02/11/2012 à 10h09

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Et ça fait combien en millisecondes ?

Dans le kaossilator je peux régler la "longueur de la phrase" : 1/16, 1/8, 1/4, 1/2, 1, 2, 4, 8.
Ca fait combien en millisecondes ?
De plus, ils disent que si les BPM sont entre 20 et 37.5 la longueur actuelle de lecture et d'enregistrement sera 1/4 de la longueur indiquée, entre 37.5 et 75.0, la longueur actuelle d’enregistrement et de lecture sera 1/2 de la longueur indiquée.
Par défaut, le kaossilator est à 120 bpm.

Mon idée :

La boucle de PLAY ne doit pas contenir de timer, car le programme ne peut rien faire pendant ce temps.
Donc la boucle de PLAY doit tourner tant que la variable play=1 et qu'il y a quelque chose à jouer bien sûr.
Durant son exécution, je mémorise une valeur de référence en milliseconde time$("ms") à chaque temps.
Il faut donc que je sache à combien de milliseconde un temps correspond.
Celui-ci servira à mémoriser le moment où le joueur a appuyé sur un bouton de son : temps en millisecondes depuis le dernier temps n° x passé.
Le plus difficile est de retrouver et donc classer TOUS les sons dans l'ordre où ils doivent être appelés par playwave tout en respectant les écarts de temps où le joueur a pressé les touches, car s'il n'y a pas de pb avec la première séquence enregistrée par le joueur, les suivantes doivent (ou peuvent) s'inserrer quelque par dans la première, en respectant la chronologie voulue par le joueur par rapport à ce qu'il a déjà enregistré... OUF ! pas facile à expliquer !
Ce classement doit pouvoir se faire en quelques millisecondes, j'espère suffisament court pour que le son suivant qui doit être joué (enregistré par le joueur) puisse se jouer au moment voulu !

On pourrait aussi imaginer d'enregistrer directement au bon endroit le son voulu par le joueur par insertion dans la chaine de sons (phrase musicale en cour), au moment où le joueur presse un bouton, mais là, il se pourrait que ça pose pb si le joueur est trop rapide dans l'appui successif de boutons... la recherche du bon endroit dans la chaine de sons peut peut-être prendre trop de temps...!?
Cette solution faciliterait pourtant beaucoup l'exécution de la boucle de PLAY !!!
Je pense que c'est celle-là que je doit tenter d'écrire en premier.

Enfin c'est mon idée...!

Ceci dit, il ne faudra pas changer le BPM d'un morceau en cour de route où lors de sa future lecture !!!
Pas de problème s'il est plus lent que l'original, mais pb s'il est plus rapide que le plus grand écart entre 2 sons !!!
Il faudra mémoriser le BPM aussi.

@+

PS: dans le ZIP il y a un JPG d'un métronôme avec les correspondances en BPM. C'est ce que j'ai respecté dans le code.



Edité par cassiope01 Le 02/11/2012 à 10h29
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 02/11/2012 à 10h57

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2204
Dans ton "petit piano"/
Mets le dim avec le tiens, les deux boutons et les deux textbox avec les tiens.
Cale le bout de code entre deux wait's.
Fonctionnement:
Si j'ai pas fais le con dans le copié/collé, ça doit marcher.

--> textbox #w.a dit: 1, 2, 3, 4 .Le 1 correspond au BMP(début du temps)
--> textbox #w.b: donne le moment dans la boucle (1 à 64)
1)- Start
2)- ATTENTION: il faut piquer les touches par le bas (sans passer au dessus, sinon -->trop de notes)
---Pique quelques notes ( en laissant un peu de temps entre chaque)
---Surveille textbox #w.b pour ne pas dépasser 64.
3)- Stop
.........
4)- re--Start
Tu entend ce qui a été entré au premier tour,
ajoute des notes dans les espaces libres entre deux notes.

Code JB :
 
 
  dim tout$(64)
  button #w.start, "Start", [start] , UL, 515, 115, 40, 25
  button #w.sto, "Stop", [sto], UL, 515, 155, 40, 25
  TEXTBOX #w.a, 515, 195, 30, 20
  TEXTBOX #w.b, 515, 225, 35, 25
 
     '-----------------------------------------------------------------------------------------
  [start]    ' joue la note tapée ( clavier ou souris
    [ici]
        xx=1:dur=400
        for x=1 to 64
        #w.a, str$(xx)
        #w.b, str$(x)
        if sto=1 then exit for
            if tout$(x)="" then tout$(x)=note$
            playwave "Notes\";tout$(x);".wav", async
            gosub [pause]
            xx=xx+1
            if xx=5 then xx=1
        next x
        if sto=1 then sto=0: wait
        goto [ici]
    wait
    [sto]
      sto=1
    wait
    [pause] ' en millisecondes
        timer dur, [tempi]
        wait
        [tempi]
        timer 0
    return
    wait
    '////////////////////////////////////////////////////////
 
 




Edité par Roland Le 02/11/2012 à 11h02
____________________
Roro

   
Le 02/11/2012 à 12h42

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
pourquoi dur=400 ?
pourquoi 64 ?



Edité par cassiope01 Le 02/11/2012 à 12h44
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 02/11/2012 à 14h42

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2204
Dur 400 pour pas que ça aille trop vite.
64 aurait pu etre 32 ou un multiple quelconque de 4. C'est la longueur de la boucle.
Le problème, il est conceptuel:
Soit on joue d'oreille (sans métronome) --> Ton "petit piano".
Soit on joue au métronome, et dans ce cas --> 4 "temps" fois le nombre de mesures (longueur du morceau)
"Temps", et ses divisions, strictement égaux.
Dans les bons séquenceurs, il y a une fonction: "quantize" qui prend un morceau joué d'oreille (sans métronome), et qui tente de le régler sur une ligne de temps "quantifiée" (divisée en rondelles égales) en avançant ce qui est en retard, et en reculant ce qui est en avance, pour caler les notes sur un "temps" ou une de ses divisions.(croche=1/8 de "temps")
Deux soucis:
Quand playwave n'a rien à se mettre sous la dent, il fait un "bip"; et...
JB ne joue qu'une wave à la fois.



Edité par Roland Le 02/11/2012 à 15h03
____________________
Roro

   
Le 02/11/2012 à 15h05

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
400 = 1/150ième de seconde donc ton BPM est de 150 c'est ça ?

64 c'est 64 quoi ? en tout cas c'est pas des battements par seconde !

Le programme travaille en millisecondes. Je dois me débrouiller avec ça.

Pourquoi lancer PLAYWAVE sans fichier son, si ce n'est justement pour en arrêter un précédent ?

OUI, JB ne peut 'jouer' avec playwave ou playmidi qu'un seul fichier son à la fois.
Ceci dit c'est pas trop grave car tes fichiers son sont très court.
De toute façon si on appelle playwave de façon trop proche, avec le paramètre 'async' JB arrêtera le premier pour jouer le second.

@+



Edité par cassiope01 Le 02/11/2012 à 15h06
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 02/11/2012 à 18h26

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2204
BPM 150 t'a bon.
64 -->4 mesures (longueur du morceau, qui est une boucle) 1 mesure =4 temps 1 temps = 1noire.
Pour descendre jusqu'à la double croche, il faut diviser ça par 4 (1 noire=2 croches ou 4 doubles cr)
ça mets la double à 1/4 de temps et donc à 1/16ème de mesure.
Des mesures on peut en mettre le nombre qu'on veut.
Mais la finesse du découpage (1/2, 1/8, 1/16) donne le nombre de notes qu'on peut mettre dans une mesure)
Comme toutes ces valeurs sont relatives, on peut ne faire que des rondes ( mesure pleine dans laquelle on ne peut rien mettre de plus),
et accélérer le tempo, à tel point que la ronde soit aussi courte qu'une triple croche (en ms)
Mais à ce moment là, il n'y a plus aucun repère de temporalité ( temps fort, temps faible, swing)
Ces repères servent d'une part à ce que les musiciens jouent à la meme cadence.
et d'autre part, au compositeur pour monter des murs d'aplomb, et pour faire des angles droits.
On peut bien sur batir une maison avec des murs penchés et des coins à angles aigus (pour ranger les cannes à pèche.)
Citation:
Pourquoi lancer PLAYWAVE sans fichier son

Si on décide que l'ensemble sera structuré.( que ça ressemblera à quelque chose, par opposition à qui ne ressemble à rien) La structure doit préexister (fichier son vide, mais virtuellement organisé en cases qui recevront ou non des notes)
Hm hum.. Je te sens pas loin de péter un cable......Faut y aller mollo....
____________________
Roro

   
Le 03/11/2012 à 10h02

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Bon ben voilà : J'y ai pensé : Rod l'a fait :top et en mille fois plus simple !

C'est ça quand on comprend ce qu'on veut faire :clap :lol

Le programme de JohnnyD (en LibertyBasic) est sûrement génial aussi mais plus difficile à comprendre et à utiliser pour moi...!

@+



Edité par cassiope01 Le 03/11/2012 à 10h03
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 03/11/2012 à 10h41

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2204
Dans ma beat box, j'ai découpé le temps en tranches d'attentes (timer)
les sons étants calés entre les tranches.
Peut-tu m'expliquer le fonctionnement du (des) timers de Rod ?
je n'arrive pas à saisir l'ensemble. :heink :s
____________________
Roro

   
Le 03/11/2012 à 12h06

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
C'est vrai que ça questionne un peu, mais Rod utilise le timer de la façon la plus simple et efficace possible (comme j'aime :top )
Il faut relire l'aide sur la fonction TIMER milliseconds, [branchLabel]

TIMER se comporte comme un séquenceur à lui tout seul, à savoir qu'il exécute le branchement au [branchLabel] tout les 'milliseconds' et recommence jusqu'à ce qu'on l'arrête avec TIMER 0, ce que Rod ne fait que si on presse le bouton STOP.

Moi je l'ai toujours assez mal utilisé :(

@+

J'ai essayé de terminer son programme... ( il vaut mieux utiliser mon répertoire de sons)

Code VB :
  ' http://justbasic.conforums.com/index.cgi?board=games&action=display&num=1351696393&start=0#1351938775

    nomainwin
    WindowWidth=530
    WindowHeight=324
    UpperLeftX=DisplayWidth/2-WindowWidth/2
    UpperLeftY=DisplayHeight/2-WindowHeight/2
 
    Sounds$ = "CrCymbal OpHihat HiBongo HiConga HiTimbal ";_
              "RyCymbal PeHihat LoBongo LoConga LoTimbal ";_
              "RyBell HaClap Hitom1 LoTom HiWood ";_
              "Stick Hitom2 Snare Cowbell"
 
    'define our gui controls
    bmpbutton #1.exit, "exit.bmp", [clearAll], UR, 25, 70
    bmpbutton #1.open, "open.bmp", [openFile], UR, 25, 105
    bmpbutton #1.save, "save.bmp", [saveFile], UR, 25, 140
    bmpbutton #1.play, "play.bmp", [startplay], UR, 25, 175
    bmpbutton #1.stop, "stop.bmp", [stopplay], UR, 25, 210
    graphicbox #1.gb, 62,28,400,240
    graphicbox #1.sk, 0, 0, 524, 296
 
    'open popup window
    open "Skin" for window_nf as #1
    #1 "trapclose [quit]"
 
    'draw the fancy skin window
    loadbmp "skin","skin.bmp"
    #1.sk   "down ; drawbmp skin 0 0 ; flush"
 
    loadbmp "back","background.bmp"
    loadbmp "led0","blank.bmp"
    loadbmp "led1","red.bmp"
    loadbmp "led6","white.bmp"
    loadbmp "exp0","play0.bmp"
    loadbmp "exp1","play1.bmp"
    loadbmp "exp2","play2.bmp"
    loadbmp "exp3","play3.bmp"
 
    'draw 16x16 main array
    xpos=86
    ypos=0
    for n= 0 to 255
        if xpos=326 then xpos=86 : ypos=ypos+15
        #1.gb "addsprite led";str$(n);" led0 led1 led6"
        #1.gb "spritexy led";str$(n);" ";xpos;" ";ypos
        xpos=xpos+15
    next
 
    'draw verticle tracking array
    #1.gb "backcolor black ; color green"
    #1.gb "font courrier_new 8"
    #1.gb "drawbmp back 0 0"
    xpos=0
    ypos=0
    for n= 0 to 15
        #1.gb "place 346 ";12+n*15;" ;|";word$(Sounds$,n+1)  ' add name of sounds
        #1.gb "addsprite page";str$(n);" led0 led1 led6"
        #1.gb "spritexy page";str$(n);" ";xpos;" ";ypos
        ypos=ypos+15
    next
    #1.gb "getbmp back 0 0 400 240"   'new background for the sprites

    'draw fancy sparkle sprites
    for n= 0 to 20
        #1.gb "addsprite exp";str$(n);" exp0 exp1 exp2 exp3 exp2 exp1"
    next
 
    #1.gb "background back"
    #1.gb "drawsprites"
 
    'start event tracking
   ' #1.sk "when leftButtonMove [movewindow]"
    #1.gb "when leftButtonDown [click]"
 
    'set up music data
    dim notes(256,16)
 
    page=0
    lastpage=0
    tempo=120
    X=0
    oldX=0
 
    timer tempo, [refresh]
    WAIT
 
 [refresh]
    #1.gb "drawsprites"
    if X=16 then
        X=0
        page=page+1
        if page>lastpage then page=0
        for n=0 to 15
         if n=page then
            #1.gb "spriteimage page";str$(n);" led1"
         else
            if n<=lastpage then
                #1.gb "spriteimage page";str$(n);" led6"
            else
                #1.gb "spriteimage page";str$(n);" led0"
            end if
         end if
        next
        gosub [shownotes]
    end if
 
    'scanbar
    #1.gb "spriteimage led";str$(X+0*16);" led6"
    #1.gb "spriteimage led";str$(X+5*16);" led6"
    #1.gb "spriteimage led";str$(X+10*16);" led6"
    #1.gb "spriteimage led";str$(X+15*16);" led6"
    #1.gb "spriteimage led";str$(oldX+0*16);" led";notes(page*16+oldX,0)
    #1.gb "spriteimage led";str$(oldX+5*16);" led";notes(page*16+oldX,5)
    #1.gb "spriteimage led";str$(oldX+10*16);" led";notes(page*16+oldX,10)
    #1.gb "spriteimage led";str$(oldX+15*16);" led";notes(page*16+oldX,15)
 
    'show note sparkles for selected instrument
    for Y=0 to 15
        if notes(page*16+X,Y)<>0 then
            if exp>20 then exp=0
            #1.gb "spritexy exp";str$(exp);" ";X*15+56;" ";Y*15-30
            #1.gb "cyclesprite exp";str$(exp);" 1 once"
            exp=exp+1
        end if
    next
 
    'play all notes
    for note = 0 to 15
        if notes(page*16+X,note)<>0 then
           ' playwave "Sounds\";str$(note+1);".wav", async
            playwave "Sounds\";word$(Sounds$,note+1);".wav", async
        end if
    next
 
    oldX=X
    X=X+1
 
 wait
 
 [click]
    xpos=MouseX
    ypos=MouseY
    if xpos>86 and xpos<326 then
        X=int((xpos-86)/15)
        Y=int(ypos/15)
        if notes(page*16+X,instrument*16+Y)=0 then
            #1.gb "spriteimage led";str$(X+Y*16);" led";str$(instrument+1)
            notes(page*16+X,instrument*16+Y)=instrument+1
        else
            #1.gb "spriteimage led";str$(X+Y*16);" led0"
            notes(page*16+X,instrument*16+Y)=0
        end if
    end if
 
    if xpos>0 and xpos<17 then
        lastpage=int(ypos/15)
        gosub [showpage]
    end if
    gosub [shownotes]
 wait
 
 [shownotes]
    for xled=0 to 15
        for yled=0 to 15
            #1.gb "spriteimage led";str$(xled+yled*16);" led";notes(page*16+xled,instrument*16+yled)
        next
    next
    #1.gb "drawsprites"
 return
 
 [showpage]
    for yled=0 to 15
        if yled=page then
           #1.gb "spriteimage page";str$(yled);" led1"
        else
           if yled<=lastpage then
               #1.gb "spriteimage page";str$(yled);" led6"
           else
               #1.gb "spriteimage page";str$(yled);" led0"
           end if
        end if
     next
  return
 
 
    [startplay]
        timer tempo, [refresh]
    wait
 
    [stopplay]
        timer 0
    wait
 
    [clearAll]
        confirm "Clear All ?";answer$
        if answer$ = "yes" then redim notes(256,16)
    wait
 
    [openFile]
        filedialog "Open file ", "mélodie_*.mel", fileName$
        if fileName$<>"" then
            open fileName$ for input as #fi
            for y=1 to 16
                line input #fi, compo$
                for x = 1 to 256
                    notes(x-1,y) = val(word$(compo$,x))
                next
            next
            close #fi
        end if
    wait
 
    [saveFile]
        filename$ = "mélodie_";word$(date$("mm/dd/yy"),2,"/");word$(date$("mm/dd/yy"),1,"/");_
                               word$(date$("mm/dd/yy"),3,"/");word$(time$(),1,":");_
                               word$(time$(),2,":");word$(time$(),3,":");".mel"
        open filename$ for output as #fo
        for y = 1 to 16
            compo$ = ""
            for x = 1 to 256
                compo$ = compo$;notes(x-1,y);" "
            next
            #fo, compo$
        next
        close #fo
        NOTICE filename$;" SAVED"
    wait
 
    [quit]
    close #1
    end
 




Edité par cassiope01 Le 03/11/2012 à 13h07
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 03/11/2012 à 12h26

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2204
Le problème du timer, c'est qu'il ne détermine pas des durées d'évenement, mais des durées de non-évenement (attente)
Quand on déplace un sprite... L'évenement, c'est le déplacement, le timer gérant le temps de position fixe, qui est un non-évenement.
Dommage que Rod nous ai grillés, ton idée de base de temps était intérréssante; d'autant plus que tu comptais te servir, ( si j'ai compris, )de time$ .
Je vais éplucher l'horloge "atomique" de Rod. .......Ils sont trop forts ces anglophonistes........
____________________
Roro

   
Le 03/11/2012 à 13h03

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Apparament contrairement à ce que je pensais, le timer est juste un 'compteur de tick processeur' qui redirige le cour du programme vers le [branchLabel] tout les x 'tick' en millisecondes...
il n'empêche rien de fonctionner !

C'est vrai que le code de Rod ne fait pas exactement ce que je voulais réaliser, puisque tout dans son programme force le respect du rythme imposé, que j'aimerai d'ailleurs mieux gérer, avec un BPM réaliste...!
Les notes enregistrées ne se joueront qu'en respectant le tempo.

J'avais envisagé plutôt un truc qui offre plus de souplesse, un enregistrement de ce que le joueur fait, peu importe le rythme, etc... comme dans le petit piano.

En tout cas, son code est une merveille de simplicité et d'efficacité, donc très facile à modifier et très instructif :top


@+



Edité par cassiope01 Le 03/11/2012 à 13h06
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Jeux » Un mini BeatBox Looper. un peu comme une pédale de loop...  

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie