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 |
---|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Un exemple de génération de mélodie avec les fonctions MIDI Sam 18 Aoû 2012 - 17:24 | |
| Voici un petit programme pour s'amuser avec les fonctions MIDI. L'écran est divisé en 3 parties: - en haut, on a une zone de configuration pour une note individuelle. Le bouton Insérer insère un codage de la note dans la ligne en-dessous - en-dessous, il y a une seule ligne de texte dans laquelle on peut saisir directement le code des notes, ou les insérer par le bouton Insérer, en fonction des paramètres de configuration au-dessus. Il y a aussi un sélecteur d'instruments et un sélecteur de volume avec des touches Choisir associées - ces touches envoient le codage d'un instrument ou du niveau sonore dans la ligne - en-dessous, il y a un mémo recevant la partition qui sera jouée. Le bouton Ajouter place le contenue de la ligne de saisie à la fin du mémo. On peut aussi saisir directement dans le mémo. Le bouton Effacer vide le mémo. Et le bouton Démo ajoute une petite mélodie de démonstration dans le mémo. Finalement, le bouton Jouer permet de jouer la partition contenue dans le mémo. Il y a une documentation détaillée des codages dans le source du programme. Et j'ai en particulier retrouvé l'ensemble des 127 instruments possibles (grâce à Google), et ils sont tous dans le combo de sélection à gauche de la zone de configuration. - 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, ouvrir, sauver, transplus, transmoins label speedplus, speedmoins, speed label tp1, tp2, tp3, tm1, tm2, tm3 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 octaves$ : octaves$ = "dcba01234" dim liste_notes$ : liste_notes$ = "do ré mi fa solla si do " 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%, no_open%, no_save% dim flag_pointe%, flag_done%, mode_immediat%, octave$ 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: no% = no% + 1 : open_dialog no% : no_open% = no% filter no%,"Mélodies|*.mel" no% = no% + 1 : save_dialog no% : no_save% = no% filter no%,"Mélodies|*.mel" ' 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)*0.8 no_partition% = no% : bar_vertical no% : height no%,200 no% = no% + 1 : button no% : top no%,180 : left no%,left(no%-1)+width(no%-1)+10 caption no%,"Ouvrir" : width no%,90 : on_click no%,ouvrir no% = no% + 1 : button no% : top no%,205 : left no%,left(no%-1) caption no%,"Sauver" : width no%,90 : on_click no%,sauver no% = no% + 1 : button no% : top no%,260 : left no%,left(no%-1) caption no%,"Transposer +1/2" : width no%,90 : on_click no%,transplus no% = no% + 1 : button no% : top no%,285 : left no%,left(no%-1) caption no%,"Transposer -1/2" : width no%,90 : on_click no%,transmoins
no% = no% + 1 : button no% : top no%,330 : left no%,left(no%-1) caption no%,"Plus rapide" : width no%,90 : on_click no%,speedplus no% = no% + 1 : button no% : top no%,355 : left no%,left(no%-1) caption no%,"Moins rapide" : width no%,90 : on_click no%,speedmoins
no% = no% + 1 : button no% : no_jouer% = no% : top no%,410 : left no%,200 caption no%,"Jouer" : on_click no%,start : hide no% no% = no% + 1 : button no%: no_dessiner% = no% : hide no% : top no%,410 : left no%,450 caption no%,"Partition" : on_click no%,dessiner ' Papydall no% = no% +1 : button no% : no_arreter% = no% : top no%,410 : left no%,100 caption no%,"Arreter" : hide no% 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
ouvrir: s$ = file_name$(no_open%) if s$="_" then return if lower$(right$(s$,4))<>".mel" then s$ = s$ + ".mel" file_open_read 1,s$ file_readln 1,s1$ if s1$<>"; Mélodie" message "Ce n'est pas un fichier mélodie valide" file_close 1 return end_if while file_eof(1)=0 file_readln 1,s1$ item_add no_partition%,s1$ end_while file_close 1 show no_jouer% set_focus no_ligne% return sauver: if count(no_partition%)=0 message "Il n'y a rien à sauvegarder." return end_if s$ = file_name$(no_save%) if s$="_" then return if lower$(right$(s$,4))<>".mel" then s$ = s$ + ".mel" file_open_write 1,s$ file_writeln 1,"; Mélodie" for i%=1 to count(no_partition%) file_writeln 1,trim$(item_read$(no_partition%,i%)) : ' +" " next i% file_close 1 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$ show no_jouer% set_focus no_ligne% 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(octaves$,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% if width(no_picture%)<(x%+2*lig_delta%) width no_picture%,width(no_picture%)+10*lig_delta% 2d_fill_color 241,246,136 2d_pen_color 241,246,136 2d_rectangle w%-1,0,width(no_picture%)-1,height(no_picture%)-1 w% = width(no_picture%) 2d_pen_color 0,0,0 end_if 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 :' Nombre de tours, ici 10 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$(notes%(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 on_click no_piano%, clic_piano return : ' partie inactive end_if 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 transplus: if count(no_partition%)=0 message "La partition est vide." return end_if for i%=1 to count(no_partition%) s$ = item_read$(no_partition%,i%) + " " s2$ = "" j% = instr(s$," ") while j%>0 s1$ = left$(s$,j%-1) s$ = mid$(s$,j%+1,len(s$)) if instr("ivp",left$(s1$,1))>0 : ' instrument, volume, pause s2$ = s2$ + s1$ + " " else : ' vraies notes octave$ = left$(s1$,1) octave% = instr(octaves$,octave$) s1$ = mid$(s1$,2,len(s1$)) if left$(s1$,2)="do" then gosub tp1 if left$(s1$,2)="ré" then gosub tp1 if left$(s1$,2)="mi" then gosub tp2 if left$(s1$,2)="fa" then gosub tp1 if left$(s1$,3)="sol" then gosub tp1 if left$(s1$,2)="la" then gosub tp1 if left$(s1$,2)="si" then gosub tp3 end_if j% = instr(s$," ") end_while item_delete no_partition%,i% item_insert no_partition%,i%,trim$(s2$) next i% return tp1: : ' note note suivi d'une noire if instr(s1$,"b")>0 : ' en b-mol ? enlever le b-mol ! s2$ = s2$ + octave$+left$(s1$,len(s1$)-2)+right$(s1$,1)+" " return end_if if instr(s1$,"#")>0 : ' en # ? passer à la note supérieure sans modificateur ! j% = instr(liste_notes$,left$(s1$,2)) + 3 s2$ = s2$ + octave$+trim$(mid$(liste_notes$,j%,3))+right$(s1$,1)+" " return end_if : ' ici en note simple - passer en # ! s2$ = s2$ + octave$+left$(s1$,len(s1$)-1)+"#"+right$(s1$,1)+" " return tp2: : ' note suivie d'une blanche if instr(s1$,"b")>0 : ' en b-mol ? enlever le b-mol ! s2$ = s2$ + octave$+left$(s1$,len(s1$)-2)+right$(s1$,1)+" " return end_if : ' ici en note simple - passer à la note supérieure ! j% = instr(liste_notes$,left$(s1$,2)) + 3 s2$ = s2$ + octave$+trim$(mid$(liste_notes$,j%,3))+right$(s1$,1)+" " return tp3: : ' si: changement d'octave if instr(s1$,"b")>0 : ' en b-mol ? enlever le b-mol ! s2$ = s2$ + octave$+left$(s1$,len(s1$)-2)+right$(s1$,1)+" " return end_if : ' ici en note simple - passer à do octave supérieure ! s2$ = s2$ + mid$(octaves$,octave%+1,1)+"do"+right$(s1$,1)+" " return
transmoins: if count(no_partition%)=0 message "La partition est vide." return end_if for i%=1 to count(no_partition%) s$ = item_read$(no_partition%,i%) + " " s2$ = "" j% = instr(s$," ") while j%>0 s1$ = left$(s$,j%-1) s$ = mid$(s$,j%+1,len(s$)) if instr("ivp",left$(s1$,1))>0 : ' instrument, volume, pause s2$ = s2$ + s1$ + " " else : ' vraies notes octave$ = left$(s1$,1) octave% = instr(octaves$,octave$) s1$ = mid$(s1$,2,len(s1$)) if left$(s1$,2)="do" then gosub tm3 if left$(s1$,2)="ré" then gosub tm1 if left$(s1$,2)="mi" then gosub tm1 if left$(s1$,2)="fa" then gosub tm2 if left$(s1$,3)="sol" then gosub tm1 if left$(s1$,2)="la" then gosub tm1 if left$(s1$,2)="si" then gosub tm1 end_if j% = instr(s$," ") end_while item_delete no_partition%,i% item_insert no_partition%,i%,trim$(s2$) next i% return tm1: : ' note note précédée d'une noire if instr(s1$,"#")>0 : ' en # ? enlever le # ! s2$ = s2$ + octave$+left$(s1$,len(s1$)-2)+right$(s1$,1)+" " return end_if if instr(s1$,"b")>0 : ' en b-mol ? passer à la note inférieure sans modificateur ! j% = instr(liste_notes$,left$(s1$,2)) - 3 s2$ = s2$ + octave$+trim$(mid$(liste_notes$,j%,3))+right$(s1$,1)+" " return end_if : ' ici en note simple - passer en b-mol ! s2$ = s2$ + octave$+left$(s1$,len(s1$)-1)+"b"+right$(s1$,1)+" " return tm2: : ' note précédée d'une blanche if instr(s1$,"#")>0 : ' en # ? enlever le # ! s2$ = s2$ + octave$+left$(s1$,len(s1$)-2)+right$(s1$,1)+" " return end_if : ' ici en note simple - passer à la note inférieure ! j% = instr(liste_notes$,left$(s1$,2)) - 3 s2$ = s2$ + octave$+trim$(mid$(liste_notes$,j%,3))+right$(s1$,1)+" " return tm3: : ' si: changement d'octave if instr(s1$,"#")>0 : ' # ? enlever le #l ! s2$ = s2$ + octave$+left$(s1$,len(s1$)-2)+right$(s1$,1)+" " return end_if : ' ici en note simple - passer à si octave inférieure ! s2$ = s2$ + mid$(octaves$,octave%-1,1)+"si"+right$(s1$,1)+" " return
speedplus: n% = 1 gosub speed return speedmoins: n% = m1% gosub speed return
speed: if count(no_partition%)=0 message "La partition est vide." return end_if for i%=1 to count(no_partition%) s$ = item_read$(no_partition%,i%) + " " s2$ = "" j% = instr(s$," ") while j%>0 s1$ = left$(s$,j%-1) s$ = mid$(s$,j%+1,len(s$)) if instr("iv",left$(s1$,1))>0 : ' instrument, volume, pause s2$ = s2$ + s1$ + " " else : ' vraies notes if right$(s1$,1)="." k% = val(mid$(s1$,len(s1$)-1,1)) + n% if k%<1 or k%>6 s2$ = s2$ + s1$ + " " else s2$ = s2$ + left$(s1$,len(s1$)-2)+str$(k%) + ". " end_if else k% = val(right$(s1$,1))+n% if k%<1 or k%>6 s2$ = s2$ + s1$ + " " else s2$ = s2$ + left$(s1$,len(s1$)-1)+str$(k%) + " " end_if end_if end_if j% = instr(s$," ") end_while item_delete no_partition%,i% item_insert no_partition%,i%,trim$(s2$) next i% return
EDIT Ajout de la possibilité de dessiner la portée de la mélodie qui a été jouée !
Dernière édition par Klaus le Mer 22 Aoû 2012 - 16:16, édité 30 fois | |
| | | 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 Sam 18 Aoû 2012 - 17:45 | |
| Très propre comme d'habitude Klaus Dommage que l'on ne puisse pas utiliser le midi sans ralentir les programmes sinon en jonglant avec un timer on pourrait faire des mélodies pendant les jeux en musique de fond .... | |
| | | 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 Sam 18 Aoû 2012 - 17:48 | |
| Tu peux le faire avec KGF.dll - j'ai ajouté des fonctions qui gèrent de Windows Media Player... Mais le programme ici est en Panoramic pur.
| |
| | | 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 Sam 18 Aoû 2012 - 18:10 | |
| J'ai supprime un message de trace que j'avais laissé par erreur ! | |
| | | 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 Dim 19 Aoû 2012 - 14:53 | |
| J'ai mis une nouvelle version dans mon premier post. Lorsqu'on ajoué une mélodie, un bouton "Partition" apparaît. Un clic sur ce bouton génère une portée dans le bas de l'écran, avec les notes de la mélodie qui vient d'être jouée. Ce qui marche: - toutes les pauses et soupirs, pointés ou non, quelque soit la durée - toutes les notes non pointées, quelque soit la durée Ce qu ne marche pas encore, à venir prochainement: - les notes pointées - les modificateurs # et b- le signalement du changement d'instrument et de volume Voici un aperçu, avec la portée de la mélodie de démo: Tout le graphisme est entièrement généré par le programme. Il n'y a rien d'externe. | |
| | | 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 Dim 19 Aoû 2012 - 15:13 | |
| Bien joué Klaus... Heu pour faire beau tu veux dessiner une clé de Sol pour marquer le début ? Enfin ça c'est un peu un gadget bonne continuation pour finir les dièse, bémol et les pointées. | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| | | | 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 Dim 19 Aoû 2012 - 15:33 | |
| Les notes pointées - ça marche maintenant. Et l'évolution continue...
La clé de sol - j'y pense. Mais c'est compliqué à dessiner avec les fonctions 2D_xxx car on n'a pas de fonctions pour dessiner un arc ou une spirale. Et je veux le faire entièrement en Panoramic. C'est également la raison pour laquelle j'ai choisi la forme alternative du soupir à un temps et non la forme normale car elle est trop compliquée à dessiner. Mais on verra bien...
Maintenant, je vais faire les # et b. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| | | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Un exemple de génération de mélodie avec les fonctions MIDI Dim 19 Aoû 2012 - 15:40 | |
| Bonjour Klaus, Je n'ai pas testé ton programme, mais regarde ceci, c'est ce que j'avais fait déjà il y a quelques mois... https://panoramic.1fr1.net/t2245-utilitaire-pour-les-instructions-midi?highlight=midiJ'avais repris le programme ensuite d'une autre manière - Code:
-
dim i,j,k,r,g,b,d,note(61),n1,n2,n3,inst$ label fin,joue_note,select_instrument,duree,arp width 0,800:height 0,580:left 0,(screen_x-width(0))/2:top 0,(screen_y-height(0))/2 caption 0,"GÉNÉRATEUR DE NOTES, D'INSTRUMENTS MIDI, D'ARPÈGES ET SÉQUENCEUR":color 0,15,30,45 ' Le clavier de 5 octaves ==> ********** [ objets PICTURE de 1 à 61 ] ********** j=480:for k=0 to 4:for i=1 to 12 if i<>2 and i<>4 and i<>7 and i<>9 and i<>11 picture i+k*12:width i+k*12,50:height i+k*12,12:top i+k*12,j:j=j-13 end_if next i:next k j=488:for k=0 to 4:for i=1 to 12 if i=2 or i=4 or i=7 or i=9 or i=11 if i=2 or i=7 then j=j-13 picture i+k*12:width i+k*12,30:height i+k*12,10:top i+k*12,j:color i+k*12,30,30,35:j=j-13 end_if next i:next k picture 61:width 61,50:height 61,12:top 61,25 for i=1 to 61:on_click i,joue_note:next i ' Le nom des notes "Do" de début et fin d'octave pour se repérer sur le clavier: ' Ecrire C1,C2,C3,C4,C5 et C6 sur le clavier ' ==> ********** [ objets ALPHA de 62 à 67 ] ********** j=484:for i=62 to 67:alpha i:left i,1:top i,j:color i,255,255,255:font_name i,"Courier New":font_color i,255,0,0:font_size i,6:caption i,"C"+str$(i-61):j=j-91:next i ' ***************** [ 68 A 98 RÉSERVÉS OPTIONS MENU ] ********************** main_menu 68 sub_menu 69:parent 69,68:caption 69,"Fichier" sub_menu 70:parent 70,69:caption 70,"Nouveau" sub_menu 71:parent 71,69:caption 71,"Sauver" sub_menu 72:parent 72,69:caption 72,"Quitter":on_click 72,fin
sub_menu 80:parent 80,68:caption 80,"Outils" sub_menu 81:parent 81,80:caption 81,"Instrument":on_click 81,select_instrument Sub_menu 82:parent 82,80:caption 82,"Durée":on_click 82,duree Sub_menu 83:parent 83,80:caption 83,"Arpèges":on_click 83,arp Sub_menu 84:parent 84,80:caption 84,"Gammes"
sub_menu 90:parent 90,68:caption 90,"Séquenceur"
' Liste des instruments midi: ==> ************* [ objet LIST 99 ] ************** list 99:hide 99:color 99,200,160,170:width 99,240:height 99,323:left 99,100:top 99,1 font_name 99,"OpenSymbol":font_size 99,12:font_bold 99 restore:for i=0 to 126:read inst$:item_add 99,inst$:next i ' Liste des types de notes ou durée: ==> ********* [ objet LIST 100 ] ********** list 100:hide 100:color 100,170,160,200:width 100,240:height 100,197:left 100,left(99):top 100,top(99)+height(99)+1 font_name 100,"OpenSymbol":font_size 100,12:font_bold 100 for i=1 to 12:read inst$:item_add 100,inst$:next i ' Liste des notes de base des arpèges: ==> ******** [ objet LIST 101 ] ********* list 101:hide 101:color 101,160,200,170:width 101,100:height 101,200:left 101,left(99)+width(99)+1:top 101,1 font_name 101,"OpenSymbol":font_size 101,12:font_bold 101 for i=1 to 12:read inst$:item_add 101,inst$:next i ' Liste des accords suivis par les arpèges: ==> ****** [ objet LIST 102 ] ****** list 102:hide 102:color 102,80,160,80:width 102,100:height 102,320:left 102,left(101):top 102,top(101)+height(101)+1 font_name 102,"OpenSymbol":font_size 102,12:font_bold 102 for i=1 to 22:read inst$:read n1:read n2:read n3:item_add 102,inst$:next i
' Bouton on/off pour démarrer les arpèges-gammes: ==> ** [ objet BUTTON 110 ] ** button 110:hide 110:left 110,10:top 110,500:width 110,30:height 110,20:caption 110,"ON" ' initialisation d=9:k=0:for i=1 to 61:note(i)=i+35:next i:midi_on:midi_instrument 1 font_color 0,255,255,255:print_locate 0,0:print "001 Bright Acoustic Piano" on_close 0,fin end
joue_note: if k<>0 then return k=number_click:r=color_pixel_red(k,1,1):g=color_pixel_green(k,1,1):b=color_pixel_blue(k,1,1) color k,0,200,200:midi_play note(k),d:color k,r,g,b:k=0:return
select_instrument: show 99:while item_index(99)=0:end_while inst$=item_read$(99,item_index(99)):midi_instrument val(left$(inst$,3)) item_delete 99,item_index(99):item_insert 99,val(left$(inst$,3)),inst$:hide 99 print_locate 0,0:print inst$;string$(29-len(inst$)," "):return
duree: show 100:while item_index(100)=0:end_while inst$=item_read$(100,item_index(100)):d=val(left$(inst$,2)) item_insert 100,item_index(100),inst$:item_delete 100,item_index(100):hide 100:return
arp: show 101:show 102:show 110 while clicked(110)=0 end_while caption 110,"OFF" while clicked(110)=0 end_while caption 110,"ON" hide 101:hide 102:hide 110 return
' Datas des instruments midis data "001 Bright Acoustic Piano","002 Electric grand Piano","003 Honky Tonk Piano","004 Electric Piano 1","005 Electric Piano 2","006 Harpsicord","007 Clavinet" data "008 Celesta","009 Glockenspiel","010 Music Box","011 Vibraphone","012 Marimba","013 Xylophone","014 Tubular bells","015 Dulcimer" data "016 Drawbar Organ","017 Percussive Organ","018 Rock Organ","019 Church Organ","020 Reed Organ","021 Accordion","022 Harmonica","023 Tango Accordion" data "024 Nylon Acoustic Guitar","025 Steel Acoustic Guitar","026 Jazz Electric Guitar","027 Clean Electric Guitar","028 Muted Electric Guitar","029 Overdrive Guitar","030 Distorted Guitar","031 Guitar Harmonics" data "032 Acoustic Bass","033 Electric Fingered Bass","034 Electric Picked Bass","035 Fretless Bass","036 Slap Bass 1","037 Slap Bass 2","038 Syn Bass 2","039 Syn Bass 1" data "040 Violin","041 Viola","042 Cello","043 Contrabass","044 Tremolo Strings","045 Pizzicato Strings","046 Orchestral Harp","047 Timpani" data "048 String Ensemble 1","049 String Ensemble 2","050 Syn Strings 1","051 Syn Strings 2","052 Choir Aahs","053 Voice Oohs","054 Syn Choir","055 Orchestral Hit" data "056 Trumpet","057 Trombone","058 Tuba","059 Muted Trumpet","060 French Horn","061 Brass Section","062 Syn Brass 1","063 Syn Brass 2" data "064 Soprano Sax","065 Alto Sax","066 Tenor Sax","067 Baritone Sax","068 Oboe","069 English Horn","070 Bassoon","071 Clarinet" data "072 Piccolo","073 Flute","074 Recorder","075 Pan Flute","076 Bottle Blow","077 Shakuhachi","078 Whistle","079 Ocarina" data "080 Syn Square Wave","081 Syn Sawtooth Wave","082 Syn Calliope","083 Syn Chiff","084 Syn Charang","085 Syn Voice","086 Syn Fifths Sawtooth Wave","087 Syn Brass & Lead" data "088 New Age Syn Pad","089 Warm Syn Pad","090 Polysynth Syn Pad","091 Choir Syn Pad","092 Bowed Syn Pad","093 Metal Syn Pad","094 Halo Syn Pad","095 Sweep Syn Pad" data "096 SFX Rain","097 SFX Soundtrack","098 SFX Crystal","099 SFX Atmosphere","100 SFX Brightness","101 SFX Goblins","102 SFX Echoes","103 SFX Sci-Fi" data "104 Sitar","105 Banjo","106 Shamisen","107 Koto","108 Kalimba","109 Bag Pipe","110 Fiddle","111 Shanai" data "112 Tinkle Bell","113 Agogo","114 Steel Drums","115 Woodblock","116 Taiko Drum","117 Melodic Tom","118 Syn Drum","119 Reverse Cymbal" data "120 Guitar Fret Noise","121 Breath Noise","122 Seashore","123 Bird Tweet","124 Telephone Ring","125 Helicopter","126 Applause","127 Gun Shot" ' Datas des durées data "0 ronde","1 ronde pointée","2 blanche","3 blanche pointée","4 noire","5 noire pointée","6 croche","7 croche pointée","8 double croche","9 double croche pointée","10 triple croche","11 triple croche pointée" ' Datas des notes data "C","C#/Db","D","D#/Eb","E","F","F#/Gb","G","G#/Ab","A","A#/Bb","B" ' Datas des arpèges à 3 notes data "Maj",4,7,99,"Sus2",2,7,99,"Sus4",5,7,99,"Maj5b",4,6,99,"Min",3,7,99,"Min5b",3,6,99,"Aug",4,8,99,"AugSus4",5,8,99 ' Datas des arpèges à 4 notes data "dim",3,6,9,"6ème",4,7,9,"6Sus4",5,7,9,"Min6",3,7,9,"7ème",4,7,10,"7Sus4",5,7,10,"7#5",4,8,10,"7b5",4,6,10 data "Maj7",4,7,11,"Maj7b5",4,6,11,"Maj7#5",4,8,11,"Min7",3,7,10,"Min7b5",3,6,10,"Min-Maj7",3,7,11
fin: midi_off terminate Mais j'ai laissé tomber suite à certains problèmes qui me sont arrivés... J'espère que tu pourras en tirer quelque chose... 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 Dim 19 Aoû 2012 - 16:23 | |
| Voilà, je programme édite bien maintenant les # et b, ainsi que les notes pointées.
Maintenant, je fais les notifications écrites, puisque j'ai résolu le problème de PRINT dans la portée, pour le b.
@Bignono: Merci. Je vais regarder cela en détail.
Dernière édition par Klaus le Dim 19 Aoû 2012 - 18:04, édité 2 fois | |
| | | 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 Dim 19 Aoû 2012 - 17:11 | |
| C'est à peu près complet, maintenant. Les notifications des instruments et des changements de volumes sont portées dans la partition, sans déranger l'image existante.
Ce qu'on peut encore y ajouter, ce sont éventuellement: - la clé de sol - une indication sur le rythme (4/4, 3/4, ...) et les séparations par mesures
Ce que je vais faire avec certitude: - sauvegarde et restauration de la mélodie composée - copie de l'image de la portée dans le presse-papier
J'ai aussi ajouté un champ affichant la valeur du volume.
EDIT
La copie de la partition dans le presse-papier est faite.
Cela peut maintenant être utilisée avec ma chaîne de traitement d'images, comme "vignette" à incruster sur une image de fond, la coloration de fond de la partition devenant alors la couleur transparente. | |
| | | 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 Dim 19 Aoû 2012 - 21:24 | |
| Nouvelle version:
J'ai ajouté un clavier de piano ! On peut l'appeler par un bouton "Montrer piano". Le piano s'affiche à la place de la partition, et il peut être caché par le même bouton qui a changé de libellé vers "Cacher piano".
Les octaves sont repérées. On peut cliquer sur les touches. Automatiquement, la section de conficuration (choix de l'octave, de la note et du modificateur) se met à jour, et la note frappée est encodée dans la ligne de saisie. Il faut bien sûr avoir sélectionné la bonne durée, auparavant. Il est ainsi aisé de rentrer une mélodie, pour ceux qui connaissent le piano.
Un dernier détail: on peut cliquer sur une touche noire de deux façons. Soit on clique sur la partie de la touche noire qui est sur la droite d'une touche blanche, et le programme va générer la note qui correspond à cette touche blanche, en ajoutant un #. Soit un clique sur la partie de la touche noire qui est sur la gauche d'une touche blanche, et le programme va générer la note qui correspond à cette touche blanche, en ajoutant un b | |
| | | 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 Dim 19 Aoû 2012 - 23:08 | |
| Il y a un problème quand on ajoute les notes par le piano et elle n'apparaissent pas sur la partition. Si tu ajoutes d'abord des notes puis que tu en rajoute au piano, ça plante car un compteur ne doit pas être incrémenté par cette méthode, je pense | |
| | | 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 Dim 19 Aoû 2012 - 23:27 | |
| Alors là, tu m'étonnes. Le piano ne fait rien d'autre que d'appeler la MEME routine que le bouton Insérer ! Le traitement est non seulement le même, mais effectué par la même routine !
Fais ceci: - ajoute 3 notes par la touche Insérer - montre le piano - ajoute 3 notes par le piano ==> tu les verras apparaître dans la ligne de saisie - cache le piano - remets 3 notes par le bouton Insérer - clique sur Ajouter ==> la ligne avec les 9 notes ira dans le mémo, et la ligne se vide - ajoute d'autres notes, par le bouton Insérer ou le piano, peu importe - clique sur Ajouter ==> une seconde ligne est ajoutée dans le mémo, et la ligne de saisie est vidée. - clique sur Jouer ==> la mélodie est jouée, et le bouton Partition apparaît - clique sur Partition ==> tu verras toutes les notes, sans séparation, comme si elles étaient sur la même ligne dans le mémo.
Moi, je ,'arrive pas à produire le plantage dont tu parles, même en changeant sauvagement entre bouton Insérer et piano...
EDIT
A tout hasard, j'ai remis mon source tel quel, des fois qu'il y aurait eu une altération... | |
| | | 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 Lun 20 Aoû 2012 - 1:53 | |
| Hum, je pense que le problème vient de la taille de mon écran alors. Je suis le seul pour lequel les notes ne s'affichent pas ? Le bug ne vient pas d'un compteur et je pense que tu vas pouvoir le reproduire. En fait il se produit si tu clique sur la première touche du piano et que tu ajoutes. Quand tu joues tu as un out of range
Là, sur la dernière version, j'ai bien la porté, mais les notes ne s'affichent pas.
| |
| | | 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 Lun 20 Aoû 2012 - 2:27 | |
| - Klaus a écrit:
La clé de sol - j'y pense. Mais c'est compliqué à dessiner avec les fonctions 2D_xxx car on n'a pas de fonctions pour dessiner un arc ou une spirale. Voici un code pour dessiner une spirale. Je ne sais pas si ça peut t’être utile. - Code:
-
' SPIRALE.BAS dim theta ,pi, p, x, y, xp,yp ,xcentre,ycentre pi = 4*atn(1) : p = pi/180 xcentre = 320 : ycentre = 240 : ' Coordonnées du centre de l'écran for theta = 0 to 10*2*pi step p :' Nombre de tours, ici 10 x = theta*cos(theta) : y = theta*sin(theta) : ' Equation paramétrique d'une spirale ' Son équation polaire étant RHO = THETA xp = x+xcentre : yp = y + ycentre 2d_point xp,yp next theta
| |
| | | 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 Lun 20 Aoû 2012 - 9:26 | |
| Merci, papydall ! Je prends et je vais voir ce que je peux faire avec ç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 Lun 20 Aoû 2012 - 10:22 | |
| Nouvelle version: à côté du bouton Copier, j'ai ajouté un bouton Panoramic. Ce bouton copie le code Panoramic dans el presse-papier. Il suffit de coller ce code dans un programme Panoramic et il va jouer le morceau qui est présenté dans la partition. | |
| | | 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 Lun 20 Aoû 2012 - 14:11 | |
| Nouvelle version:
- correction d'un bug mineur - Le programme dessine maintenant la clé de sol au début de la portée !
Cela a été possible grâce à la contribution de Papydall que je remercie sincèrement.
PS. Le dessin de la clé de sol est fait "à la sauvage", en mettant bout à bout une spirale, des lignes droites, des arcs de cercle et un cercle plein. Il y a certainement plus élégant à faire - je suis ouvert à toute suggestioin. | |
| | | 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 Lun 20 Aoû 2012 - 19:56 | |
| Salut Klaus Dans le sous-programme ‘dessiner_cledesol’ , lignes 747,756 et 765, le ‘rem Nombre de tours, ici 10’ n’a plus sa raison d’être. Cette remarque a été faite dans le code exemple que j’ai donné qui contenait 10*2*pi. J’avais écrit l’expression sous cette forme pour faire ressortir le nombre de tours. En effet un tour complet vaut 2*pi, c’est pourquoi j’avais écris 10*2*pi. Donc tu peux purement et simplement supprimer cette remarque dans les 3 lignes indiquées ci-haut. A part ça, bravo pour la musique | |
| | | 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 Lun 20 Aoû 2012 - 21:06 | |
| Klaus tu n'a pas un out of range quand tu joues au piano les notes tout à gauche ? et chez moi, tout fonctionne sauf les notes qui ne s'affiche pas (par contre portée et clé de sol ok) | |
| | | 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 Lun 20 Aoû 2012 - 23:12 | |
| Problème corrigé. Il y avait un double bug: - les notes en-dehors des capacités physiques de la commande MIDI n'étaient pas filtrées - au piano, les notes tapées dans l'octave d n'étaient pas reconnues correctement
Tout marche bien maintenant. | |
| | | 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:13 | |
| J'ai compris pourquoi les notes ne s'affichaient pas chez moi, c'est tout con ... tu dessine la partition pour les notes d'un certain octave et je jouais beaucoup trop bas dans les octaves. Du coup, je ne pouvais pas voir les notes qui étaient trop en dessous de la portée... C'est tout con mais je n'avais pas compris ça ... gloups ... | |
| | | 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:27 | |
| Oui, j'affiche les notes entre octave a note sol jusqu'à octave 2 note ré. En-dehors de ces fourchettes, il y aurait trop de lignes auxiliaires en-dessous ou au-dessus, et ça devient illisible si l'on ne change pas de clé. Mais techniquement, je pourrais facilement étendre la fourchette si vraiment cela a un sens. | |
| | | 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
| |
| |
| |