FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» Logiciel de planétarium.
Un exemple de génération de mélodie avec les fonctions MIDI Emptypar Pedro Sam 23 Nov 2024 - 15:50

» Un autre pense-bête...
Un exemple de génération de mélodie avec les fonctions MIDI Emptypar Froggy One Jeu 21 Nov 2024 - 15:54

» Récupération du contenu d'une page html.
Un exemple de génération de mélodie avec les fonctions MIDI Emptypar Pedro Sam 16 Nov 2024 - 14:04

» Décompilation
Un exemple de génération de mélodie avec les fonctions MIDI Emptypar JL35 Mar 12 Nov 2024 - 19:57

» Un album photos comme du temps des grands-mères
Un exemple de génération de mélodie avec les fonctions MIDI Emptypar jjn4 Mar 12 Nov 2024 - 17:23

» traitement d'une feuille excel
Un exemple de génération de mélodie avec les fonctions MIDI Emptypar jjn4 Jeu 7 Nov 2024 - 3:52

» Aide-mémoire mensuel
Un exemple de génération de mélodie avec les fonctions MIDI Emptypar jjn4 Lun 4 Nov 2024 - 18:56

» Des incomprèhension avec Timer
Un exemple de génération de mélodie avec les fonctions MIDI Emptypar Klaus Mer 30 Oct 2024 - 18:26

» KGF_dll - nouvelles versions
Un exemple de génération de mélodie avec les fonctions MIDI Emptypar Klaus Mar 29 Oct 2024 - 17:58

» instructions panoramic
Un exemple de génération de mélodie avec les fonctions MIDI Emptypar maelilou Lun 28 Oct 2024 - 19:51

» Figures fractales
Un exemple de génération de mélodie avec les fonctions MIDI Emptypar Marc Ven 25 Oct 2024 - 12:18

» Panoramic et Scanette
Un exemple de génération de mélodie avec les fonctions MIDI Emptypar Yannick Mer 25 Sep 2024 - 22:16

» Editeur d étiquette avec QR évolutif
Un exemple de génération de mélodie avec les fonctions MIDI Emptypar JL35 Lun 23 Sep 2024 - 22:40

» BUG QR Code DelphiZXingQRCode
Un exemple de génération de mélodie avec les fonctions MIDI Emptypar Yannick Dim 22 Sep 2024 - 11:40

» fichier.exe
Un exemple de génération de mélodie avec les fonctions MIDI Emptypar leclode Ven 20 Sep 2024 - 19:02

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Novembre 2024
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
CalendrierCalendrier
-20%
Le deal à ne pas rater :
Drone Dji DJI Mini 4K (EU)
239 € 299 €
Voir le deal

 

 Un exemple de génération de mélodie avec les fonctions MIDI

Aller en bas 
+3
jjn4
Jicehel
Klaus
7 participants
Aller à la page : 1, 2  Suivant
AuteurMessage
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: 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 EmptySam 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
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: 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 EmptySam 18 Aoû 2012 - 17:45

Très propre comme d'habitude Klaus Wink 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 .... Wink
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: 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 EmptySam 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.

Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: 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 EmptySam 18 Aoû 2012 - 18:10

J'ai supprime un message de trace que j'avais laissé par erreur !
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: 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 EmptyDim 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:
Un exemple de génération de mélodie avec les fonctions MIDI Aa111

Tout le graphisme est entièrement généré par le programme. Il n'y a rien d'externe.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: 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 EmptyDim 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.
Revenir en haut Aller en bas
jjn4

jjn4


Nombre de messages : 2747
Date d'inscription : 13/09/2009

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: +++   Un exemple de génération de mélodie avec les fonctions MIDI EmptyDim 19 Aoû 2012 - 15:27

Superbe !!!
cheers cheers
Revenir en haut Aller en bas
http://jjn4.e-monsite.com
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: 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 EmptyDim 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.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Yannick




Nombre de messages : 8635
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: re   Un exemple de génération de mélodie avec les fonctions MIDI EmptyDim 19 Aoû 2012 - 15:40

OUAHOU !!!

Je vais bientôt me mettre à la musique.... Laughing Laughing Laughing
Moi qui n'est pas d'oreille.... Laughing Laughing Laughing

Bravo Klaus !!!
Revenir en haut Aller en bas
bignono

bignono


Nombre de messages : 1127
Age : 67
Localisation : Val de Marne
Date d'inscription : 13/11/2011

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: 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 EmptyDim 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=midi
J'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+
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: 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 EmptyDim 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
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: 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 EmptyDim 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.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: 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 EmptyDim 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
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: 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 EmptyDim 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
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: 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 EmptyDim 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...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: 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 EmptyLun 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.
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: 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 EmptyLun 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

Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: 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 EmptyLun 20 Aoû 2012 - 9:26

Merci, papydall ! Je prends et je vais voir ce que je peux faire avec ça.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: 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 EmptyLun 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.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: 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 EmptyLun 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.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: 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 EmptyLun 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

lol! lol! lol!
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: 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 EmptyLun 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)
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: 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 EmptyLun 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.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: 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 EmptyMar 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 ...
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: 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 EmptyMar 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.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Contenu sponsorisé





Un exemple de génération de mélodie avec les fonctions MIDI Empty
MessageSujet: 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 Empty

Revenir en haut Aller en bas
 
Un exemple de génération de mélodie avec les fonctions MIDI
Revenir en haut 
Page 1 sur 2Aller à la page : 1, 2  Suivant
 Sujets similaires
-
» Bug avec génération d'application
» Aide à la génération de code avec fonctions KGF.dll
» Un arpégiateur midi avec un petit séquenceur
» Problème avec le compilateur: fonctions midi.
» Un exemple de gestion d'un sprite vaisseau avec panoramic

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: