Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Un exemple de génération de mélodie avec les fonctions MIDI | |
| | |
Auteur | Message |
---|
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Un exemple de génération de mélodie avec les fonctions MIDI Mar 21 Aoû 2012 - 0:37 | |
| Non, non Klaus ne t’embête pas, j'aurais dû y penser. C'est logique, mais je n'avais pas fait le lien ... Pas fute-fute sur ce coup là ... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un exemple de génération de mélodie avec les fonctions MIDI Mar 21 Aoû 2012 - 0:47 | |
| As-tu vu la possibilité d'exporter, par le presse-papier, le code Panoramic pour jouer la mélodie qui vient d'être jouée par la touche "Jouer" ? Car même si les notes ne s'affichent pas dans la portée car en-dehors de l'intervalle "affichable", le système midi arrive néanmoins à les jouer, et j'exporte le bon code. On peut alors se créer de petits programmes indépendants jouant chacun un morceau, et on les lance para EXECUTE ce qui évite l'attente sur les commandes MIDI_PLAY dans un programme de jeu, par exemple.
Ou même mieux: via le mécanisme de messages montré par Cosmos70, on transmet un identifiant du message à un programme contenant toutes les mélodies différentes à jour, sous forme de sous-programmes, et sur réception du message, le programme joue la mélodie demandée. Un vrai serveur musical, en somme ! Et plus de ralentissement du jeu ! | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Un exemple de génération de mélodie avec les fonctions MIDI Mar 21 Aoû 2012 - 1:10 | |
| Oui, c'est vraiment une bonne idée, clairement applicable pour la musique de fond. Bon aller, a demain tout le monde | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un exemple de génération de mélodie avec les fonctions MIDI Mar 21 Aoû 2012 - 1:11 | |
| Nouvelle version:
Dans la zone de configuration, il y a maintenant une case à cocher "Ecoute immédiate". Si cette case est cochée, toute note frappée au piano ou insérée par la touche insérer est jouée immédiatement, avec sa durée, son modificateur éventuel et son instrument. Si la note ne convient pas, il suffit de l'enlever de l'EDIT qui est la ligne juste en-dessous de la zone de configuration.
Toujours plus de convivialité... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 21 Aoû 2012 - 1:50 | |
| | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Un exemple de génération de mélodie avec les fonctions MIDI Mar 21 Aoû 2012 - 7:42 | |
| Salut Klaus
J’ai relevé un petit bug : Je coche ‘Ecoute immédiate’. je clique sur ‘Montrer piano’ Le piano s’affiche, tout est bien. Je clique sur le clavier du piano : la 1ère et/ou la 2ème fois : OK, j’entends la note jouée. Au click suivant un message d’erreur ‘(132) MIDI output is already ON. Line 696’.
REMARQUE : En cliquant sur ‘jouer’, juste après le RUN, et avant toute autre chose, le message ‘il n’y a rien à jouer’ s’affiche et c’est normal. Ma proposition est de rendre ce bouton INACTIVE jusqu’à ce qu’il y ait effectivement quelque chose à jouer.
A+
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un exemple de génération de mélodie avec les fonctions MIDI Mar 21 Aoû 2012 - 9:17 | |
| Merci pour tes tests, Papydall ! Les deux problèmes sont corrigés.
Il est clair qu'en écoute immédiate, ce sera un peu plus long pour chaque frappe, car il faut attende que MIDI_PLAY finisse de jouer sa note. Et on ne peut pas cliquer une autre note avant, sous peine de perturner le système. J'en ai tenu compte et j'éi sécurisé le piano ET le bouton Insérer !
Il y a un petit plus au niveau du piano... | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Un exemple de génération de mélodie avec les fonctions MIDI Mar 21 Aoû 2012 - 9:53 | |
| C’est bien Klaus, mais…. Je clique sur ‘demo’, puis ‘ajouter’, le bouton ‘jouer’ s’affiche’. Je clique dessus : ok on joue de la musique. Mais, comme je me mets à la place de celui qui cherche coûte que coûte les pépins, je clique encore et encore sur ‘jouer’. La musique reprend au début, et au bout de quelques clicks, bonjour l’erreur : différents messages d’erreur s’affichent genre ‘ Access violation…’ ou ‘No Corresponding END_WHILE fond.Line 499’ etc.
Je propose donc, au lieu de laisser le bouton ‘JOUER’ actif, de le changer en ‘ARRETER’ et un click sur ‘ARRETER’ met fin à la musique ou plus simplement de rendre le bouton ‘JOUER’ inactif tant que la musique joue.
A toi de voir.
A+
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un exemple de génération de mélodie avec les fonctions MIDI Mar 21 Aoû 2012 - 10:06 | |
| C'est fait. Le bouton Jouer est inactif pendant l'exécution. C'est plus logique.
J'ai ajouté une progress_bar...
EDIT
Correction d'un bug provoquant le blocage du piano si l'on cliquait dans une partie inactive (repère des octaves). | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Un exemple de génération de mélodie avec les fonctions MIDI Mar 21 Aoû 2012 - 11:53 | |
| Salut Klaus J’ai apporté quelques modifications sur ton programme à titre tout à fait personnel. J’ai ajouté les lignes suivantes (marquées par ‘ papydal) : Lignes : 82 , 363, 364, 711, 736. La raison de cette modif est : Lorsqu’on joue de la musique (par exemple demo, ajouter, jouer) et qu’on désire mettre fin à cette musique, on est obligé d’attendre la fin. J’ai donc ajouté un bouton ‘Arrêter’ qui permet justement de mettre fin à la musique. Si cette idée te convient, revoie donc ton programme et apporte les modifications comme tu les souhaites. - Code:
-
' musique.bas ' ' On saisit une ligne de notes selon le format suivant: ' nxx%y& avec: n = octave choisie {d,c,b,a,0,1,2,3,4} ' xx = nom de la note: {innn,vnnn,p,do,re,mi,fa,sol,la,si} ' i = instrument avec nnn=numéro d'instrument ' v = colume ' p = pause ' # = modificateur {[],#,b} ' y = durée inverse {[3],1,2,3,4,5,6} correspondant à {1,1/2,1/4,1/8,1/6,1/32} ' y = "note pointée" {[],.} ' volume: nnn=1...127 défaut: 100
' Les notes sont séparées par des espaces.
' 60=do 62=ré 64=mi 65=fa 67=sol 69=la 71=si 72=do ' en octave -4: ' 12=do 14=re 16=mi 17=fa 19=sol 21=la 23=si 24=do ' en octave -5: (octave fictive, servant de base pour les calculs) ' 0=do 2=re 4=mi 5=fa 7=sol 9=la 11=si 12=do ' mini: 21=la(-4) max: 108=do(+4) C'est l'étendu d'un clavier de piano ' delta octave: 12
label labels : gosub labels gosub constantes gosub variables gosub donnees gosub form0 gosub menu gosub GUI gosub initialisations end
labels: label constantes, variables, donnees, form0, menu, GUI, initialisations label ajouter, start, compiler, jouer, sel_instrument, inserer, effacer label sel_volume, demo, dessiner_note, dessiner, dessiner_pause, localiser_note label dessiner_pause_1, dessiner_pause_2, dessiner_pause_3, dessiner_pause_4 label dessiner_pause_5, dessiner_pause_6, dessiner_point_1, dessiner_point_2 label dessiner_note_1, dessiner_note_2, dessiner_note_3, dessiner_note_4 label dessiner_note_5, dessiner_note_6, dessiner_point, creer_picture label dessiner_lignes_audessus, dessiner_lignes_endessous, copier label dessiner_modificateur,dessiner_dieze, dessiner_bmol, dessiner_cledesol label dessiner_instrument, dessiner_volume, change_volume label montrer_piano, cacher_piano, dessiner_piano, clic_piano, panoramic label compiler_immediat
return
constantes: dim M1% : M1% = 0 - 1 dim M2% : M2% = 0 - 2 dim M3% : M3% = 0 - 3 dim M4% : M4% = 0 - 4 dim M5% : M5% = 0 - 5 dim demo1$ : demo1$ = "i48 asol5 asol5 asol5 0do4 0do4 0ré4 0ré4 0sol3 0mi5 0do5" dim demo2$ : demo2$ = "i57 0do5 0mi5 0do5 ala4 0fa3 0ré5 asi5 0do2" dim lig_start% : lig_start% = 120 dim lig_delta% : lig_delta% = 10 dim table_vertical%(9,6) : ' décalage des notes dans la portée par octave ' (oct,note) oct=1...9 note=0...6 0=do 6=si return
variables: dim no%, no1%, no2%, i%, j%, k%, n%, s$, s1$, s2$, w%, x%, y% dim no_ligne%, no_partition%, no_instruments%, no_duree%, no_notes% dim no_octaves%, no_modif%, no_volume%, no_picture%, no_dessiner% dim no_aff_volume%, no_copier%, no_piano%, no_bouton_piano%, no_inserer% dim no_panoramic%, no_code_panoramic%, no_ecoute_immediate%, no_jouer% dim no_progress% dim flag_pointe%, flag_done%, mode_immediat% dim note%, octave%, modif%, volume%, note_origine% dim index_ligne%, lignes_audessus%, lignes_endessous% dim n_notes% : ' nombre de notes compilées dim notes%(1000) : ' code de la note (-1=instrument 0=pause) dim durees%(1000) : ' durée de la note ou code instrument dim notes_origine%(1000,2) : ' (x,0)=note (0=do,...,6=si) (x,1)=octave (x,2)=modificateur dim piano_octaves%(9,1) : ' valeurs x mini/maxi des octaves pour un clic dans le piano dim flag_noire% : ' flag "touche noire frappée" sur le piano dim largeur_blanche% : ' largeur d'une note blanche du piano dim touche_blanche%, touche_noire% dim no_arreter% : ' Papydall return
donnees: ' instruments: data "Piano" data " 0 Acoustic grand piano" data " 1 Bright acoustic piano" data " 2 Electric grand piano" data " 3 Honky-tonk piano" data " 4 Rhodes piano" data " 5 Chorused piano" data " 6 Harpsichord" data " 7 Clavinet" data "" data "Chromatic Percussion" data " 8 Celesta" data " 9 Glockenspiel" data " 10 Music box" data " 11 Vibraphone" data " 12 Marimba" data " 13 Xylophone" data " 14 Tubular bells" data " 15 Dulcimer" data "" data "Organ" data " 16 Hammond organ" data " 17 Percussive organ" data " 18 Rock organ" data " 19 Church organ" data " 20 Reed organ" data " 21 Accordion" data " 22 Harmonica" data " 23 Tango accordion" data "" data "Guitar" data " 24 Acoustic guitar (nylon)" data " 25 Acoustic guitar (steel" data " 26 Electric guitar (jazz)" data " 27 Electric guitar (clean)" data " 28 Electric guitar (muted)" data " 29 Overdriven guitar" data " 30 Distortion guitar" data " 31 Guitar harmonics" data "" data "Bass" data " 32 Acoustic bass" data " 33 Electric bass (finger)" data " 34 Electric bass (pick)" data " 35 Fretless bass" data " 36 Slap bass 1" data " 37 Slap bass 2" data " 38 Synth bass 1" data " 39 Synth bass 2" data "" data "Strings" data " 40 Violin" data " 41 Viola" data " 42 Cello" data " 43 Contrabass" data " 44 Tremolo strings" data " 45 Pizzicato strings" data " 46 Orchestral harp" data " 47 Timpani" data "" data "Ensemble" data " 48 String ensemble 1" data " 49 String ensemble 2" data " 50 Synth. strings 1" data " 51 Synth. strings 2" data " 52 Choir Aahs" data " 53 Voice Oohs" data " 54 Synth voice" data " 55 Orchestra hit" data "" data "Brass" data " 56 Trumpet" data " 57 Trombone" data " 58 Tuba 66" data " 59 Muted trumpet" data " 60 French horn" data " 61 Brass section" data " 62 Synth. brass 1" data " 63 Synth. brass 2" data "" data "Reed" data " 64 Soprano sax" data " 65 Alto sax" data " Tenor sax" data " 67 Baritone sax" data " 68 Oboe" data " 69 English horn" data " 70 Bassoon" data " 71 Clarinet" data "" data "Pipe" data " 72 Piccolo" data " 73 Flute" data " 74 Recorder" data " 75 Pan flute" data " 76 Bottle blow" data " 77 Shakuhachi" data " 78 Whistle" data " 79 Ocarina" data "" data "Synth Lead" data " 80 Lead 1 (square)" data " 81 Lead 2 (sawtooth)" data " 82 Lead 3 (calliope lead)" data " 83 Lead 4 (chiff lead)" data " 84 Lead 5 (charang)" data " 85 Lead 6 (voice)" data " 86 Lead 7 (fifths)" data " 87 Lead 8 (brass + lead)" data "" data "Synth Pad" data " 88 Pad 1 (new age)" data " 89 Pad 2 (warm)" data " 90 Pad 3 (polysynth)" data " 91 Pad 4 (choir)" data " 92 Pad 5 (bowed)" data " 93 Pad 6 (metallic)" data " 94 Pad 7 (halo)" data " 95 Pad 8 (sweep)" data "" data "Miscellaneous" data " 96 Synth SFX 1 Ice Rain" data " 97 Synth SFX 2 Sound Track" data " 98 Synth SFX 3 Crystal" data " 99 Synth SFX 4 Atmosphere" data "100 Synth SFX 5 Brightness" data "101 Synth SFX 6 Goblin" data "102 Synth SFX 7 Echo Drops" data "103 Synth SFX 8 Star Theme" data "104 Sitar" data "105 Banjo" data "106 Shamisen" data "107 Koto" data "108 Kalimba" data "109 Bagpipe" data "110 Fiddle" data "111 Shanai" data "112 Tinkle Bells" data "113 Agogo" data "114 Steel Drums" data "115 Woodblock" data "116 Taiko Drum" data "117 Melodic Drum" data "118 Synth Drum" data "119 Reverse Cymbal" data "" data "Sound Effects" data "120 Guitar fret noise" data "121 Breath noise" data "122 Seashore" data "123 Bird tweet" data "124 Telephone ring" data "125 Helicopter" data "126 Applause" data "127 Gunshot" data "***"
' table_vertical%(1000,2) : ' (x,0)=note (0=do,...,6=si) (x,1)=octave (x,2)=modificateur data 0,0,0,0,0,0,0 : ' octave 1 (d) data 0,0,0,0,0,0,0 : ' octave 2 (c) data 0,0,0,0,0,0,0 : ' octave 3 (b) data 0,0,0,0,13,12,11 : ' octave 4 (a) data 10,9,8,7,6,5,4 : ' octave 5 (0) data 3,2,1,0,M1%,M2%,M3% : ' octave 6 (1) data M4%,M5%,0,0,0,0,0,0 : ' octave 7 (2) data 0,0,0,0,0,0,0 : ' octave 8 (3) data 0,0,0,0,0,0,0 : ' octave 9 (4)
return
form0: full_space 0 caption 0,"Jouer une mélodie return
menu: return
GUI: ' configurateur no% = no% + 1 : container_option no% : no1% = no% : top no%,10 : left no%,10 caption no%,"Octave" : height no%,50 : width no%,370 no_octaves% = no% no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,10 caption no%,"d" : width no%,30 no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,50 caption no%,"c" : width no%,30 no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,90 caption no%,"b" : width no%,30 no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,130 caption no%,"a" : width no%,30 no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,170 caption no%,"0" : width no%,30 no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,210 caption no%,"1" : width no%,30 no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,250 caption no%,"2" : width no%,30 no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,290 caption no%,"3" : width no%,30 no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,330 caption no%,"4" : width no%,30
no% = no% + 1 : container_option no% : no1% = no% : top no%,10 : left no%,390 caption no%,"Note" : height no%,50 : width no%,330 no_notes% = no% no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,10 caption no%,"do" : width no%,30 no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,50 caption no%,"ré" : width no%,30 no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,90 caption no%,"mi" : width no%,30 no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,130 caption no%,"fa" : width no%,30 no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,170 caption no%,"sol" : width no%,30 no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,210 caption no%,"la" : width no%,30 no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,250 caption no%,"si" : width no%,30 no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,290 caption no%,"p" : width no%,30
no% = no% + 1 : container_option no% : no1% = no% : top no%,60 : left no%,390 caption no%,"Modificateur" : height no%,50 : width no%,130 no_modif% = no% no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,10 caption no%,"./." : width no%,30 no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,50 caption no%,"#" : width no%,30 no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,90 caption no%,"b" : width no%,30
no% = no% + 1 : container no% : no1% = no% : top no%,10 : left no%,730 caption no%,"Durée" : height no%,50 : width no%,200 no% = no% + 1 : combo no% : parent no%,no1% : top no%,20 : left no%,10 no_duree% = no% : width no%,120 no% = no% + 1 : check no% : parent no%,no1% : top no%,20 : left no%,140 caption no%,"pointé" : width no%,50
no% = no% + 1 : button no% : no_inserer% = no% : top no%,20 : left no%,940 caption no%,"Insérer" : on_click no%,inserer
no% = no% + 1 : combo no% : top no%,90 : left no%,10 : width no%,200 no_instruments% = no% no% = no% + 1 : button no% : top no%,90 : left no%,left(no%-1)+width(no%-1) caption no%,"Choisir" : on_click no%,sel_instrument
no% = no% + 1 : alpha no% : top no%,95 : left no%,650 caption no%,"Volume:" no% = no% + 1 : scroll_bar no% : top no%,95 : left no%,700 : width no%,200 no_volume% = no% : min no%,1 : max no%,127 : position no%,100 on_change no%,change_volume no% = no% + 1 : edit no% : no_aff_volume% = no% : width no%,25 : inactive no% top no%,95 : left no%,left(no%-1)+width(no%-1) : text no%,100 no% = no% + 1 : button no% : top no%,90 : left no%,left(no%-1)+width(no%-1) caption no%,"Choisir" : on_click no%,sel_volume
' ligne d'écriture no% = no% + 1 : edit no% : top no%,120 : left no%,10 : width no%,width(0)-40 no_ligne% = no% no% = no% + 1 : button no% : top no%,150 : left no%,200 caption no%,"Ajouter" : on_click no%,ajouter no% = no% + 1 : button no% : top no%,150 : left no%,450 caption no%,"Démo" : on_click no%,demo no% = no% + 1 : button no% : top no%,150 : left no%,700 caption no%,"Effacer" : on_click no%,effacer
' partition no% = no% + 1 : progress_bar no% : no_progress% = no% top no%,390 : left no%,10 : width no%,width(0)-40 min no%,0 : max no%,100 : position no%,0 no% = no% + 1 : memo no% : top no%,180 : left no%,10 : width no%,width(0)-40 no_partition% = no% : bar_vertical no% : height no%,200 no% = no% + 1 : button no% : no_jouer% = no% : top no%,410 : left no%,200 caption no%,"Jouer" : on_click no%,start : hide no% ' Papydall no% = no% +1 : button no% : no_arreter% = no% : top no%,410 : left no%,100 caption no%,"Arreter" : hide no% ' Fin Papydall no% = no% + 1 : button no%: no_dessiner% = no% : hide no% : top no%,410 : left no%,450 caption no%,"Partition" : on_click no%,dessiner no% = no% + 1 : button no%: no_copier% = no% : hide no% : top no%,410 left no%,left(no%-1)+width(no%-1) caption no%,"Copier" : on_click no%,copier no% = no% + 1 : button no%: no_panoramic% = no% : hide no% : top no%,410 left no%,left(no%-1)+width(no%-1) caption no%,"Panoramic" : on_click no%,panoramic no% = no% + 1 : no_picture% = no% : gosub creer_picture : hide no% no% = no% + 1 : memo no% : hide no% : no_code_panoramic% = no%
' piano no% = no% + 1 : picture no% : hide no% : no_piano% = no% : on_click no%,clic_piano top no%,460 : left no%,10 : width no%,width(0)-40 : height no%,200 gosub dessiner_piano no% = no% + 1 : button no% : no_bouton_piano% = no% top no%,50 : left no%,940 : caption no%,"Montrer piano" : on_click no%,montrer_piano no% = no% + 1 : check no% : no_ecoute_immediate% = no% : width no%,120 top no%,70 : left no%,700 : caption no%,"Ecoute immédiate" return
creer_picture: picture no_picture% : hide no_picture% : top no_picture%,460 : left no_picture%,10 width no_picture%,width(0)-40 : height no_picture%,300 return
montrer_piano: show no_piano% caption no_bouton_piano%,"Cacher piano" on_click no_bouton_piano%,cacher_piano return
cacher_piano: hide no_piano% caption no_bouton_piano%,"Montrer piano" on_click no_bouton_piano%,montrer_piano return
dessiner_piano: 2d_target_is no_piano% print_target_is no_piano% font_bold no_piano% largeur_blanche% = (width(no_piano%)-2)/58 2d_pen_width 2 2d_rectangle 0,20,width(no_piano%),height(no_piano%) 2d_pen_width 1 for i%=1 to 58 2d_rectangle 1+(i%-1)*largeur_blanche%,20,1+i%*largeur_blanche%,height(no_piano%) next i% piano_octaves%(1,0) = 1 piano_octaves%(1,1) = 3*largeur_blanche%-1 2d_rectangle 1,1,3*largeur_blanche%,19 print_locate largeur_blanche%*1.4,3 print "d" x% = 1 + 3*largeur_blanche% for i%=1 to 8 piano_octaves%(i%+1,0) = x% piano_octaves%(i%+1,1) = x% + 7*largeur_blanche% - 1 2d_rectangle x%,1,x%+7*largeur_blanche%-1,19 print_locate x% + largeur_blanche%*3.4,3 print mid$("cba01234",i%,1) x% = x% + 7*largeur_blanche% next i% 2d_fill_color 1,0,0 x% = 0.6*largeur_blanche% 2d_rectangle x%,20,x%+largeur_blanche%*0.9,height(no_piano%)*0.6 x% = x% + largeur_blanche% 2d_rectangle x%,20,x%+largeur_blanche%*0.9,height(no_piano%)*0.6 for i%=1 to 8 x% = x% + largeur_blanche% x% = x% + largeur_blanche% 2d_rectangle x%,20,x%+largeur_blanche%*0.9,height(no_piano%)*0.6 x% = x% + largeur_blanche% 2d_rectangle x%,20,x%+largeur_blanche%*0.9,height(no_piano%)*0.6 x% = x% + largeur_blanche% x% = x% + largeur_blanche% 2d_rectangle x%,20,x%+largeur_blanche%*0.9,height(no_piano%)*0.6 x% = x% + largeur_blanche% 2d_rectangle x%,20,x%+largeur_blanche%*0.9,height(no_piano%)*0.6 x% = x% + largeur_blanche% 2d_rectangle x%,20,x%+largeur_blanche%*0.9,height(no_piano%)*0.6 next i% return
initialisations: read s$ while s$<>"***" item_add no_instruments%,s$ read s$ end_while text no_instruments%,item_read$(no_instruments%,2) for i%=1 to 9 for j%=0 to 6 read table_vertical%(i%,j%) next j% next i%
item_add no_duree%,"1 (1) ronde" item_add no_duree%,"2 (1/2) blanche" item_add no_duree%,"3 (1/4) noire" item_add no_duree%,"4 (1/8) croche" item_add no_duree%,"5 (1/16) double-croche" item_add no_duree%,"6 (1/32) triple croche" text no_duree%,item_read$(no_duree%,3) mark_on no_notes%+1 mark_on no_octaves%+5 mark_on no_modif%+1 midi_on return
ajouter: s$ = trim$(text$(no_ligne%)) if s$<>"" item_add no_partition%,s$ text no_ligne%,"" end_if show no_jouer% set_focus no_ligne% return
effacer: clear no_partition% set_focus no_ligne% 2d_target_is 0 print_target_is 0 delete no_picture% gosub creer_picture 2d_target_is no_picture% print_target_is no_picture% font_size no_picture%,12 font_bold no_picture% font_italic no_picture% hide no_dessiner% hide no_copier% hide no_panoramic% hide no_jouer% return
demo: item_add no_partition%,demo1$ item_add no_partition%,demo2$ return
start: inactive no_jouer% gosub compiler gosub jouer active no_jouer% return
change_volume: text no_aff_volume%,position(no_volume%) return
compiler: n_notes% = 0 if count(no_partition%)=0 message "Il n'y a rien à jouer !" return end_if for i%=1 to count(no_partition%) s$ = trim$(item_read$(no_partition%,i%))+" " if len(s$)>0 compiler_immediat: j% = instr(s$," ") while j%>0 s1$ = lower$(trim$(left$(s$,j%-1))) flag_done% = 0 ' {innn,p,do,re,mi,fa,sol,la,si} if left$(s1$,1)="i" : ' innn=instrument s2$ = mid$(s1$,2,len(s1$)) if numeric(s2$)=0 message "instrument invalide dans "+s1$ return end_if n% = int(val(s2$)) if n%<1 or n%>127 message "instrument invalide dans "+s1$ return end_if n_notes% = n_notes% + 1 notes%(n_notes%) = M1% notes_origine%(n_notes%,0) = M1% notes_origine%(n_notes%,1) = 0 notes_origine%(n_notes%,2) = 0 durees%(n_notes%) = n% flag_done% = 1 end_if if left$(s1$,1)="v" : ' vnnn=volume s2$ = mid$(s1$,2,len(s1$)) if numeric(s2$)=0 message "volume invalide dans "+s1$ return end_if n% = int(val(s2$)) if n%<1 or n%>127 message "volume invalide dans "+s1$ return end_if n_notes% = n_notes% + 1 notes%(n_notes%) = M2% notes_origine%(n_notes%,0) = M2% notes_origine%(n_notes%,1) = 0 notes_origine%(n_notes%,2) = 0 durees%(n_notes%) = n% flag_done% = 1 end_if
if left$(s1$,1)="p" : ' pn.=pause flag_pointe% = 0 s2$ = s1$ if right$(s2$,1)="." flag_pointe% = 1 s2$ = left$(s2$,len(s2$)-1) end_if s2$ = mid$(s2$,2,len(s2$)) if numeric(s2$)=0 message "pause invalide dans "+s1$ return end_if n% = int(val(s2$)) if n%<1 or n%>6 message "pause invalide dans "+s1$ return end_if n% = (n%-1)*2 + flag_pointe% n_notes% = n_notes% + 1 notes%(n_notes%) = 0 notes_origine%(n_notes%,0) = 0 : ' placer les pauses à la place d'un do notes_origine%(n_notes%,1) = 6 : ' en octave 1 (indice 6 dans tableau des octaves) notes_origine%(n_notes%,2) = 0 durees%(n_notes%) = n% flag_done% = 1 end_if if flag_done%=0 octave% = 0 modif% = 0 note% = M1% s2$ = left$(s1$,1) : ' l'octave octave% = instr("dcba01234",s2$) if octave%=0 message "octave invalide dans "+s1$ return end_if s2$ = mid$(s1$,2,len(s1$)) if left$(s2$,2)="do" s2$ = mid$(s2$,3,len(s2$)) note% = 0 note_origine% = 0 end_if if (left$(s2$,2)="re") or (left$(s2$,2)="ré") s2$ = mid$(s2$,3,len(s2$)) note% = 2 note_origine% = 1 end_if if left$(s2$,2)="mi" s2$ = mid$(s2$,3,len(s2$)) note% = 4 note_origine% = 2 end_if if left$(s2$,2)="fa" s2$ = mid$(s2$,3,len(s2$)) note% = 5 note_origine% = 3 end_if if left$(s2$,3)="sol" s2$ = mid$(s2$,4,len(s2$)) note% = 7 note_origine% = 4 end_if if left$(s2$,2)="la" s2$ = mid$(s2$,3,len(s2$)) note% = 9 note_origine% = 5 end_if if left$(s2$,2)="si" s2$ = mid$(s2$,3,len(s2$)) note% = 11 note_origine% = 6 end_if if note%=M1% message "note inconnue dans "+s1$ return end_if modif% = 0 if left$(s2$,1)="#" modif% = 1 s2$ = mid$(s2$,2,len(s2$)) else if left$(s2$,1)="b" modif% = M1% s2$ = mid$(s2$,2,len(s2$)) end_if end_if flag_pointe% = 0 if right$(s2$,1)="." flag_pointe% = 1 s2$ = left$(s2$,len(s2$)-1) end_if if numeric(s2$)=0 message "durée invalide dans "+s1$ return end_if n% = int(val(s2$)) if n%<1 or n%>6 message "durée invalide dans "+s1$ return end_if n% = (n%-1)*2 + flag_pointe% note% = note% + octave%*12 + modif% if (note%<21) or (note%>108) message "note "+s1$+" en-dehors des possibilités" return end_if n_notes% = n_notes% + 1 notes%(n_notes%) = note% notes_origine%(n_notes%,0) = note_origine% notes_origine%(n_notes%,1) = octave% notes_origine%(n_notes%,2) = modif% durees%(n_notes%) = n% flag_done% = 1 end_if if flag_done%=0 message "note inconnue dans "+s1$ return end_if s$ = trim$(mid$(s$,j%+1,len(s$))) if len(s$)>0 then s$ = s$ + " " j% = instr(s$," ") end_while if mode_immediat%=1 then return end_if next i% show no_dessiner% hide no_copier% hide no_panoramic% return
' 0do4 0re4 0mi4 0do4 i40 0do4 0re4 0mi4 0do4 0mi4 0fa4 0sol4 p4 0mi4 0fa4 0sol4
jouer: if n_notes%=0 message "Il n'y a rien à jouer après analyse !" return end_if show no_arreter% : ' Papydall volume% = 100 for i%=1 to n_notes% position no_progress%, int((i%-0.5)*100/n_notes%) ' message str$(notes%(i%))+" "+str$(durees%(i%)) if notes%(i%)=M1% : ' instrument midi_instrument durees%(i%) else if notes%(i%)=m2% volume% = durees%(i%) midi_volume volume% else if notes%(i%)=0 : ' pause midi_volume 1 midi_play 60,durees%(i%) midi_volume volume% else : ' vraie note midi_volume 100 midi_play notes%(i%),durees%(i%) ' gosub dessiner_note end_if end_if end_if position no_progress%, int(i%*100/n_notes%) ' Papydall if clicked(no_arreter%) = 1 then hide no_arreter%: show no_jouer% : exit_for ' Fin Papydall next i% position no_progress%,0 return
dessiner: x% = 10 show no_picture% color no_picture%,241,246,136 2d_target_is no_picture% print_target_is no_picture% font_size no_picture%,12 font_bold no_picture% font_italic no_picture% w% = width(no_picture%) gosub dessiner_cledesol for i%=1 to n_notes% 2d_fill_color 0,0,0 if notes%(i%)>0 then gosub dessiner_note if notes%(i%)=0 then gosub dessiner_pause if notes%(i%)=M1% then gosub dessiner_instrument if notes%(i%)=M2% then gosub dessiner_volume next i% ' dessiner la portée maintenant seulement ! for i%=1 to 5 y% = lig_start% + (i%-1)*lig_delta% 2d_line 0,y%,w%,y% next i% show no_copier% show no_panoramic% return
dessiner_cledesol: ' clé de sol ( base du code fourni par Papydall) if variable("theta")=0 dim theta ,pi, p, x1, y1, xp,yp ,xcentre,ycentre pi = 4*atn(1) : p = pi/180 end_if xcentre = x%+10 : ycentre = lig_start%+3*lig_delta% : ' Coordonnées du centre de l'écran for theta = 0 to 1.625*2*pi step p x1 = theta*cos(theta) : y1 = theta*sin(theta) : ' Equation paramétrique d'une spirale ' Son équation polaire étant RHO = THETA xp = x1+xcentre : yp = y1 + ycentre 2d_point xp,yp next theta 2d_line xp,yp,xp+15,yp-30 xp = xp + 15 : yp = yp - 30 xcentre = xcentre + 3 : ycentre = ycentre - 40 for theta = 0.8*pi to pi+0.55*2*pi step p x1 = 5*cos(theta) : y1 = 5*sin(theta) xp = xcentre-x1 : yp = ycentre+y1 2d_point xp,yp next theta 2d_line xp,yp,xp+3,yp+58 xp = xp + 3 : yp = yp + 58 xcentre = xp-5 : ycentre = yp for theta = 0 to 1.5*pi step p x1 = (1-theta/2.5/pi)*5*cos(theta) : y1 = (1-theta/2.5/pi)*5*sin(theta) xp = xcentre+x1 : yp = ycentre+y1 2d_point xp,yp next theta 2d_fill_color 0,0,0 2d_circle xcentre,ycentre,3 x% = x% + 30 return
copier: clipboard_copy no_picture% message "La portée a été copiée dans le presse-papier" return
panoramic: clear no_code_panoramic% item_add no_code_panoramic%,"midi_on" n% = 100 for i%=1 to n_notes% if notes%(i%)=m1% then item_add no_code_panoramic%,"midi_instrument "+str$(durees%(i%)) if notes%(i%)=m2% n% = durees%(i%) item_add no_code_panoramic%,"midi_volume "+str$(n%) end_if if notes%(i%)=0 item_add no_code_panoramic%,"midi_volume 1" item_add no_code_panoramic%,"midi_play 60,"+str$(durees%(i%)) item_add no_code_panoramic%,"midi_volume "+str$(n%) end_if if notes%(i%)>0 then item_add no_code_panoramic%,"midi_play "+str$(durees%(i%))+","+str$(durees%(i%)) next i% item_add no_code_panoramic%,"midi_off" ' clipboard_copy no_code_panoramic% ' ?????????? début du code pour remplacer clipboard_copy s$ = "" for i%=1 to count(no_code_panoramic%) s$ = s$ + item_read$(no_code_panoramic%,i%)+chr$(13)+chr$(10) next i% clipboard_string_copy s$ ' ?????????? fin du code pour remplacer clipboard_copy message "Le code Panoramic a été copié dans le presse-papier" return
dessiner_instrument: 2d_fill_color 241,246,136 2d_line x%,lig_start%+7*lig_delta%,x%,lig_start%+9*lig_delta% print_locate x%,lig_start% + 9*lig_delta% font_size no_picture%,8 font_italic_off no_picture% print "I"+str$(durees%(i%)) font_italic no_picture% font_size no_picture%,12 2d_fill_color 0,0,0 return
dessiner_volume: 2d_fill_color 241,246,136 2d_line x%,lig_start%+7*lig_delta%,x%,lig_start%+8*lig_delta% print_locate x%,lig_start% + 8*lig_delta% font_size no_picture%,8 font_italic_off no_picture% print "V"+str$(durees%(i%)) font_italic no_picture% font_size no_picture%,12 2d_fill_color 0,0,0 return
dessiner_note: if (notes%(i%)>54) and (notes%(i%)<87) : ' note dans la fourchette dessinable gosub localiser_note gosub dessiner_modificateur select durees%(i%) case 0 gosub dessiner_note_1 case 1 gosub dessiner_note_1 gosub dessiner_point case 2 gosub dessiner_note_2 case 3 gosub dessiner_note_2 gosub dessiner_point case 4 gosub dessiner_note_3 case 5 gosub dessiner_note_3 gosub dessiner_point case 6 gosub dessiner_note_4 case 7 gosub dessiner_note_4 gosub dessiner_point case 8 gosub dessiner_note_5 case 9 gosub dessiner_note_5 gosub dessiner_point case 10 gosub dessiner_note_6 case 11 gosub dessiner_note_6 gosub dessiner_point end_select if lignes_audessus%>0 then gosub dessiner_lignes_audessus if lignes_endessous%>0 then gosub dessiner_lignes_endessous x% = x% + lig_delta% + lig_delta% end_if return
dessiner_modificateur: if notes_origine%(i%,2)>0 then gosub dessiner_dieze if notes_origine%(i%,2)<0 then gosub dessiner_bmol return
dessiner_dieze: 2d_pen_width 2 2d_line x%+4,y%-lig_delta%*0.8,x%,y%+lig_delta%*0.8 2d_line x%+9,y%-lig_delta%*0.8,x%+5,y%+lig_delta%*0.8 2d_line x%,y%-2,x%+lig_delta%-1,y%-2 2d_line x%,y%+2,x%+lig_delta%-1,y%+2 2d_pen_width 1 x% = x% + lig_delta% return
dessiner_bmol: 2d_fill_color 241,246,136 print_locate x%-3,y%-10 print "b" 2d_fill_color 0,0,0 x% = x% + lig_delta%+4 return
dessiner_lignes_audessus: for j%=1 to lignes_audessus% 2d_line x%-2,lig_start%-j%*lig_delta%,x%+lig_delta%+2,lig_start%-j%*lig_delta% next j% return
dessiner_lignes_endessous: for j%=1 to lignes_endessous% 2d_line x%-2,lig_start%+(j%+4)*lig_delta%,x%+lig_delta%+2,lig_start%+(j%+4)*lig_delta% next j% return
dessiner_pause: gosub localiser_note
select durees%(i%) case 0 gosub dessiner_pause_1 case 1 gosub dessiner_pause_1 gosub dessiner_point_1 case 2 gosub dessiner_pause_2 case 3 gosub dessiner_pause_2 gosub dessiner_point_1 case 4 gosub dessiner_pause_3 case 5 gosub dessiner_pause_3 gosub dessiner_point_1 case 6 gosub dessiner_pause_4 case 7 gosub dessiner_pause_4 gosub dessiner_point_1 case 8 gosub dessiner_pause_5 case 9 gosub dessiner_pause_5 gosub dessiner_point_1 case 10 gosub dessiner_pause_6 case 11 gosub dessiner_pause_6 gosub dessiner_point_1 end_select x% = x% + lig_delta% + lig_delta% return
' dessiner note 4 temps (1 entier) dessiner_note_1: 2d_fill_color 255,255,255 2d_circle x%+lig_delta%/2+1,y%,lig_delta%/2 2d_fill_color 0,0,0 return
' dessiner note 2 temps (1/2) dessiner_note_2: 2d_fill_color 255,255,255 2d_circle x%+lig_delta%/2+1,y%,lig_delta%/2 2d_fill_color 0,0,0 if notes%(i%)<72 2d_line x%+lig_delta%-1,y%,x%+lig_delta%-1,y%-3*lig_delta% else 2d_line x%+1,y%,x%+1,y%+3*lig_delta% end_if return
' dessiner note 1 temps (1/4) dessiner_note_3: 2d_circle x%+lig_delta%/2+1,y%,lig_delta%/2 if notes%(i%)<72 2d_line x%+lig_delta%-1,y%,x%+lig_delta%-1,y%-3*lig_delta% else 2d_line x%+1,y%,x%+1,y%+3*lig_delta% end_if return
' dessiner note 1/2 temps (1/8) dessiner_note_4: 2d_circle x%+lig_delta%/2+1,y%,lig_delta%/2 if notes%(i%)<72 2d_line x%+lig_delta%-1,y%,x%+lig_delta%-1,y%-3*lig_delta% 2d_pen_width 2 2d_line x%+lig_delta%-1,y%-3*lig_delta%,x%+2,y%-5*lig_delta%/2 2d_pen_width 1 else 2d_line x%+1,y%,x%+1,y%+3*lig_delta% 2d_pen_width 2 2d_line x%+1,y%+3*lig_delta%,x%+lig_delta%-2,y%+5*lig_delta%/2 2d_pen_width 1 end_if return
' dessiner note 1/4 temps (1/16) dessiner_note_5: 2d_circle x%+lig_delta%/2+1,y%,lig_delta%/2 if notes%(i%)<72 2d_line x%+lig_delta%-1,y%,x%+lig_delta%-1,y%-3*lig_delta% 2d_pen_width 2 2d_line x%+lig_delta%-1,y%-3*lig_delta%,x%+2,y%-5*lig_delta%/2 2d_line x%+lig_delta%-1,y%-5*lig_delta%/2,x%+2,y%-2*lig_delta% 2d_pen_width 1 else 2d_line x%+1,y%,x%+1,y%+3*lig_delta% 2d_pen_width 2 2d_line x%+1,y%+3*lig_delta%,x%+lig_delta%-2,y%+5*lig_delta%/2 2d_line x%+1,y%+5*lig_delta%/2,x%+lig_delta%-2,y%+2*lig_delta% 2d_pen_width 1 end_if return
' dessiner note 1/8 temps (1/32) dessiner_note_6: 2d_circle x%+lig_delta%/2+1,y%,lig_delta%/2 if notes%(i%)<72 2d_line x%+lig_delta%-1,y%,x%+lig_delta%-1,y%-3*lig_delta% 2d_pen_width 2 2d_line x%+lig_delta%-1,y%-3*lig_delta%,x%+2,y%-5*lig_delta%/2 2d_line x%+lig_delta%-1,y%-5*lig_delta%/2,x%+2,y%-2*lig_delta% 2d_line x%+lig_delta%-1,y%-2*lig_delta%,x%+2,y%-3*lig_delta%/2 2d_pen_width 1 else 2d_line x%+1,y%,x%+1,y%+3*lig_delta% 2d_pen_width 2 2d_line x%+1,y%+3*lig_delta%,x%+lig_delta%-2,y%+5*lig_delta%/2 2d_line x%+1,y%+5*lig_delta%/2,x%+lig_delta%-2,y%+2*lig_delta% 2d_line x%+1,y%+2*lig_delta%,x%+lig_delta%-2,y%+3*lig_delta%/2 2d_pen_width 1 end_if return
' dessiner pause 4 temps (1 entier) dessiner_pause_1: 2d_fill_color 255,255,255 2d_rectangle x%+1,y%-lig_delta%/2,x%+lig_delta%,y% 2d_fill_color 0,0,0 return
' dessiner pause 2 temps (1/2) dessiner_pause_2: 2d_fill_color 255,255,255 2d_rectangle x%+1,y%,x%+lig_delta%,y%+lig_delta%/2 2d_fill_color 0,0,0 return
' dessiner pause 1 temps (1/4) dessiner_pause_3: 2d_line x%+1,y%-lig_delta%/2,x%+lig_delta%/2,y%+5*lig_delta%/2 2d_line x%+1,y%-lig_delta%/2,x%+lig_delta%/2+2,y%+lig_delta%/2-1 2d_circle x%+lig_delta%-2,y%,lig_delta%/3 return
' dessiner pause 1/2 temps (1/8) dessiner_pause_4: 2d_line x%+lig_delta%-1,y%-lig_delta%/2,x%+lig_delta%/2,y%+5*lig_delta%/2 2d_line x%+lig_delta%-1,y%-lig_delta%/2,x%+1,y%+lig_delta%/2-1 2d_circle x%+2,y%,lig_delta%/3 return
' dessiner pause 1/4 temps (1/16) dessiner_pause_5: 2d_line x%+lig_delta%-1,y%-lig_delta%/2,x%+lig_delta%/2,y%+5*lig_delta%/2 2d_line x%+lig_delta%-1,y%-lig_delta%/2,x%+1,y%+lig_delta%/2-1 2d_circle x%+2,y%,lig_delta%/3 2d_line x%+lig_delta%-1,y%+lig_delta%/2,x%+1,y%+3*lig_delta%/2-1 2d_circle x%+2,y%+lig_delta%,lig_delta%/3 return
' dessiner pause 1/8 temps (1/32) dessiner_pause_6: 2d_line x%+lig_delta%-1,y%-lig_delta%/2,x%+lig_delta%/2,y%+5*lig_delta%/2 2d_line x%+lig_delta%-1,y%-lig_delta%/2,x%+1,y%+lig_delta%/2-1 2d_circle x%+2,y%,lig_delta%/3 2d_line x%+lig_delta%-2,y%+lig_delta%/2,x%+1,y%+3*lig_delta%/2-1 2d_circle x%+2,y%+lig_delta%,lig_delta%/3 2d_line x%+lig_delta%-3,y%+3*lig_delta%/2,x%,y%+5*lig_delta%/2-1 2d_circle x%+2,y%+2*lig_delta%,lig_delta%/3 return
' dessiner un point dessiner_point: if frac(abs(y%-lig_start%)/lig_delta%)=0 gosub dessiner_point_2 else gosub dessiner_point_1 end_if return
' dessiner un point juste à droite dessiner_point_1: 2d_circle x%+lig_delta%+2,y%,2 return
' dessiner un point à droite décalé vers le bas dessiner_point_2: 2d_circle x%+lig_delta%+3,y%+4,2 return
localiser_note: index_ligne% = table_vertical%(notes_origine%(i%,1),notes_origine%(i%,0)) y% = lig_start% + index_ligne%*lig_delta%/2 if index_ligne%<0 lignes_audessus% = int((0-index_ligne%)/2) else lignes_audessus% = 0 end_if if index_ligne%>8 lignes_endessous% = int((index_ligne%-8)/2) else lignes_endessous% = 0 end_if return
sel_instrument: s$ = text$(no_instruments%) if len(s$)>3 s$ = left$(s$,3) if numeric(s$)=1 text no_ligne%,trim$(text$(no_ligne%)) + " i"+trim$(s$) return end_if end_if message "il faut choisir un instrument valide" return
sel_volume: s$ = str$(position(no_volume%)) text no_ligne%,trim$(text$(no_ligne%)) + " v"+trim$(s$) return
clic_piano: off_click no_piano% 2d_target_is no_piano% x% = mouse_x_left_down(no_piano%) y% = mouse_y_left_down(no_piano%) if y%<20 then return : ' partie inactive for i%=1 to 9 : ' identifier l'octave if x%>piano_octaves%(i%,0) if x%<piano_octaves%(i%,1) octave% = i% exit_for end_if end_if next i% if color_pixel_red(no_piano%,x%,y%)=0 : ' clic entre les touches on_click no_piano%, clic_piano return end_if if color_pixel_red(no_piano%,x%,y%)=1 : ' identifier touche blanche/noire flag_noire% = 1 else flag_noire% = 0 end_if 2d_flood x%,y%,255,0,0 j% = x% - piano_octaves%(octave%,0) touche_blanche% = int((j%+largeur_blanche%-1)/largeur_blanche%) if octave%=1 then touche_blanche% = touche_blanche% + 4 touche_noire%=0 if flag_noire%=1 if (touche_blanche%-1)*largeur_blanche%+largeur_blanche%*0.6<j% touche_noire% = 1 else touche_noire% = M1% end_if end_if mark_on no_octaves%+octave% mark_on no_notes%+touche_blanche% if flag_noire%=1 if touche_noire%=1 mark_on no_modif%+2 else mark_on no_modif%+3 end_if else mark_on no_modif%+1 end_if gosub inserer if flag_noire%=1 2d_flood x%,y%,1,0,0 else 2d_flood x%,y%,255,255,255 end_if on_click no_piano%, clic_piano return
inserer: inactive no_inserer% s1$ = "" for i%=1 to 9 if checked(no_octaves%+i%)=1 s1$ = caption$(no_octaves%+i%) exit_for end_if next i% for i%=1 to 8 if checked(no_notes%+i%)=1 s1$ = s1$ + caption$(no_notes%+i%) if i%=8 then s1$ = mid$(s1$,2,len(s1$)) exit_for end_if next i% if right$(s1$,1)<>"p" for i%=2 to 3 if checked(no_modif%+i%)=1 s1$ = s1$ + caption$(no_modif%+i%) exit_for end_if next i% end_if s1$ = s1$ + left$(text$(no_duree%),1) if checked(no_duree%+1)=1 then s1$ = s1$ + "." if checked(no_ecoute_immediate%)=1 mode_immediat% = 1 s$ = s1$ + " " n_notes% = 0 gosub compiler_immediat gosub jouer mode_immediat% = 0 end_if text no_ligne%,trim$(trim$(text$(no_ligne%)) + " "+trim$(s1$)) active no_inserer% return
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un exemple de génération de mélodie avec les fonctions MIDI Mar 21 Aoû 2012 - 12:07 | |
| Merci Papydall ! Ton bouton Arrêter manquait, en affet. Je l'ai intégré à mon source et remis en ligne dans le premier post. Ainsi, cela intègre aussi mon dernier correctif par rapport à un blocage du piano. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un exemple de génération de mélodie avec les fonctions MIDI Mar 21 Aoû 2012 - 18:55 | |
| Nouveauté: il y a maintenant des boutons Ouvrir et Sauver à côté du mémo de la partition. Cela permet de sauvegarder sa mélodie dans un fichier *.mel (comme mélodie) et de le récupérer. | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Un exemple de génération de mélodie avec les fonctions MIDI Mar 21 Aoû 2012 - 19:50 | |
| Nickel Klaus, 2 petites remarques toutefois. Avec l'écoute immédiate, il ne tient pas compte du changement d'instrument (il faut avoir jouer le changement pour qu'il fasse l'écoute immédiate avec l'instrument sélectionné) Il serait pratique d'avoir un bouton type "vider en cours" pour effacer la ligne de saisie de manière plus rapide si l'écoute immédiate ne nous plait pas et que l'on veut modifier quelque chose | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 21 Aoû 2012 - 20:02 | |
| Je n'aurai qu' un commentaire à faire : GENIAL !!!!... à une seule condition ! NE PAS ETRE MOI ! un ignare complet du solfège et seulement bon à écouter de la musique.... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 21 Aoû 2012 - 23:18 | |
| Je n'ai pas étudié ton code, donc je ne sais pas comment tu fais tes notes sur la portée. mais peut être que ceci te donnerai une idée (généré un alpha que tu place en hauteur et qui soit porteur d'un signe du solfège...) voilà un truc que j'ai vu en cherchant des polices : http://www.dafont.com/fr/lassus.fontsi cela peut te servir .... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un exemple de génération de mélodie avec les fonctions MIDI Mar 21 Aoû 2012 - 23:38 | |
| Je dessine absolument tout avec les fonctions 2d_xxx de Panoramic - la portée, les notes, les # et b, la clé de sol...
Mais cette police est intéressante. je l'ai téléchargée et je vais voir ce que je peux en faire. Merci pour l'info. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un exemple de génération de mélodie avec les fonctions MIDI Mer 22 Aoû 2012 - 1:19 | |
| Grande nouveauté: j'ai ajoute deux boutons à côté du mémo de la partition: - transposition d'un demi-ton plus haut - transposition d'un demi-ton plus bas
Ceci permettra de jouer une mélodie dans la gamme la plus simple (DO en général), puis de la transposer, demi-ton par demi-ton, vers la gamme dans laquelle elle doit être jouée. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un exemple de génération de mélodie avec les fonctions MIDI Mer 22 Aoû 2012 - 13:20 | |
| Autre nouveauté: 2 nouveaux boutons pour accélérer ou ralentir le morceau ! Et voici en prime la Marseillaise en gamme FA, saisie au piano: - Citation :
- 0do6 0do5. 0do6 0fa4 0fa4 0sol4 0sol4 1do4. 0la5 0fa5. 0fa6 0la5. 0fa6 0ré4 0sib3 0sol5. 0mi6 0fa3 p4 0fa5. 0sol6
0la4 0la4 0la4 0sib5. 0la6 0la4 0sol4 p4 0sol5. 0la6 0sib4 0sib4 0sib4 1do5. 0sib6 0la3 p4 1do5. 1do6 1do4 0la5. 0fa6 1do4 0la5. 0fa6 0do3 p5. 0do6 0do5. 0mi6 0sol3 0sib4 0sol5. 0mi6 0sol4 0fa4 0mib3 0ré4 0fa5. 0fa6 0fa4 0mi5. 0fa6 0sol3. 0sol4 0lab4. 0lab5 0lab5 0lab5 0sib5 1do5 0sol3. 0lab5 0sol5 0fa4. 0fa5 0fa5 0lab5 0sol5 0fa5 0fa3 0mi5 p5 p5 p6 1do6 1do3 1do5. 1do6 0la5. 0fa6 0sol3. p6. 1do6 1do3 1do5. 1do6 0la5. 0fa6 0sol3 p4 0do4 0fa3 p4 0sol4 0la3 p3 0la#3 1do4 1ré4 0sol3. 1ré4 1do3 1do5. 0la6 0sib5. 0sol6 0fa3. | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Un exemple de génération de mélodie avec les fonctions MIDI Mer 22 Aoû 2012 - 14:15 | |
| Cool, bonne idée de partager ces musique sur le forum Ca permet d'éviter d'avoir tous à ce les créer. Je vais essayer d'en faire un peu aussi pour partager | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un exemple de génération de mélodie avec les fonctions MIDI Mer 22 Aoû 2012 - 14:36 | |
| Et tu as vu, à partir d'une musique dans ce format qu'il suffit de copier/coller dans le memo de la partition pour pouvoir la jouer, tu peux générer le code Panoramic pour l'exécuter directement dans un programme ? Clique sur Jouer, tu laisses aller jusqu'au bout ou tu l'arrêtes par Arrêter - peu importe, tu cliques sur Partition, et tu as entre autres un bouton Panoramic. Ce bouton copie le code Panoramic nécessaire dans le presse-papier !
Autre chose: j'ai modifié le dessin de la partition sur la portée de sorte que celle-ci s'étende en largeur pour s'adapter automatiquement à la longueur du morceau. Testé avec la marseillaise: toute la partition est visible. Et un clic que le bouton Effacer reconstruit les dimensions initiales de la partition, entre autres. | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Un exemple de génération de mélodie avec les fonctions MIDI Mer 22 Aoû 2012 - 14:37 | |
| Super interessant ce programme Klaus
Serait il possible de charger des fichiers midi existant ?
car la pour le coup on aurait un playeur très complet ! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un exemple de génération de mélodie avec les fonctions MIDI Mer 22 Aoû 2012 - 15:00 | |
| Malheureusement non. Et ça tien au fait que j'utilise exclusivement les commandes MIDI_xxx de Panoramic qui ne donnent accès qu'à un sous-ensemble très restraint des fonctions midi sur l'ordinateur. Pour avoir un player complet, il faudrait passer par une DLL en Delphi, comme d'habitude dans ces cas-là.
Pour moi, le but était de mettre en lumière les possibilités des fonctions midi de Panoramic,. Et un second objectif était la possibilité de constituer un programme jukebox qui intégrerait une multitude de mélodies codées via le code généré du bouton Panoramio de mon programme. Ce jukebox pourrait alors servir de fond sonore pour un jeu, sans ralentir le jeu lui-même.
EDIT
correction d'un bug avec la génération du code Panoramic
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un exemple de génération de mélodie avec les fonctions MIDI Mer 22 Aoû 2012 - 18:45 | |
| J'ai réalisé une première version d'un programme Jukebox pour laisser jouer des mélodies en arrière-plan. J'utilise le mécanisme de communication entre programmes de KGF.dll. Cette DLL est donc requise pour tout programme qui veut se servir du Jukebox. Le Jukebox lui-même n'a pas besoin de la DLL. Le programme Jukebox.bas présenté ci-après doit être compilé en EXE et placé dans le même dossier que KGF.dll et le programme test_Jukebox.bas présenté après. Jukebox.bas montre une toute petite fenêtre en haut à droite de l'écran, avec un seul bouton: Stop. Il permet d'arrêter une mélodie, pourvu que que l'interruption soit prévue dans la mélodie. Le programme est fourni avec deux mélodies: 1. la Marseillaise publiée dans un post précédent 2. une mélodie de 5 notes DO-RE-MI-RE-DO La Marseillaise est prévue "interruptible", l'autre mélodie ne l'est pas. Les mélodies sont déclenchées mar des messages en forme de chaînes de caractères contenant le numéro de la mélodie à jouer. En regardant le source du Jukebox, vous trouverez facilement comment y insérer vos propres mélodies. Pour la Marseillaise, je l'ai insérée par copier/coller à partir du résultat du bouton Panoramic dans mon programme musique.bas, puis j'y ai inséré les tests d'interruption. Le programme appelant envoie un message "0" pour interrompre le morceau en cours par programme. Si aucun morceau n'est en cours, cette commande est ignorée. Le Jukebox met les demandes de mélodies en file d'attente dans un DLIST. Les mélodies sont jouées dans l'ordre d'arrivée des demandes. Plusieurs programmes peuvent techniquement se servir du même Jukebox, mais cela n'a guère de sens, car Panoramic ne sait jouer qu'une seule note à la fois, et les mélodies sont toutes mises en file d'attente. Voici le Jukebox: - Code:
-
' jukebox.bas
label labels : gosub labels gosub constantes gosub variables gosub donnees gosub form0 gosub menu gosub GUI gosub initialisations
end
labels: label constantes, variables, donnees, form0, menu, GUI, initialisations label reception, arret, arreter, debut label marseillaise, melodie_2, tick return constantes: dim mailbox% : mailbox% = 0-1968 : ' identifiant de la boite à lettres = -1968 return variables: dim no%, no1%, no2%, i%, j%, k%, n%, s$, s1$, s2$ dim flag_stop% : ' flag "arrêt demandé" dim flag_midi% : ' flag "séquence midi en cours" dim no_bal%, no_file% , no_timer% return
donnees: return
form0: caption 0,"Jukebox" width 0,200 : height 0,60 : left 0,screen_x - width(0) return
menu: return GUI: ' timer pour la surveillance de la file d'attente no% = no% + 1 : timer no% : no_timer% = no% : timer_interval no%,100 on_timer no%,tick : timer_off no% ' boite à lettres: no% = no% + 1 : edit no% : no_bal% = no% : top no%,mailbox% : left no%,mailbox% on_change no%,reception ' file d'attente no% = no% + 1 : dlist no% : no_file% = no% ' bouton d'arrêt no% = no% + 1 : button no% : width no%,width(0)-8 : caption no%,"Stop" : on_click no%,arret return
initialisations: return arret: flag_stop% = 1 return arreter: if flag_midi%=1 then midi_off flag_stop% = 0 flag_midi% = 0 goto debut reception: timer_off no_timer% s$ = trim$(text$(no_bal%)) if s$="0" flag_stop% = 1 else item_add no_file%,s$ end_if timer_on no_timer% return
tick: timer_off no_timer% debut: if count(no_file%)=0 then return s$ = item_read$(no_file%,1) item_delete no_file%,1 if numeric(s$)=0 then return n% = int(val(s$)) select n% case 0: goto arret case 1: goto marseillaise case 2: goto melodie_2 end_select goto debut marseillaise: flag_midi% = 1 midi_on midi_play 60,10 midi_play 60,9 midi_play 60,10 midi_play 65,6 midi_play 65,6 midi_play 67,6 midi_play 67,6 midi_play 72,7 midi_play 69,8 if flag_stop%=1 then goto arreter midi_play 65,9 midi_play 65,10 midi_play 69,9 midi_play 65,10 midi_play 62,6 midi_play 70,4 midi_play 67,9 midi_play 64,10 if flag_stop%=1 then goto arreter midi_play 65,4 midi_volume 1 midi_play 60,6 midi_volume 100 midi_play 65,9 midi_play 67,10 midi_play 69,6 midi_play 69,6 midi_play 69,6 if flag_stop%=1 then goto arreter midi_play 70,9 midi_play 69,10 midi_play 69,6 midi_play 67,6 midi_volume 1 midi_play 60,6 midi_volume 100 midi_play 67,9 midi_play 69,10 if flag_stop%=1 then goto arreter midi_play 70,6 midi_play 70,6 midi_play 70,6 midi_play 72,9 midi_play 70,10 midi_play 69,4 midi_volume 1 midi_play 60,6 midi_volume 100 if flag_stop%=1 then goto arreter midi_play 72,9 midi_play 72,10 midi_play 72,6 midi_play 69,9 midi_play 65,10 midi_play 72,6 midi_play 69,9 midi_play 65,10 midi_play 60,4 if flag_stop%=1 then goto arreter midi_volume 1 midi_play 60,9 midi_volume 100 midi_play 60,10 midi_play 60,9 midi_play 64,10 midi_play 67,4 midi_play 70,6 midi_play 67,9 if flag_stop%=1 then goto arreter midi_play 64,10 midi_play 67,6 midi_play 65,6 midi_play 63,4 midi_play 62,6 midi_play 65,9 midi_play 65,10 midi_play 65,6 midi_play 64,9 if flag_stop%=1 then goto arreter midi_play 65,10 midi_play 67,5 midi_play 67,6 midi_play 68,7 midi_play 68,8 midi_play 68,8 midi_play 68,8 midi_play 70,8 midi_play 72,8 if flag_stop%=1 then goto arreter midi_play 67,5 midi_play 68,8 midi_play 67,8 midi_play 65,7 midi_play 65,8 midi_play 65,8 midi_play 68,8 midi_play 67,8 midi_play 65,8 if flag_stop%=1 then goto arreter midi_play 65,4 midi_play 64,8 midi_volume 1 midi_play 60,8 midi_volume 100 midi_volume 1 midi_play 60,8 midi_volume 100 midi_volume 1 if flag_stop%=1 then goto arreter midi_play 60,10 midi_volume 100 midi_play 72,10 midi_play 72,4 midi_play 72,9 midi_play 72,10 midi_play 69,9 midi_play 65,10 midi_play 67,5 if flag_stop%=1 then goto arreter midi_volume 1 midi_play 60,11 midi_volume 100 midi_play 72,10 midi_play 72,4 midi_play 72,9 midi_play 72,10 midi_play 69,9 midi_play 65,10 if flag_stop%=1 then goto arreter midi_play 67,4 midi_volume 1 midi_play 60,6 midi_volume 100 midi_play 60,6 midi_play 65,4 midi_volume 1 midi_play 60,6 midi_volume 100 if flag_stop%=1 then goto arreter midi_play 67,6 midi_play 69,4 midi_volume 1 midi_play 60,4 midi_volume 100 midi_play 70,4 midi_play 72,6 midi_play 74,6 midi_play 67,5 if flag_stop%=1 then goto arreter midi_play 74,6 midi_play 72,4 midi_play 72,9 midi_play 69,10 midi_play 70,9 midi_play 67,10 midi_play 65,5 midi_off flag_midi% = 0 goto debut
melodie_2: flag_midi% = 1 midi_on midi_play 60,4 midi_play 62,4 midi_play 64,4 midi_play 62,4 midi_play 60,4 midi_off flag_midi% = 0 goto debut
et voici le programme permettant de lancer l'une ou l'autre des mélodies, et d'interrompre la mélodie en cours (effectif sur la Marseillaise uniquement). - Code:
-
' test_jukebox.bas
label labels : gosub labels gosub constantes gosub variables gosub donnees gosub form0 gosub menu gosub GUI gosub initialisations
end
labels: label constantes, variables, donnees, form0, menu, GUI, initialisations label arret, envoi return
constantes: dim dll$ : dll$ = "KGF.dll" dim jukebox$ : jukebox$ = "Jukebox" dim mailbox% : mailbox% = 0-1968 : ' identifiant de la boite à lettres = -1968 return
variables: dim no%, no1%, no2%, i%, j%, k%, n%, s$, s1$, s2$ dim no_combo%, no_stop% dim hnd%, mes$, res% return
donnees: return
form0: caption 0,"Test Jukebox" return
menu: return
GUI: ' bouton d'arrêt no% = no% + 1 : button no% : no_stop% = no% : inactive no% width no%,width(0)-8 : caption no%,"Stop" : on_click no%,arret
' Liste des mélodies no% = no% + 1 : combo no% : no_combo% = no% : top no%,40 : left no%,10 on_click no%,envoi : inactive no% item_add no%,"La Marseillaise" item_add no%,"Mélodie 2"
return
initialisations: dll_on dll$ hnd% = dll_call3("IPCGetHandle",adr(jukebox$),len(jukebox$),mailbox%) ' if hnd%=0 then message "Le Jukebox n'est pas lancé !" if hnd%=0 execute "Jukebox.exe" wait 1000 hnd% = dll_call3("IPCGetHandle",adr(jukebox$),len(jukebox$),mailbox%) if hnd%=0 then message "Le Jukebox ne peut pas être lancé !" end_if active no_combo% active no_stop% return
envoi: mes$ = str$(item_index(no_combo%)) res% = DLL_call3("IPCSendMessage",adr(mes$),len(mes$),hnd%) return arret: mes$ = "0" res% = DLL_call3("IPCSendMessage",adr(mes$),len(mes$),hnd%) return
| |
| | | Contenu sponsorisé
| Sujet: Re: Un exemple de génération de mélodie avec les fonctions MIDI | |
| |
| | | | Un exemple de génération de mélodie avec les fonctions MIDI | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |