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
» Gestion d'un système client-serveur.
Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 Emptypar Klaus Ven 17 Mai 2024 - 14:02

» item_index(résolu)
Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 Emptypar jjn4 Mar 14 Mai 2024 - 19:38

» Bataille terrestre
Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 Emptypar jjn4 Lun 13 Mai 2024 - 15:01

» SineCube
Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 Emptypar Marc Sam 11 Mai 2024 - 12:38

» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 Emptypar Marc Sam 11 Mai 2024 - 12:22

» Philharmusique
Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 Emptypar jjn4 Ven 10 Mai 2024 - 13:58

» PANORAMIC V 1
Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 Emptypar papydall Jeu 9 Mai 2024 - 3:22

» select intégrés [résolu]
Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 Emptypar jjn4 Mer 8 Mai 2024 - 17:00

» number_mouse_up
Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 Emptypar jjn4 Mer 8 Mai 2024 - 11:59

» Aide de PANORAMIC
Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 Emptypar jjn4 Mer 8 Mai 2024 - 11:16

» trop de fichiers en cours
Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 Emptypar lepetitmarocain Mer 8 Mai 2024 - 10:43

» Je teste PANORAMIC V 1 beta 1
Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 Emptypar papydall Mer 8 Mai 2024 - 4:17

» bouton dans autre form que 0(résolu)
Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 Emptypar leclode Lun 6 Mai 2024 - 13:59

» KGF_dll - nouvelles versions
Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 Emptypar Klaus Lun 6 Mai 2024 - 11:41

» @Jack
Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 Emptypar Jack Mar 30 Avr 2024 - 20:40

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Mai 2024
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
2728293031  
CalendrierCalendrier
Le Deal du moment : -14%
Apple MacBook Air (2020) 13,3″ Puce Apple M1 ...
Voir le deal
799 €

 

 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 : Précédent  1, 2
AuteurMessage
Jicehel

Jicehel


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

Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 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 - Page 2 EmptyMar 21 Aoû 2012 - 0:37

Non, non Klaus ne t’embête pas, j'aurais dû y penser. C'est logique, mais je n'avais pas fait le lien ... Pas fute-fute sur ce coup là ...
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12301
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 - Page 2 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 - Page 2 EmptyMar 21 Aoû 2012 - 0:47

As-tu vu la possibilité d'exporter, par le presse-papier, le code Panoramic pour jouer la mélodie qui vient d'être jouée par la touche "Jouer" ? Car même si les notes ne s'affichent pas dans la portée car en-dehors de l'intervalle "affichable", le système midi arrive néanmoins à les jouer, et j'exporte le bon code. On peut alors se créer de petits programmes indépendants jouant chacun un morceau, et on les lance para EXECUTE ce qui évite l'attente sur les commandes MIDI_PLAY dans un programme de jeu, par exemple.

Ou même mieux: via le mécanisme de messages montré par Cosmos70, on transmet un identifiant du message à un programme contenant toutes les mélodies différentes à jour, sous forme de sous-programmes, et sur réception du message, le programme joue la mélodie demandée. Un vrai serveur musical, en somme ! Et plus de ralentissement du jeu !
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Jicehel

Jicehel


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

Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 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 - Page 2 EmptyMar 21 Aoû 2012 - 1:10

Oui, c'est vraiment une bonne idée, clairement applicable pour la musique de fond.
Bon aller, a demain tout le monde
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12301
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 - Page 2 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 - Page 2 EmptyMar 21 Aoû 2012 - 1:11

Nouvelle version:

Dans la zone de configuration, il y a maintenant une case à cocher "Ecoute immédiate". Si cette case est cochée, toute note frappée au piano ou insérée par la touche insérer est jouée immédiatement, avec sa durée, son modificateur éventuel et son instrument. Si la note ne convient pas, il suffit de l'enlever de l'EDIT qui est la ligne juste en-dessous de la zone de configuration.

Toujours plus de convivialité...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Yannick




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

Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 Empty
MessageSujet: re   Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 EmptyMar 21 Aoû 2012 - 1:50

Moi qui ne comprends rien à rien à la musique, tu m'en bouches un coin....

cheers cheers cheers
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7009
Age : 73
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 - Page 2 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 - Page 2 EmptyMar 21 Aoû 2012 - 7:42

Salut Klaus

J’ai relevé un petit bug :
Je coche ‘Ecoute immédiate’. je clique sur ‘Montrer piano’
Le piano s’affiche, tout est bien. Je clique sur le clavier du piano : la 1ère et/ou la 2ème fois : OK, j’entends la note jouée.
Au click suivant un message d’erreur ‘(132) MIDI output is already ON. Line 696’.

REMARQUE :
En cliquant sur ‘jouer’, juste après le RUN, et avant toute autre chose, le message ‘il n’y a rien à jouer’ s’affiche et c’est normal.
Ma proposition est de rendre ce bouton INACTIVE jusqu’à ce qu’il y ait effectivement quelque chose à jouer.

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

Klaus


Nombre de messages : 12301
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 - Page 2 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 - Page 2 EmptyMar 21 Aoû 2012 - 9:17

Merci pour tes tests, Papydall ! Les deux problèmes sont corrigés.

Il est clair qu'en écoute immédiate, ce sera un peu plus long pour chaque frappe, car il faut attende que MIDI_PLAY finisse de jouer sa note. Et on ne peut pas cliquer une autre note avant, sous peine de perturner le système. J'en ai tenu compte et j'éi sécurisé le piano ET le bouton Insérer !

Il y a un petit plus au niveau du piano...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
papydall

papydall


Nombre de messages : 7009
Age : 73
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 - Page 2 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 - Page 2 EmptyMar 21 Aoû 2012 - 9:53

C’est bien Klaus, mais….
Je clique sur ‘demo’, puis ‘ajouter’, le bouton ‘jouer’ s’affiche’. Je clique dessus : ok on joue de la musique.
Mais, comme je me mets à la place de celui qui cherche coûte que coûte les pépins, je clique encore et encore sur ‘jouer’.
La musique reprend au début, et au bout de quelques clicks, bonjour l’erreur : différents messages d’erreur s’affichent genre ‘ Access violation…’ ou ‘No Corresponding END_WHILE fond.Line 499’ etc.

Je propose donc, au lieu de laisser le bouton ‘JOUER’ actif, de le changer en ‘ARRETER’ et un click sur ‘ARRETER’ met fin à la musique ou plus simplement de rendre le bouton ‘JOUER’ inactif tant que la musique joue.

A toi de voir.

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

Klaus


Nombre de messages : 12301
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 - Page 2 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 - Page 2 EmptyMar 21 Aoû 2012 - 10:06

C'est fait. Le bouton Jouer est inactif pendant l'exécution. C'est plus logique.

J'ai ajouté une progress_bar...

EDIT

Correction d'un bug provoquant le blocage du piano si l'on cliquait dans une partie inactive (repère des octaves).
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
papydall

papydall


Nombre de messages : 7009
Age : 73
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 - Page 2 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 - Page 2 EmptyMar 21 Aoû 2012 - 11:53

Salut Klaus

J’ai apporté quelques modifications sur ton programme à titre tout à fait personnel.
J’ai ajouté les lignes suivantes (marquées par ‘ papydal) :
Lignes : 82 , 363, 364, 711, 736.
La raison de cette modif est :
Lorsqu’on joue de la musique (par exemple demo, ajouter, jouer) et qu’on désire mettre fin à cette musique, on est obligé d’attendre la fin.
J’ai donc ajouté un bouton ‘Arrêter’ qui permet justement de mettre fin à la musique.

Si cette idée te convient, revoie donc ton programme et apporte les modifications comme tu les souhaites.

Code:


' musique.bas
'
' On saisit une ligne de notes selon le format suivant:
'  nxx%y&  avec: n  = octave choisie  {d,c,b,a,0,1,2,3,4}
'                xx = nom de la note: {innn,vnnn,p,do,re,mi,fa,sol,la,si}
'                        i = instrument avec nnn=numéro d'instrument
'                        v = colume
'                        p = pause
'                #  = modificateur {[],#,b}
'                y  = durée inverse {[3],1,2,3,4,5,6} correspondant à {1,1/2,1/4,1/8,1/6,1/32}
'                y  = "note pointée" {[],.}
'                      volume: nnn=1...127  défaut: 100

' Les notes sont séparées par des espaces.

' 60=do  62=ré  64=mi  65=fa  67=sol  69=la  71=si  72=do
' en octave -4:
' 12=do  14=re  16=mi  17=fa  19=sol  21=la  23=si  24=do
' en octave -5:  (octave fictive, servant de base pour les calculs)
'  0=do  2=re  4=mi  5=fa  7=sol  9=la  11=si  12=do
' mini: 21=la(-4)  max: 108=do(+4)  C'est l'étendu d'un clavier de piano
' delta octave: 12

label labels : gosub labels
gosub constantes
gosub variables
gosub donnees
gosub form0
gosub menu
gosub GUI
gosub initialisations
end

labels:
  label constantes, variables, donnees, form0, menu, GUI, initialisations
  label ajouter, start, compiler, jouer, sel_instrument, inserer, effacer
  label sel_volume, demo, dessiner_note, dessiner, dessiner_pause, localiser_note
  label dessiner_pause_1, dessiner_pause_2, dessiner_pause_3, dessiner_pause_4
  label dessiner_pause_5, dessiner_pause_6, dessiner_point_1, dessiner_point_2
  label dessiner_note_1, dessiner_note_2, dessiner_note_3, dessiner_note_4
  label dessiner_note_5, dessiner_note_6, dessiner_point, creer_picture
  label dessiner_lignes_audessus, dessiner_lignes_endessous, copier
  label dessiner_modificateur,dessiner_dieze, dessiner_bmol, dessiner_cledesol
  label dessiner_instrument, dessiner_volume, change_volume
  label montrer_piano, cacher_piano, dessiner_piano, clic_piano, panoramic
  label compiler_immediat

  return

constantes:
  dim M1% : M1% = 0 - 1
  dim M2% : M2% = 0 - 2
  dim M3% : M3% = 0 - 3
  dim M4% : M4% = 0 - 4
  dim M5% : M5% = 0 - 5
  dim demo1$ : demo1$ = "i48 asol5 asol5 asol5 0do4 0do4 0ré4 0ré4 0sol3 0mi5 0do5"
  dim demo2$ : demo2$ = "i57 0do5 0mi5 0do5 ala4 0fa3 0ré5 asi5 0do2"
  dim lig_start% : lig_start% = 120
  dim lig_delta% : lig_delta% = 10
  dim table_vertical%(9,6) : ' décalage des notes dans la portée par octave
                            ' (oct,note)  oct=1...9  note=0...6  0=do  6=si
  return

variables:
  dim no%, no1%, no2%, i%, j%, k%, n%, s$, s1$, s2$, w%, x%, y%
  dim no_ligne%, no_partition%, no_instruments%, no_duree%, no_notes%
  dim no_octaves%, no_modif%, no_volume%, no_picture%, no_dessiner%
  dim no_aff_volume%, no_copier%, no_piano%, no_bouton_piano%, no_inserer%
  dim no_panoramic%, no_code_panoramic%, no_ecoute_immediate%, no_jouer%
  dim no_progress%
  dim flag_pointe%, flag_done%, mode_immediat%
  dim note%, octave%, modif%, volume%, note_origine%
  dim index_ligne%, lignes_audessus%, lignes_endessous%
  dim n_notes%      : ' nombre de notes compilées
  dim notes%(1000)  : ' code de la note  (-1=instrument  0=pause)
  dim durees%(1000)  : ' durée de la note ou code instrument
  dim notes_origine%(1000,2) : ' (x,0)=note  (0=do,...,6=si)  (x,1)=octave  (x,2)=modificateur
  dim piano_octaves%(9,1) : ' valeurs x  mini/maxi des octaves pour un clic dans le piano
  dim flag_noire% : ' flag "touche noire frappée" sur le piano
  dim largeur_blanche%  : ' largeur d'une note blanche du piano
  dim touche_blanche%, touche_noire%
  dim no_arreter%  : ' Papydall
  return

donnees:
  '                      instruments:
  data "Piano"
  data "  0 Acoustic grand piano"
  data "  1 Bright acoustic piano"
  data "  2 Electric grand piano"
  data "  3 Honky-tonk piano"
  data "  4 Rhodes piano"
  data "  5 Chorused piano"
  data "  6 Harpsichord"
  data "  7 Clavinet"
  data ""
  data "Chromatic Percussion"
  data "  8 Celesta"
  data "  9 Glockenspiel"
  data " 10 Music box"
  data " 11 Vibraphone"
  data " 12 Marimba"
  data " 13 Xylophone"
  data " 14 Tubular bells"
  data " 15 Dulcimer"
  data ""
  data "Organ"
  data " 16 Hammond organ"
  data " 17 Percussive organ"
  data " 18 Rock organ"
  data " 19 Church organ"
  data " 20 Reed organ"
  data " 21 Accordion"
  data " 22 Harmonica"
  data " 23 Tango accordion"
  data ""
  data "Guitar"
  data " 24 Acoustic guitar (nylon)"
  data " 25 Acoustic guitar (steel"
  data " 26 Electric guitar (jazz)"
  data " 27 Electric guitar (clean)"
  data " 28 Electric guitar (muted)"
  data " 29 Overdriven guitar"
  data " 30 Distortion guitar"
  data " 31 Guitar harmonics"
  data ""
  data "Bass"
  data " 32 Acoustic bass"
  data " 33 Electric bass (finger)"
  data " 34 Electric bass (pick)"
  data " 35 Fretless bass"
  data " 36 Slap bass 1"
  data " 37 Slap bass 2"
  data " 38 Synth bass 1"
  data " 39 Synth bass 2"
  data ""
  data "Strings"
  data " 40 Violin"
  data " 41 Viola"
  data " 42 Cello"
  data " 43 Contrabass"
  data " 44 Tremolo strings"
  data " 45 Pizzicato strings"
  data " 46 Orchestral harp"
  data " 47 Timpani"
  data ""
  data "Ensemble"
  data " 48 String ensemble 1"
  data " 49 String ensemble 2"
  data " 50 Synth. strings 1"
  data " 51 Synth. strings 2"
  data " 52 Choir Aahs"
  data " 53 Voice Oohs"
  data " 54 Synth voice"
  data " 55 Orchestra hit"
  data ""
  data "Brass"
  data " 56 Trumpet"
  data " 57 Trombone"
  data " 58 Tuba  66"
  data " 59 Muted trumpet"
  data " 60 French horn"
  data " 61 Brass section"
  data " 62 Synth. brass 1"
  data " 63 Synth. brass 2"
  data ""
  data "Reed"
  data " 64 Soprano sax"
  data " 65 Alto sax"
  data " Tenor sax"
  data " 67 Baritone sax"
  data " 68 Oboe"
  data " 69 English horn"
  data " 70 Bassoon"
  data " 71 Clarinet"
  data ""
  data "Pipe"
  data " 72 Piccolo"
  data " 73 Flute"
  data " 74 Recorder"
  data " 75 Pan flute"
  data " 76 Bottle blow"
  data " 77 Shakuhachi"
  data " 78 Whistle"
  data " 79 Ocarina"
  data ""
  data "Synth Lead"
  data " 80 Lead 1 (square)"
  data " 81 Lead 2 (sawtooth)"
  data " 82 Lead 3 (calliope lead)"
  data " 83 Lead 4 (chiff lead)"
  data " 84 Lead 5 (charang)"
  data " 85 Lead 6 (voice)"
  data " 86 Lead 7 (fifths)"
  data " 87 Lead 8 (brass + lead)"
  data ""
  data "Synth Pad"
  data " 88 Pad 1 (new age)"
  data " 89 Pad 2 (warm)"
  data " 90 Pad 3 (polysynth)"
  data " 91 Pad 4 (choir)"
  data " 92 Pad 5 (bowed)"
  data " 93 Pad 6 (metallic)"
  data " 94 Pad 7 (halo)"
  data " 95 Pad 8 (sweep)"
  data ""
  data "Miscellaneous"
  data " 96 Synth SFX 1 Ice Rain"
  data " 97 Synth SFX 2 Sound Track"
  data " 98 Synth SFX 3 Crystal"
  data " 99 Synth SFX 4 Atmosphere"
  data "100 Synth SFX 5 Brightness"
  data "101 Synth SFX 6 Goblin"
  data "102 Synth SFX 7 Echo Drops"
  data "103 Synth SFX 8 Star Theme"
  data "104 Sitar"
  data "105 Banjo"
  data "106 Shamisen"
  data "107 Koto"
  data "108 Kalimba"
  data "109 Bagpipe"
  data "110 Fiddle"
  data "111 Shanai"
  data "112 Tinkle Bells"
  data "113 Agogo"
  data "114 Steel Drums"
  data "115 Woodblock"
  data "116 Taiko Drum"
  data "117 Melodic Drum"
  data "118 Synth Drum"
  data "119 Reverse Cymbal"
  data ""
  data "Sound Effects"
  data "120 Guitar fret noise"
  data "121 Breath noise"
  data "122 Seashore"
  data "123 Bird tweet"
  data "124 Telephone ring"
  data "125 Helicopter"
  data "126 Applause"
  data "127 Gunshot"
  data "***"

'  table_vertical%(1000,2) : ' (x,0)=note  (0=do,...,6=si)  (x,1)=octave  (x,2)=modificateur
  data 0,0,0,0,0,0,0 : ' octave 1 (d)
  data 0,0,0,0,0,0,0 : ' octave 2 (c)
  data 0,0,0,0,0,0,0 : ' octave 3 (b)
  data 0,0,0,0,13,12,11 : ' octave 4 (a)
  data 10,9,8,7,6,5,4 : ' octave 5 (0)
  data 3,2,1,0,M1%,M2%,M3% : ' octave 6 (1)
  data M4%,M5%,0,0,0,0,0,0 : ' octave 7 (2)
  data 0,0,0,0,0,0,0 : ' octave 8 (3)
  data 0,0,0,0,0,0,0 : ' octave 9 (4)

  return

form0:
  full_space 0
  caption 0,"Jouer une mélodie
  return

menu:
  return

GUI:
' configurateur
  no% = no% + 1 : container_option no% : no1% = no% : top no%,10 : left no%,10
    caption no%,"Octave" : height no%,50 : width no%,370
    no_octaves% = no%
  no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,10
    caption no%,"d" : width no%,30
  no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,50
    caption no%,"c" : width no%,30
  no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,90
    caption no%,"b" : width no%,30
  no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,130
    caption no%,"a" : width no%,30
  no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,170
    caption no%,"0" : width no%,30
  no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,210
    caption no%,"1" : width no%,30
  no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,250
    caption no%,"2" : width no%,30
  no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,290
    caption no%,"3" : width no%,30
  no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,330
    caption no%,"4" : width no%,30

  no% = no% + 1 : container_option no% : no1% = no% : top no%,10 : left no%,390
    caption no%,"Note" : height no%,50 : width no%,330
    no_notes% = no%
  no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,10
    caption no%,"do" : width no%,30
  no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,50
    caption no%,"ré" : width no%,30
  no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,90
    caption no%,"mi" : width no%,30
  no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,130
    caption no%,"fa" : width no%,30
  no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,170
    caption no%,"sol" : width no%,30
  no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,210
    caption no%,"la" : width no%,30
  no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,250
    caption no%,"si" : width no%,30
  no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,290
    caption no%,"p" : width no%,30

  no% = no% + 1 : container_option no% : no1% = no% : top no%,60 : left no%,390
    caption no%,"Modificateur" : height no%,50 : width no%,130
    no_modif% = no%
  no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,10
    caption no%,"./." : width no%,30
  no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,50
    caption no%,"#" : width no%,30
  no% = no% + 1 : option no% : parent no%,no1% : top no%,20 : left no%,90
    caption no%,"b" : width no%,30

  no% = no% + 1 : container no% : no1% = no% : top no%,10 : left no%,730
    caption no%,"Durée" : height no%,50 : width no%,200
  no% = no% + 1 : combo no% : parent no%,no1% : top no%,20 : left no%,10
    no_duree% = no% : width no%,120
  no% = no% + 1 : check no% : parent no%,no1% : top no%,20 : left no%,140
    caption no%,"pointé" : width no%,50

  no% = no% + 1 : button no% : no_inserer% = no% : top no%,20 : left no%,940
    caption no%,"Insérer" : on_click no%,inserer

  no% = no% + 1 : combo no% : top no%,90 : left no%,10 : width no%,200
    no_instruments% = no%
  no% = no% + 1 : button no% : top no%,90 : left no%,left(no%-1)+width(no%-1)
    caption no%,"Choisir" : on_click no%,sel_instrument

  no% = no% + 1 : alpha no% : top no%,95 : left no%,650
    caption no%,"Volume:"
  no% = no% + 1 : scroll_bar no% : top no%,95 : left no%,700 : width no%,200
    no_volume% = no% : min no%,1 : max no%,127 : position no%,100
    on_change no%,change_volume
  no% = no% + 1 : edit no% : no_aff_volume% = no% : width no%,25 : inactive no%
    top no%,95 : left no%,left(no%-1)+width(no%-1) : text no%,100
  no% = no% + 1 : button no% : top no%,90 : left no%,left(no%-1)+width(no%-1)
    caption no%,"Choisir" : on_click no%,sel_volume

' ligne d'écriture
  no% = no% + 1 : edit no% : top no%,120 : left no%,10 : width no%,width(0)-40
    no_ligne% = no%
  no% = no% + 1 : button no% : top no%,150 : left no%,200
    caption no%,"Ajouter" : on_click no%,ajouter
  no% = no% + 1 : button no% : top no%,150 : left no%,450
    caption no%,"Démo" : on_click no%,demo
  no% = no% + 1 : button no% : top no%,150 : left no%,700
    caption no%,"Effacer" : on_click no%,effacer

' partition
  no% = no% + 1 : progress_bar no% : no_progress% = no%
    top no%,390 : left no%,10 : width no%,width(0)-40
    min no%,0 : max no%,100 : position no%,0
  no% = no% + 1 : memo no% : top no%,180 : left no%,10 : width no%,width(0)-40
    no_partition% = no% : bar_vertical no% : height no%,200
  no% = no% + 1 : button no% : no_jouer% = no% : top no%,410 : left no%,200
    caption no%,"Jouer" : on_click no%,start : hide no%
' Papydall
  no% = no% +1 : button no% : no_arreter% = no% : top no%,410 : left no%,100
    caption no%,"Arreter" : hide no%
' Fin Papydall
  no% = no% + 1 : button no%: no_dessiner% = no% : hide no% : top no%,410 : left no%,450
    caption no%,"Partition" : on_click no%,dessiner
  no% = no% + 1 : button no%: no_copier% = no% : hide no% : top no%,410
    left no%,left(no%-1)+width(no%-1)
    caption no%,"Copier" : on_click no%,copier
  no% = no% + 1 : button no%: no_panoramic% = no% : hide no% : top no%,410
    left no%,left(no%-1)+width(no%-1)
    caption no%,"Panoramic" : on_click no%,panoramic
  no% = no% + 1 : no_picture% = no% : gosub creer_picture : hide no%
  no% = no% + 1 : memo no% : hide no% : no_code_panoramic% = no%

' piano
  no% = no% + 1 : picture no% : hide no% : no_piano% = no%  : on_click no%,clic_piano
    top no%,460 : left no%,10 : width no%,width(0)-40 : height no%,200
    gosub dessiner_piano
  no% = no% + 1 : button no% : no_bouton_piano% = no%
    top no%,50 : left no%,940 : caption no%,"Montrer piano" : on_click no%,montrer_piano
  no% = no% + 1 : check no% : no_ecoute_immediate% = no%  : width no%,120
    top no%,70 : left no%,700 : caption no%,"Ecoute immédiate"
  return

creer_picture:
  picture no_picture% : hide no_picture% : top no_picture%,460 : left no_picture%,10
    width no_picture%,width(0)-40 : height no_picture%,300
  return

montrer_piano:
  show no_piano%
  caption no_bouton_piano%,"Cacher piano"
  on_click no_bouton_piano%,cacher_piano
  return

cacher_piano:
  hide no_piano%
  caption no_bouton_piano%,"Montrer piano"
  on_click no_bouton_piano%,montrer_piano
  return

dessiner_piano:
  2d_target_is no_piano%
  print_target_is no_piano%
  font_bold no_piano%
  largeur_blanche% = (width(no_piano%)-2)/58
  2d_pen_width 2
  2d_rectangle 0,20,width(no_piano%),height(no_piano%)
  2d_pen_width 1
  for i%=1 to 58
    2d_rectangle 1+(i%-1)*largeur_blanche%,20,1+i%*largeur_blanche%,height(no_piano%)
  next i%
  piano_octaves%(1,0) = 1
  piano_octaves%(1,1) = 3*largeur_blanche%-1
  2d_rectangle 1,1,3*largeur_blanche%,19
  print_locate largeur_blanche%*1.4,3
  print "d"
  x% = 1 + 3*largeur_blanche%
  for i%=1 to 8
    piano_octaves%(i%+1,0) = x%
    piano_octaves%(i%+1,1) = x% + 7*largeur_blanche% - 1
    2d_rectangle x%,1,x%+7*largeur_blanche%-1,19
    print_locate x% + largeur_blanche%*3.4,3
    print mid$("cba01234",i%,1)
    x% = x% + 7*largeur_blanche%
  next i%
  2d_fill_color 1,0,0
  x% = 0.6*largeur_blanche%
  2d_rectangle x%,20,x%+largeur_blanche%*0.9,height(no_piano%)*0.6
  x% = x% + largeur_blanche%
  2d_rectangle x%,20,x%+largeur_blanche%*0.9,height(no_piano%)*0.6
  for i%=1 to 8
    x% = x% + largeur_blanche%
    x% = x% + largeur_blanche%
    2d_rectangle x%,20,x%+largeur_blanche%*0.9,height(no_piano%)*0.6
    x% = x% + largeur_blanche%
    2d_rectangle x%,20,x%+largeur_blanche%*0.9,height(no_piano%)*0.6
    x% = x% + largeur_blanche%
    x% = x% + largeur_blanche%
    2d_rectangle x%,20,x%+largeur_blanche%*0.9,height(no_piano%)*0.6
    x% = x% + largeur_blanche%
    2d_rectangle x%,20,x%+largeur_blanche%*0.9,height(no_piano%)*0.6
    x% = x% + largeur_blanche%
    2d_rectangle x%,20,x%+largeur_blanche%*0.9,height(no_piano%)*0.6
  next i%
  return

initialisations:
  read s$
  while s$<>"***"
    item_add no_instruments%,s$
    read s$
  end_while
  text no_instruments%,item_read$(no_instruments%,2)
  for i%=1 to 9
    for j%=0 to 6
      read table_vertical%(i%,j%)
    next j%
  next i%

  item_add no_duree%,"1 (1)    ronde"
  item_add no_duree%,"2 (1/2)  blanche"
  item_add no_duree%,"3 (1/4)  noire"
  item_add no_duree%,"4 (1/8)  croche"
  item_add no_duree%,"5 (1/16) double-croche"
  item_add no_duree%,"6 (1/32) triple croche"
  text no_duree%,item_read$(no_duree%,3)
  mark_on no_notes%+1
  mark_on no_octaves%+5
  mark_on no_modif%+1
  midi_on
  return

ajouter:
  s$ = trim$(text$(no_ligne%))
  if s$<>""
    item_add no_partition%,s$
    text no_ligne%,""
  end_if
  show no_jouer%
  set_focus no_ligne%
  return

effacer:
  clear no_partition%
  set_focus no_ligne%
  2d_target_is 0
  print_target_is 0
  delete no_picture%
  gosub creer_picture
  2d_target_is no_picture%
  print_target_is no_picture%
  font_size no_picture%,12
  font_bold no_picture%
  font_italic no_picture%
  hide no_dessiner%
  hide no_copier%
  hide no_panoramic%
  hide no_jouer%
  return

demo:
  item_add no_partition%,demo1$
  item_add no_partition%,demo2$
  return

start:
  inactive no_jouer%
  gosub compiler
  gosub jouer
  active no_jouer%
  return

change_volume:
  text no_aff_volume%,position(no_volume%)
  return

compiler:
  n_notes% = 0
  if count(no_partition%)=0
    message "Il n'y a rien à jouer !"
    return
  end_if
  for i%=1 to count(no_partition%)
    s$ = trim$(item_read$(no_partition%,i%))+" "
    if len(s$)>0
compiler_immediat:
      j% = instr(s$," ")
      while j%>0
        s1$ = lower$(trim$(left$(s$,j%-1)))
        flag_done% = 0
        ' {innn,p,do,re,mi,fa,sol,la,si}
        if left$(s1$,1)="i"  : ' innn=instrument
          s2$ = mid$(s1$,2,len(s1$))
          if numeric(s2$)=0
            message "instrument invalide dans "+s1$
            return
          end_if
          n% = int(val(s2$))
          if n%<1 or n%>127
            message "instrument invalide dans "+s1$
            return
          end_if
          n_notes% = n_notes% + 1
          notes%(n_notes%) = M1%
          notes_origine%(n_notes%,0) = M1%
          notes_origine%(n_notes%,1) = 0
          notes_origine%(n_notes%,2) = 0
          durees%(n_notes%) = n%
          flag_done% = 1
        end_if
        if left$(s1$,1)="v"  : ' vnnn=volume
          s2$ = mid$(s1$,2,len(s1$))
          if numeric(s2$)=0
            message "volume invalide dans "+s1$
            return
          end_if
          n% = int(val(s2$))
          if n%<1 or n%>127
            message "volume invalide dans "+s1$
            return
          end_if
          n_notes% = n_notes% + 1
          notes%(n_notes%) = M2%
          notes_origine%(n_notes%,0) = M2%
          notes_origine%(n_notes%,1) = 0
          notes_origine%(n_notes%,2) = 0
          durees%(n_notes%) = n%
          flag_done% = 1
        end_if

        if left$(s1$,1)="p"  : ' pn.=pause
          flag_pointe% = 0
          s2$ = s1$
          if right$(s2$,1)="."
            flag_pointe% = 1
            s2$ = left$(s2$,len(s2$)-1)
          end_if
          s2$ = mid$(s2$,2,len(s2$))
          if numeric(s2$)=0
            message "pause invalide dans "+s1$
            return
          end_if
          n% = int(val(s2$))
          if n%<1 or n%>6
            message "pause invalide dans "+s1$
            return
          end_if
          n% = (n%-1)*2 + flag_pointe%
          n_notes% = n_notes% + 1
          notes%(n_notes%) = 0
          notes_origine%(n_notes%,0) = 0 : ' placer les pauses à la place d'un do
          notes_origine%(n_notes%,1) = 6 : '  en octave 1 (indice 6 dans tableau des octaves)
          notes_origine%(n_notes%,2) = 0
          durees%(n_notes%) = n%
          flag_done% = 1
        end_if
        if flag_done%=0
          octave% = 0
          modif% = 0
          note% = M1%
          s2$ = left$(s1$,1)  : ' l'octave
          octave% = instr("dcba01234",s2$)
          if octave%=0
            message "octave invalide dans "+s1$
            return
          end_if
          s2$ = mid$(s1$,2,len(s1$))
          if left$(s2$,2)="do"
            s2$ = mid$(s2$,3,len(s2$))
            note% = 0
            note_origine% = 0
          end_if
          if (left$(s2$,2)="re") or (left$(s2$,2)="ré")
            s2$ = mid$(s2$,3,len(s2$))
            note% = 2
            note_origine% = 1
          end_if
          if left$(s2$,2)="mi"
            s2$ = mid$(s2$,3,len(s2$))
            note% = 4
            note_origine% = 2
          end_if
          if left$(s2$,2)="fa"
            s2$ = mid$(s2$,3,len(s2$))
            note% = 5
            note_origine% = 3
          end_if
          if left$(s2$,3)="sol"
            s2$ = mid$(s2$,4,len(s2$))
            note% = 7
            note_origine% = 4
          end_if
          if left$(s2$,2)="la"
            s2$ = mid$(s2$,3,len(s2$))
            note% = 9
            note_origine% = 5
          end_if
          if left$(s2$,2)="si"
            s2$ = mid$(s2$,3,len(s2$))
            note% = 11
            note_origine% = 6
          end_if
          if note%=M1%
            message "note inconnue dans "+s1$
            return
          end_if
          modif% = 0
          if left$(s2$,1)="#"
            modif% = 1
            s2$ = mid$(s2$,2,len(s2$))
          else
            if left$(s2$,1)="b"
              modif% = M1%
              s2$ = mid$(s2$,2,len(s2$))
            end_if
          end_if
          flag_pointe% = 0
          if right$(s2$,1)="."
            flag_pointe% = 1
            s2$ = left$(s2$,len(s2$)-1)
          end_if
          if numeric(s2$)=0
            message "durée invalide dans "+s1$
            return
          end_if
          n% = int(val(s2$))
          if n%<1 or n%>6
            message "durée invalide dans "+s1$
            return
          end_if
          n% = (n%-1)*2 + flag_pointe%
          note% = note% + octave%*12 + modif%
          if (note%<21) or (note%>108)
            message "note "+s1$+" en-dehors des possibilités"
            return
          end_if
          n_notes% = n_notes% + 1
          notes%(n_notes%) = note%
          notes_origine%(n_notes%,0) = note_origine%
          notes_origine%(n_notes%,1) = octave%
          notes_origine%(n_notes%,2) = modif%
          durees%(n_notes%) = n%
          flag_done% = 1
        end_if
        if flag_done%=0
          message "note inconnue dans "+s1$
          return
        end_if
        s$ = trim$(mid$(s$,j%+1,len(s$)))
        if len(s$)>0 then s$ = s$ + " "
        j% = instr(s$," ")
      end_while
      if mode_immediat%=1 then return
    end_if
  next i%
  show no_dessiner%
  hide no_copier%
  hide no_panoramic%
  return

' 0do4 0re4 0mi4 0do4 i40 0do4 0re4 0mi4 0do4 0mi4 0fa4 0sol4 p4 0mi4 0fa4 0sol4

jouer:
  if n_notes%=0
    message "Il n'y a rien à jouer après analyse !"
    return
  end_if
  show no_arreter% : ' Papydall
  volume% = 100
  for i%=1 to n_notes%
    position no_progress%, int((i%-0.5)*100/n_notes%)
'    message str$(notes%(i%))+"  "+str$(durees%(i%))
    if notes%(i%)=M1%  : ' instrument
      midi_instrument durees%(i%)
    else
      if notes%(i%)=m2%
        volume% = durees%(i%)
        midi_volume volume%
      else
        if notes%(i%)=0  : ' pause
          midi_volume 1
          midi_play 60,durees%(i%)
          midi_volume volume%
        else            : ' vraie note
          midi_volume 100
          midi_play notes%(i%),durees%(i%)
'          gosub dessiner_note
        end_if
      end_if
    end_if
    position no_progress%, int(i%*100/n_notes%)
' Papydall
    if clicked(no_arreter%) = 1 then hide no_arreter%: show no_jouer% : exit_for
' Fin Papydall
  next i%
  position no_progress%,0
  return

dessiner:
  x% = 10
  show no_picture%
  color no_picture%,241,246,136
  2d_target_is no_picture%
  print_target_is no_picture%
  font_size no_picture%,12
  font_bold no_picture%
  font_italic no_picture%
  w% = width(no_picture%)
  gosub dessiner_cledesol
  for i%=1 to n_notes%
    2d_fill_color 0,0,0
    if notes%(i%)>0 then gosub dessiner_note
    if notes%(i%)=0 then gosub dessiner_pause
    if notes%(i%)=M1% then gosub dessiner_instrument
    if notes%(i%)=M2% then gosub dessiner_volume
  next i%
  ' dessiner la portée maintenant seulement !
  for i%=1 to 5
    y% = lig_start% + (i%-1)*lig_delta%
    2d_line 0,y%,w%,y%
  next i%
  show no_copier%
  show no_panoramic%
  return

dessiner_cledesol:
' clé de sol ( base du code fourni par Papydall)
if variable("theta")=0
dim theta ,pi, p, x1, y1, xp,yp ,xcentre,ycentre
pi = 4*atn(1) : p = pi/180
end_if
xcentre = x%+10 : ycentre = lig_start%+3*lig_delta%  : ' Coordonnées du centre de l'écran
for theta = 0 to 1.625*2*pi step p
  x1 = theta*cos(theta) : y1 = theta*sin(theta) : ' Equation paramétrique d'une spirale
  '  Son équation polaire étant RHO = THETA
  xp = x1+xcentre : yp = y1 + ycentre
  2d_point xp,yp
next theta
2d_line xp,yp,xp+15,yp-30
xp = xp + 15 : yp = yp - 30
xcentre = xcentre + 3 : ycentre = ycentre - 40
for theta = 0.8*pi to pi+0.55*2*pi step p
  x1 = 5*cos(theta) : y1 = 5*sin(theta)
  xp = xcentre-x1 : yp = ycentre+y1
  2d_point xp,yp
next theta
2d_line xp,yp,xp+3,yp+58
xp = xp + 3 : yp = yp + 58
xcentre = xp-5 : ycentre = yp
for theta = 0 to 1.5*pi step p
  x1 = (1-theta/2.5/pi)*5*cos(theta) : y1 = (1-theta/2.5/pi)*5*sin(theta)
  xp = xcentre+x1 : yp = ycentre+y1
  2d_point xp,yp
next theta
2d_fill_color 0,0,0
2d_circle xcentre,ycentre,3
x% = x% + 30
  return

copier:
  clipboard_copy no_picture%
  message "La portée a été copiée dans le presse-papier"
  return

panoramic:
  clear no_code_panoramic%
  item_add no_code_panoramic%,"midi_on"
  n% = 100
  for i%=1 to n_notes%
  if notes%(i%)=m1% then item_add no_code_panoramic%,"midi_instrument "+str$(durees%(i%))
  if notes%(i%)=m2%
    n% = durees%(i%)
    item_add no_code_panoramic%,"midi_volume "+str$(n%)
  end_if
  if notes%(i%)=0
    item_add no_code_panoramic%,"midi_volume 1"
    item_add no_code_panoramic%,"midi_play 60,"+str$(durees%(i%))
    item_add no_code_panoramic%,"midi_volume "+str$(n%)
  end_if
  if notes%(i%)>0 then item_add no_code_panoramic%,"midi_play "+str$(durees%(i%))+","+str$(durees%(i%))
  next i%
  item_add no_code_panoramic%,"midi_off"
'  clipboard_copy no_code_panoramic%
' ?????????? début du code pour remplacer clipboard_copy
  s$ = ""
  for i%=1 to count(no_code_panoramic%)
    s$ = s$ + item_read$(no_code_panoramic%,i%)+chr$(13)+chr$(10)
  next i%
  clipboard_string_copy s$
' ?????????? fin du code pour remplacer clipboard_copy
  message "Le code Panoramic a été copié dans le presse-papier"
  return

dessiner_instrument:
  2d_fill_color 241,246,136
  2d_line x%,lig_start%+7*lig_delta%,x%,lig_start%+9*lig_delta%
  print_locate x%,lig_start% + 9*lig_delta%
  font_size no_picture%,8
  font_italic_off no_picture%
  print "I"+str$(durees%(i%))
  font_italic no_picture%
  font_size no_picture%,12
  2d_fill_color 0,0,0
  return

dessiner_volume:
  2d_fill_color 241,246,136
  2d_line x%,lig_start%+7*lig_delta%,x%,lig_start%+8*lig_delta%
  print_locate x%,lig_start% + 8*lig_delta%
  font_size no_picture%,8
  font_italic_off no_picture%
  print "V"+str$(durees%(i%))
  font_italic no_picture%
  font_size no_picture%,12
  2d_fill_color 0,0,0
  return

dessiner_note:
  if (notes%(i%)>54) and (notes%(i%)<87)  : ' note dans la fourchette dessinable
    gosub localiser_note
    gosub dessiner_modificateur
    select durees%(i%)
    case 0
      gosub dessiner_note_1
    case 1
      gosub dessiner_note_1
      gosub dessiner_point
    case 2
      gosub dessiner_note_2
    case 3
      gosub dessiner_note_2
      gosub dessiner_point
    case 4
      gosub dessiner_note_3
    case 5
      gosub dessiner_note_3
      gosub dessiner_point
    case 6
      gosub dessiner_note_4
    case 7
      gosub dessiner_note_4
      gosub dessiner_point
    case 8
      gosub dessiner_note_5
    case 9
      gosub dessiner_note_5
      gosub dessiner_point
    case 10
      gosub dessiner_note_6
    case 11
      gosub dessiner_note_6
      gosub dessiner_point
    end_select
    if lignes_audessus%>0 then gosub dessiner_lignes_audessus
    if lignes_endessous%>0 then gosub dessiner_lignes_endessous
    x% = x% + lig_delta% + lig_delta%
  end_if
  return

dessiner_modificateur:
  if notes_origine%(i%,2)>0 then gosub dessiner_dieze
  if notes_origine%(i%,2)<0 then gosub dessiner_bmol
  return

dessiner_dieze:
  2d_pen_width 2
  2d_line x%+4,y%-lig_delta%*0.8,x%,y%+lig_delta%*0.8
  2d_line x%+9,y%-lig_delta%*0.8,x%+5,y%+lig_delta%*0.8
  2d_line x%,y%-2,x%+lig_delta%-1,y%-2
  2d_line x%,y%+2,x%+lig_delta%-1,y%+2
  2d_pen_width 1
  x% = x% + lig_delta%
  return

dessiner_bmol:
  2d_fill_color 241,246,136
  print_locate x%-3,y%-10
  print "b"
  2d_fill_color 0,0,0
  x% = x% + lig_delta%+4
  return

dessiner_lignes_audessus:
  for j%=1 to lignes_audessus%
    2d_line x%-2,lig_start%-j%*lig_delta%,x%+lig_delta%+2,lig_start%-j%*lig_delta%
  next j%
  return

dessiner_lignes_endessous:
  for j%=1 to lignes_endessous%
    2d_line x%-2,lig_start%+(j%+4)*lig_delta%,x%+lig_delta%+2,lig_start%+(j%+4)*lig_delta%
  next j%
  return

dessiner_pause:
  gosub localiser_note

  select durees%(i%)
    case 0
      gosub dessiner_pause_1
    case 1
      gosub dessiner_pause_1
      gosub dessiner_point_1
    case 2
      gosub dessiner_pause_2
    case 3
      gosub dessiner_pause_2
      gosub dessiner_point_1
    case 4
      gosub dessiner_pause_3
    case 5
      gosub dessiner_pause_3
      gosub dessiner_point_1
    case 6
      gosub dessiner_pause_4
    case 7
      gosub dessiner_pause_4
      gosub dessiner_point_1
    case 8
      gosub dessiner_pause_5
    case 9
      gosub dessiner_pause_5
      gosub dessiner_point_1
    case 10
      gosub dessiner_pause_6
    case 11
      gosub dessiner_pause_6
      gosub dessiner_point_1
  end_select
  x% = x% + lig_delta% + lig_delta%
  return

' dessiner note 4 temps (1 entier)
dessiner_note_1:
  2d_fill_color 255,255,255
  2d_circle x%+lig_delta%/2+1,y%,lig_delta%/2
  2d_fill_color 0,0,0
  return

' dessiner note 2 temps (1/2)
dessiner_note_2:
  2d_fill_color 255,255,255
  2d_circle x%+lig_delta%/2+1,y%,lig_delta%/2
  2d_fill_color 0,0,0
  if notes%(i%)<72
    2d_line x%+lig_delta%-1,y%,x%+lig_delta%-1,y%-3*lig_delta%
  else
    2d_line x%+1,y%,x%+1,y%+3*lig_delta%
  end_if
  return

' dessiner note 1 temps (1/4)
dessiner_note_3:
  2d_circle x%+lig_delta%/2+1,y%,lig_delta%/2
  if notes%(i%)<72
    2d_line x%+lig_delta%-1,y%,x%+lig_delta%-1,y%-3*lig_delta%
  else
    2d_line x%+1,y%,x%+1,y%+3*lig_delta%
  end_if
  return

' dessiner note 1/2 temps (1/8)
dessiner_note_4:
  2d_circle x%+lig_delta%/2+1,y%,lig_delta%/2
  if notes%(i%)<72
    2d_line x%+lig_delta%-1,y%,x%+lig_delta%-1,y%-3*lig_delta%
    2d_pen_width 2
    2d_line x%+lig_delta%-1,y%-3*lig_delta%,x%+2,y%-5*lig_delta%/2
    2d_pen_width 1
  else
    2d_line x%+1,y%,x%+1,y%+3*lig_delta%
    2d_pen_width 2
    2d_line x%+1,y%+3*lig_delta%,x%+lig_delta%-2,y%+5*lig_delta%/2
    2d_pen_width 1
  end_if
  return

' dessiner note 1/4 temps (1/16)
dessiner_note_5:
  2d_circle x%+lig_delta%/2+1,y%,lig_delta%/2
  if notes%(i%)<72
    2d_line x%+lig_delta%-1,y%,x%+lig_delta%-1,y%-3*lig_delta%
    2d_pen_width 2
    2d_line x%+lig_delta%-1,y%-3*lig_delta%,x%+2,y%-5*lig_delta%/2
    2d_line x%+lig_delta%-1,y%-5*lig_delta%/2,x%+2,y%-2*lig_delta%
    2d_pen_width 1
  else
    2d_line x%+1,y%,x%+1,y%+3*lig_delta%
    2d_pen_width 2
    2d_line x%+1,y%+3*lig_delta%,x%+lig_delta%-2,y%+5*lig_delta%/2
    2d_line x%+1,y%+5*lig_delta%/2,x%+lig_delta%-2,y%+2*lig_delta%
    2d_pen_width 1
  end_if
  return

' dessiner note 1/8 temps (1/32)
dessiner_note_6:
  2d_circle x%+lig_delta%/2+1,y%,lig_delta%/2
  if notes%(i%)<72
    2d_line x%+lig_delta%-1,y%,x%+lig_delta%-1,y%-3*lig_delta%
    2d_pen_width 2
    2d_line x%+lig_delta%-1,y%-3*lig_delta%,x%+2,y%-5*lig_delta%/2
    2d_line x%+lig_delta%-1,y%-5*lig_delta%/2,x%+2,y%-2*lig_delta%
    2d_line x%+lig_delta%-1,y%-2*lig_delta%,x%+2,y%-3*lig_delta%/2
    2d_pen_width 1
  else
    2d_line x%+1,y%,x%+1,y%+3*lig_delta%
    2d_pen_width 2
    2d_line x%+1,y%+3*lig_delta%,x%+lig_delta%-2,y%+5*lig_delta%/2
    2d_line x%+1,y%+5*lig_delta%/2,x%+lig_delta%-2,y%+2*lig_delta%
    2d_line x%+1,y%+2*lig_delta%,x%+lig_delta%-2,y%+3*lig_delta%/2
    2d_pen_width 1
  end_if
  return


' dessiner pause 4 temps (1 entier)
dessiner_pause_1:
  2d_fill_color 255,255,255
  2d_rectangle x%+1,y%-lig_delta%/2,x%+lig_delta%,y%
  2d_fill_color 0,0,0
  return

' dessiner pause 2 temps (1/2)
dessiner_pause_2:
  2d_fill_color 255,255,255
  2d_rectangle x%+1,y%,x%+lig_delta%,y%+lig_delta%/2
  2d_fill_color 0,0,0
  return

' dessiner pause 1 temps (1/4)
dessiner_pause_3:
  2d_line x%+1,y%-lig_delta%/2,x%+lig_delta%/2,y%+5*lig_delta%/2
  2d_line x%+1,y%-lig_delta%/2,x%+lig_delta%/2+2,y%+lig_delta%/2-1
  2d_circle x%+lig_delta%-2,y%,lig_delta%/3
  return

' dessiner pause 1/2 temps (1/8)
dessiner_pause_4:
  2d_line x%+lig_delta%-1,y%-lig_delta%/2,x%+lig_delta%/2,y%+5*lig_delta%/2
  2d_line x%+lig_delta%-1,y%-lig_delta%/2,x%+1,y%+lig_delta%/2-1
  2d_circle x%+2,y%,lig_delta%/3
  return

' dessiner pause 1/4 temps (1/16)
dessiner_pause_5:
  2d_line x%+lig_delta%-1,y%-lig_delta%/2,x%+lig_delta%/2,y%+5*lig_delta%/2
  2d_line x%+lig_delta%-1,y%-lig_delta%/2,x%+1,y%+lig_delta%/2-1
  2d_circle x%+2,y%,lig_delta%/3
  2d_line x%+lig_delta%-1,y%+lig_delta%/2,x%+1,y%+3*lig_delta%/2-1
  2d_circle x%+2,y%+lig_delta%,lig_delta%/3
  return

' dessiner pause 1/8 temps (1/32)
dessiner_pause_6:
  2d_line x%+lig_delta%-1,y%-lig_delta%/2,x%+lig_delta%/2,y%+5*lig_delta%/2
  2d_line x%+lig_delta%-1,y%-lig_delta%/2,x%+1,y%+lig_delta%/2-1
  2d_circle x%+2,y%,lig_delta%/3
  2d_line x%+lig_delta%-2,y%+lig_delta%/2,x%+1,y%+3*lig_delta%/2-1
  2d_circle x%+2,y%+lig_delta%,lig_delta%/3
  2d_line x%+lig_delta%-3,y%+3*lig_delta%/2,x%,y%+5*lig_delta%/2-1
  2d_circle x%+2,y%+2*lig_delta%,lig_delta%/3
  return

' dessiner un point
dessiner_point:
  if frac(abs(y%-lig_start%)/lig_delta%)=0
    gosub dessiner_point_2
  else
    gosub dessiner_point_1
  end_if
  return

' dessiner un point juste à droite
dessiner_point_1:
  2d_circle x%+lig_delta%+2,y%,2
  return

' dessiner un point à droite décalé vers le bas
dessiner_point_2:
  2d_circle x%+lig_delta%+3,y%+4,2
  return

localiser_note:
  index_ligne% = table_vertical%(notes_origine%(i%,1),notes_origine%(i%,0))
  y% = lig_start% + index_ligne%*lig_delta%/2
  if index_ligne%<0
    lignes_audessus% = int((0-index_ligne%)/2)
  else
    lignes_audessus% = 0
  end_if
  if index_ligne%>8
    lignes_endessous% = int((index_ligne%-8)/2)
  else
    lignes_endessous% = 0
  end_if
  return

sel_instrument:
  s$ = text$(no_instruments%)
  if len(s$)>3
    s$ = left$(s$,3)
    if numeric(s$)=1
      text no_ligne%,trim$(text$(no_ligne%)) + " i"+trim$(s$)
      return
    end_if
  end_if
  message "il faut choisir un instrument valide"
  return

sel_volume:
  s$ = str$(position(no_volume%))
  text no_ligne%,trim$(text$(no_ligne%)) + " v"+trim$(s$)
  return

clic_piano:
  off_click no_piano%
  2d_target_is no_piano%
  x% = mouse_x_left_down(no_piano%)
  y% = mouse_y_left_down(no_piano%)
  if y%<20 then return : ' partie inactive
  for i%=1 to 9  : ' identifier l'octave
    if x%>piano_octaves%(i%,0)
      if x%<piano_octaves%(i%,1)
        octave% = i%
        exit_for
      end_if
    end_if
  next i%
  if color_pixel_red(no_piano%,x%,y%)=0  : ' clic entre les touches
    on_click no_piano%, clic_piano
    return
  end_if
  if color_pixel_red(no_piano%,x%,y%)=1  : ' identifier touche blanche/noire
    flag_noire% = 1
  else
    flag_noire% = 0
  end_if
  2d_flood x%,y%,255,0,0
  j% = x% - piano_octaves%(octave%,0)
  touche_blanche% = int((j%+largeur_blanche%-1)/largeur_blanche%)
  if octave%=1 then touche_blanche% = touche_blanche% + 4
  touche_noire%=0
  if flag_noire%=1
    if (touche_blanche%-1)*largeur_blanche%+largeur_blanche%*0.6<j%
      touche_noire% = 1
    else
      touche_noire% = M1%
    end_if
  end_if
  mark_on no_octaves%+octave%
  mark_on no_notes%+touche_blanche%
  if flag_noire%=1
    if touche_noire%=1
      mark_on no_modif%+2
    else
      mark_on no_modif%+3
    end_if
  else
    mark_on no_modif%+1
  end_if
  gosub inserer
  if flag_noire%=1
    2d_flood x%,y%,1,0,0
  else
    2d_flood x%,y%,255,255,255
  end_if
  on_click no_piano%, clic_piano
  return

inserer:
  inactive no_inserer%
  s1$ = ""
  for i%=1 to 9
    if checked(no_octaves%+i%)=1
      s1$ = caption$(no_octaves%+i%)
      exit_for
    end_if
  next i%
  for i%=1 to 8
    if checked(no_notes%+i%)=1
      s1$ = s1$ + caption$(no_notes%+i%)
      if i%=8 then s1$ = mid$(s1$,2,len(s1$))
      exit_for
    end_if
  next i%
  if right$(s1$,1)<>"p"
    for i%=2 to 3
      if checked(no_modif%+i%)=1
        s1$ = s1$ + caption$(no_modif%+i%)
        exit_for
      end_if
    next i%
  end_if
  s1$ = s1$ + left$(text$(no_duree%),1)
  if checked(no_duree%+1)=1 then s1$ = s1$ + "."
  if checked(no_ecoute_immediate%)=1
    mode_immediat% = 1
    s$ = s1$ + " "
    n_notes% = 0
    gosub compiler_immediat
    gosub jouer
    mode_immediat% = 0
  end_if
  text no_ligne%,trim$(trim$(text$(no_ligne%)) + " "+trim$(s1$))
  active no_inserer%
  return

lol! lol! lol!


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

Klaus


Nombre de messages : 12301
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 - Page 2 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 - Page 2 EmptyMar 21 Aoû 2012 - 12:07

Merci Papydall ! Ton bouton Arrêter manquait, en affet. Je l'ai intégré à mon source et remis en ligne dans le premier post. Ainsi, cela intègre aussi mon dernier correctif par rapport à un blocage du piano.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12301
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 - Page 2 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 - Page 2 EmptyMar 21 Aoû 2012 - 18:55

Nouveauté:
il y a maintenant des boutons Ouvrir et Sauver à côté du mémo de la partition. Cela permet de sauvegarder sa mélodie dans un fichier *.mel (comme mélodie) et de le récupérer.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Jicehel

Jicehel


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

Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 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 - Page 2 EmptyMar 21 Aoû 2012 - 19:50

Nickel Klaus, 2 petites remarques toutefois.
Avec l'écoute immédiate, il ne tient pas compte du changement d'instrument (il faut avoir jouer le changement pour qu'il fasse l'écoute immédiate avec l'instrument sélectionné)
Il serait pratique d'avoir un bouton type "vider en cours" pour effacer la ligne de saisie de manière plus rapide si l'écoute immédiate ne nous plait pas et que l'on veut modifier quelque chose
Revenir en haut Aller en bas
Yannick




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

Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 Empty
MessageSujet: re   Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 EmptyMar 21 Aoû 2012 - 20:02

Je n'aurai qu' un commentaire à faire :


GENIAL !!!!...


à une seule condition ! NE PAS ETRE MOI ! Laughing Laughing Laughing
un ignare complet du solfège Rolling Eyes et seulement bon à écouter de la musique.... geek rendeer
Revenir en haut Aller en bas
Yannick




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

Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 Empty
MessageSujet: re   Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 EmptyMar 21 Aoû 2012 - 23:18


Je n'ai pas étudié ton code, donc je ne sais pas comment tu fais tes notes sur la portée.
mais peut être que ceci te donnerai une idée
(généré un alpha que tu place en hauteur et qui soit porteur d'un signe du solfège...)

voilà un truc que j'ai vu en cherchant des polices :
http://www.dafont.com/fr/lassus.font


si cela peut te servir .... Laughing
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12301
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 - Page 2 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 - Page 2 EmptyMar 21 Aoû 2012 - 23:38

Je dessine absolument tout avec les fonctions 2d_xxx de Panoramic - la portée, les notes, les # et b, la clé de sol...

Mais cette police est intéressante. je l'ai téléchargée et je vais voir ce que je peux en faire. Merci pour l'info.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12301
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 - Page 2 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 - Page 2 EmptyMer 22 Aoû 2012 - 1:19

Grande nouveauté:
j'ai ajoute deux boutons à côté du mémo de la partition:
- transposition d'un demi-ton plus haut
- transposition d'un demi-ton plus bas

Ceci permettra de jouer une mélodie dans la gamme la plus simple (DO en général), puis de la transposer, demi-ton par demi-ton, vers la gamme dans laquelle elle doit être jouée.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12301
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 - Page 2 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 - Page 2 EmptyMer 22 Aoû 2012 - 13:20

Autre nouveauté:
2 nouveaux boutons pour accélérer ou ralentir le morceau !

Et voici en prime la Marseillaise en gamme FA, saisie au piano:
Citation :
0do6 0do5. 0do6 0fa4 0fa4 0sol4 0sol4 1do4. 0la5 0fa5. 0fa6 0la5. 0fa6 0ré4 0sib3 0sol5. 0mi6 0fa3 p4 0fa5. 0sol6
0la4 0la4 0la4 0sib5. 0la6 0la4 0sol4 p4 0sol5. 0la6 0sib4 0sib4 0sib4 1do5. 0sib6 0la3 p4 1do5. 1do6
1do4 0la5. 0fa6 1do4 0la5. 0fa6 0do3 p5. 0do6 0do5. 0mi6 0sol3 0sib4 0sol5. 0mi6 0sol4 0fa4 0mib3 0ré4 0fa5. 0fa6 0fa4 0mi5. 0fa6
0sol3. 0sol4 0lab4. 0lab5 0lab5 0lab5 0sib5 1do5 0sol3. 0lab5 0sol5 0fa4. 0fa5 0fa5 0lab5 0sol5 0fa5
0fa3 0mi5 p5 p5 p6 1do6 1do3 1do5. 1do6 0la5. 0fa6 0sol3. p6. 1do6 1do3 1do5. 1do6 0la5. 0fa6
0sol3 p4 0do4 0fa3 p4 0sol4 0la3 p3 0la#3 1do4 1ré4 0sol3. 1ré4 1do3 1do5. 0la6 0sib5. 0sol6 0fa3.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Jicehel

Jicehel


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

Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 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 - Page 2 EmptyMer 22 Aoû 2012 - 14:15

Cool, bonne idée de partager ces musique sur le forum Wink Ca permet d'éviter d'avoir tous à ce les créer.
Je vais essayer d'en faire un peu aussi pour partager
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12301
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 - Page 2 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 - Page 2 EmptyMer 22 Aoû 2012 - 14:36

Et tu as vu, à partir d'une musique dans ce format qu'il suffit de copier/coller dans le memo de la partition pour pouvoir la jouer, tu peux générer le code Panoramic pour l'exécuter directement dans un programme ? Clique sur Jouer, tu laisses aller jusqu'au bout ou tu l'arrêtes par Arrêter - peu importe, tu cliques sur Partition, et tu as entre autres un bouton Panoramic. Ce bouton copie le code Panoramic nécessaire dans le presse-papier !

Autre chose: j'ai modifié le dessin de la partition sur la portée de sorte que celle-ci s'étende en largeur pour s'adapter automatiquement à la longueur du morceau. Testé avec la marseillaise: toute la partition est visible. Et un clic que le bouton Effacer reconstruit les dimensions initiales de la partition, entre autres.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Un exemple de génération de mélodie avec les fonctions MIDI - Page 2 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 - Page 2 EmptyMer 22 Aoû 2012 - 14:37

Super interessant ce programme Klaus

Serait il possible de charger des fichiers midi existant ?

car la pour le coup on aurait un playeur très complet !
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Klaus

Klaus


Nombre de messages : 12301
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 - Page 2 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 - Page 2 EmptyMer 22 Aoû 2012 - 15:00

Malheureusement non. Et ça tien au fait que j'utilise exclusivement les commandes MIDI_xxx de Panoramic qui ne donnent accès qu'à un sous-ensemble très restraint des fonctions midi sur l'ordinateur. Pour avoir un player complet, il faudrait passer par une DLL en Delphi, comme d'habitude dans ces cas-là.

Pour moi, le but était de mettre en lumière les possibilités des fonctions midi de Panoramic,. Et un second objectif était la possibilité de constituer un programme jukebox qui intégrerait une multitude de mélodies codées via le code généré du bouton Panoramio de mon programme. Ce jukebox pourrait alors servir de fond sonore pour un jeu, sans ralentir le jeu lui-même.


EDIT

correction d'un bug avec la génération du code Panoramic
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12301
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 - Page 2 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 - Page 2 EmptyMer 22 Aoû 2012 - 18:45

J'ai réalisé une première version d'un programme Jukebox pour laisser jouer des mélodies en arrière-plan. J'utilise le mécanisme de communication entre programmes de KGF.dll. Cette DLL est donc requise pour tout programme qui veut se servir du Jukebox. Le Jukebox lui-même n'a pas besoin de la DLL.

Le programme Jukebox.bas présenté ci-après doit être compilé en EXE et placé dans le même dossier que KGF.dll et le programme test_Jukebox.bas présenté après.

Jukebox.bas montre une toute petite fenêtre en haut à droite de l'écran, avec un seul bouton: Stop. Il permet d'arrêter une mélodie, pourvu que que l'interruption soit prévue dans la mélodie. Le programme est fourni avec deux mélodies:
1. la Marseillaise publiée dans un post précédent
2. une mélodie de 5 notes DO-RE-MI-RE-DO
La Marseillaise est prévue "interruptible", l'autre mélodie ne l'est pas. Les mélodies sont déclenchées mar des messages en forme de chaînes de caractères contenant le numéro de la mélodie à jouer. En regardant le source du Jukebox, vous trouverez facilement comment y insérer vos propres mélodies. Pour la Marseillaise, je l'ai insérée par copier/coller à partir du résultat du bouton Panoramic dans mon programme musique.bas, puis j'y ai inséré les tests d'interruption. Le programme appelant envoie un message "0" pour interrompre le morceau en cours par programme. Si aucun morceau n'est en cours, cette commande est ignorée.

Le Jukebox met les demandes de mélodies en file d'attente dans un DLIST. Les mélodies sont jouées dans l'ordre d'arrivée des demandes. Plusieurs programmes peuvent techniquement se servir du même Jukebox, mais cela n'a guère de sens, car Panoramic ne sait jouer qu'une seule note à la fois, et les mélodies sont toutes mises en file d'attente.

Voici le Jukebox:
Code:
' jukebox.bas

label labels : gosub labels
gosub constantes
gosub variables
gosub donnees
gosub form0
gosub menu
gosub GUI
gosub initialisations

end

labels:
  label constantes, variables, donnees, form0, menu, GUI, initialisations
  label reception, arret, arreter, debut
  label marseillaise, melodie_2, tick
  return
 
constantes:
  dim mailbox% : mailbox% = 0-1968 : ' identifiant de la boite à lettres = -1968
  return
 
variables:
  dim no%, no1%, no2%, i%, j%, k%, n%, s$, s1$, s2$
  dim flag_stop%  : ' flag "arrêt demandé"
  dim flag_midi%  : ' flag "séquence midi en cours"
  dim no_bal%, no_file% , no_timer%
  return

donnees:
  return

form0:
  caption 0,"Jukebox"
  width 0,200 : height 0,60 : left 0,screen_x - width(0)
  return

menu:
 return
 
GUI:
' timer pour la surveillance de la file d'attente
  no% = no% + 1 : timer no% : no_timer% = no% : timer_interval no%,100
    on_timer no%,tick : timer_off no%
' boite à lettres:
  no% = no% + 1 : edit no% : no_bal% = no% : top no%,mailbox% : left no%,mailbox%
    on_change no%,reception
' file d'attente
  no% = no% + 1 : dlist no% : no_file% = no%
' bouton d'arrêt
  no% = no% + 1 : button no% : width no%,width(0)-8 : caption no%,"Stop" : on_click no%,arret
  return

initialisations:
  return
 
arret:
  flag_stop% = 1
  return
arreter:
  if flag_midi%=1 then midi_off
  flag_stop% = 0
  flag_midi% = 0
  goto debut
 
reception:
  timer_off no_timer%
  s$ = trim$(text$(no_bal%))
  if s$="0"
    flag_stop% = 1
  else
    item_add no_file%,s$
  end_if
  timer_on no_timer%
  return

tick:
  timer_off no_timer%
debut:
  if count(no_file%)=0 then return
  s$ = item_read$(no_file%,1)
  item_delete no_file%,1
  if numeric(s$)=0 then return
  n% = int(val(s$))
  select n%
    case 0: goto arret
    case 1: goto marseillaise
    case 2: goto melodie_2
  end_select
  goto debut
 
marseillaise:
flag_midi% = 1
midi_on
midi_play 60,10
midi_play 60,9
midi_play 60,10
midi_play 65,6
midi_play 65,6
midi_play 67,6
midi_play 67,6
midi_play 72,7
midi_play 69,8
if flag_stop%=1 then goto arreter
midi_play 65,9
midi_play 65,10
midi_play 69,9
midi_play 65,10
midi_play 62,6
midi_play 70,4
midi_play 67,9
midi_play 64,10
if flag_stop%=1 then goto arreter
midi_play 65,4
midi_volume 1
midi_play 60,6
midi_volume 100
midi_play 65,9
midi_play 67,10
midi_play 69,6
midi_play 69,6
midi_play 69,6
if flag_stop%=1 then goto arreter
midi_play 70,9
midi_play 69,10
midi_play 69,6
midi_play 67,6
midi_volume 1
midi_play 60,6
midi_volume 100
midi_play 67,9
midi_play 69,10
if flag_stop%=1 then goto arreter
midi_play 70,6
midi_play 70,6
midi_play 70,6
midi_play 72,9
midi_play 70,10
midi_play 69,4
midi_volume 1
midi_play 60,6
midi_volume 100
if flag_stop%=1 then goto arreter
midi_play 72,9
midi_play 72,10
midi_play 72,6
midi_play 69,9
midi_play 65,10
midi_play 72,6
midi_play 69,9
midi_play 65,10
midi_play 60,4
if flag_stop%=1 then goto arreter
midi_volume 1
midi_play 60,9
midi_volume 100
midi_play 60,10
midi_play 60,9
midi_play 64,10
midi_play 67,4
midi_play 70,6
midi_play 67,9
if flag_stop%=1 then goto arreter
midi_play 64,10
midi_play 67,6
midi_play 65,6
midi_play 63,4
midi_play 62,6
midi_play 65,9
midi_play 65,10
midi_play 65,6
midi_play 64,9
if flag_stop%=1 then goto arreter
midi_play 65,10
midi_play 67,5
midi_play 67,6
midi_play 68,7
midi_play 68,8
midi_play 68,8
midi_play 68,8
midi_play 70,8
midi_play 72,8
if flag_stop%=1 then goto arreter
midi_play 67,5
midi_play 68,8
midi_play 67,8
midi_play 65,7
midi_play 65,8
midi_play 65,8
midi_play 68,8
midi_play 67,8
midi_play 65,8
if flag_stop%=1 then goto arreter
midi_play 65,4
midi_play 64,8
midi_volume 1
midi_play 60,8
midi_volume 100
midi_volume 1
midi_play 60,8
midi_volume 100
midi_volume 1
if flag_stop%=1 then goto arreter
midi_play 60,10
midi_volume 100
midi_play 72,10
midi_play 72,4
midi_play 72,9
midi_play 72,10
midi_play 69,9
midi_play 65,10
midi_play 67,5
if flag_stop%=1 then goto arreter
midi_volume 1
midi_play 60,11
midi_volume 100
midi_play 72,10
midi_play 72,4
midi_play 72,9
midi_play 72,10
midi_play 69,9
midi_play 65,10
if flag_stop%=1 then goto arreter
midi_play 67,4
midi_volume 1
midi_play 60,6
midi_volume 100
midi_play 60,6
midi_play 65,4
midi_volume 1
midi_play 60,6
midi_volume 100
if flag_stop%=1 then goto arreter
midi_play 67,6
midi_play 69,4
midi_volume 1
midi_play 60,4
midi_volume 100
midi_play 70,4
midi_play 72,6
midi_play 74,6
midi_play 67,5
if flag_stop%=1 then goto arreter
midi_play 74,6
midi_play 72,4
midi_play 72,9
midi_play 69,10
midi_play 70,9
midi_play 67,10
midi_play 65,5
midi_off
flag_midi% = 0
goto debut

melodie_2:
flag_midi% = 1
midi_on
midi_play 60,4
midi_play 62,4
midi_play 64,4
midi_play 62,4
midi_play 60,4
midi_off
flag_midi% = 0
goto debut

et voici le programme permettant de lancer l'une ou l'autre des mélodies, et d'interrompre la mélodie en cours (effectif sur la Marseillaise uniquement).
Code:
' test_jukebox.bas

label labels : gosub labels
gosub constantes
gosub variables
gosub donnees
gosub form0
gosub menu
gosub GUI
gosub initialisations

end

labels:
  label constantes, variables, donnees, form0, menu, GUI, initialisations
  label arret, envoi
  return

constantes:
  dim dll$ : dll$ = "KGF.dll"
  dim jukebox$ : jukebox$ = "Jukebox"
  dim mailbox% : mailbox% = 0-1968 : ' identifiant de la boite à lettres = -1968
  return

variables:
  dim no%, no1%, no2%, i%, j%, k%, n%, s$, s1$, s2$
  dim no_combo%, no_stop%
  dim hnd%, mes$, res%
  return

donnees:
  return

form0:
  caption 0,"Test Jukebox"
  return

menu:
 return

GUI:
' bouton d'arrêt
  no% = no% + 1 : button no% : no_stop% = no% : inactive no%
    width no%,width(0)-8 : caption no%,"Stop" : on_click no%,arret

' Liste des mélodies
  no% = no% + 1 : combo no% : no_combo% = no% : top no%,40 : left no%,10
    on_click no%,envoi : inactive no%
    item_add no%,"La Marseillaise"
    item_add no%,"Mélodie 2"

  return

initialisations:
  dll_on dll$
  hnd% = dll_call3("IPCGetHandle",adr(jukebox$),len(jukebox$),mailbox%)
'  if hnd%=0 then message "Le Jukebox n'est pas lancé !"
  if hnd%=0
    execute "Jukebox.exe"
    wait 1000
    hnd% = dll_call3("IPCGetHandle",adr(jukebox$),len(jukebox$),mailbox%)
    if hnd%=0 then message "Le Jukebox ne peut pas être lancé !"
  end_if
  active no_combo%
  active no_stop%
  return

envoi:
  mes$ = str$(item_index(no_combo%))
  res% = DLL_call3("IPCSendMessage",adr(mes$),len(mes$),hnd%)
  return
 
arret:
  mes$ = "0"
  res% = DLL_call3("IPCSendMessage",adr(mes$),len(mes$),hnd%)
  return
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 - Page 2 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 - Page 2 Empty

Revenir en haut Aller en bas
 
Un exemple de génération de mélodie avec les fonctions MIDI
Revenir en haut 
Page 2 sur 2Aller à la page : Précédent  1, 2
 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
» Fréquence 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: