FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Planétarium virtuel.
par Jack Hier à 20:59

» ajouter des blancs dans un TXT
par lepetitmarocain Mer 15 Aoû 2018 - 13:00

» 11 (en analyse): commandes sur TAB et SUB_MENU.
par Jack Mar 14 Aoû 2018 - 14:10

» 10 (en analyse): Erreur sur variable locale.
par Jack Mar 14 Aoû 2018 - 14:05

» Métamatière, éternité et renouvellement
par Oscaribout Mar 14 Aoû 2018 - 12:40

» De retour...
par Yannick Lun 13 Aoû 2018 - 15:11

» bug SEVERE fnc+sub : (35)name already defined
par Oscaribout Dim 12 Aoû 2018 - 23:55

» Encadrement
par Jean Claude Dim 12 Aoû 2018 - 11:53

» Des rectangles...
par JL35 Dim 12 Aoû 2018 - 10:53

» TRIGGER_KEY_COMBINED_TOUCH
par Jean Claude Mar 7 Aoû 2018 - 20:58

» ITEM_SELECT N,L pour synedit
par Jean Claude Mar 7 Aoû 2018 - 19:11

» amélioration panoramic
par silverman Dim 5 Aoû 2018 - 18:34

» Commande file_readln.
par Pedro Alvarez Dim 5 Aoû 2018 - 17:08

» Klaus ?
par Jack Sam 4 Aoû 2018 - 22:48

» Défragmentation du disque dur
par JL35 Sam 4 Aoû 2018 - 21:06

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Août 2018
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
2728293031  
CalendrierCalendrier

Partagez | 
 

 Maquette d'une rédaction de partition de piano

Aller en bas 
AuteurMessage
Klaus

avatar

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

MessageSujet: Maquette d'une rédaction de partition de piano   Ven 2 Fév 2018 - 22:36

J'ai fait un petit code "proof of concept" pour montrer qu'on peut rédiger graphiquement une partition en cliquant sur un piano virtuel, et exporter les codes MIDI générés, pour en alimenter les fonctions de gestion MIDI. Voici la petite maquelle, juste avec une octave, mais avec un transposeur permettant de sélectionner les 8 octaves possibles d'un piano:
Code:
' Redaction_Partition_Piano.bas

label clickPiano, clickOctave, exporter

dim w%, h%, dline%, x%, y%, cr%, cb%, note1%, note%, i%, nom$, octave%, delta%
dim couleur%, adresse%, hauteur%, dhauteur%, hligne%, f$
dim tabBlanches%(7), tabNoires%(5)
dim nomBlanches$(7), nomNoires$(5)
dim tabOctave$, nomOctave$, nomNote$
dim NotesCumulees%(100), NomsCumulees$(100), OctavesCumulees%(100)
dim Note1Cumulees%(100), NoteCouleurCumulees%(100), NombreCumulees%

data "do",60,"re",62,"mi",64,"fa",65,"sol",67,"la",69,"si",71  : ' notes blanches
data "do #",61,"re #",63,"fa #",66,"sol #",68,"la #",70        : ' notes noires
tabOctave$ = "dcba0123"

for i%=1 to 7
  read nomBlanches$(i%)
  read tabBlanches%(i%)
next i%
for i%=1 to 5
  read nomNoires$(i%)
  read tabNoires%(i%)
next i%

NombreCumulees% = 0
octave% = 5
delta% = 0
adresse% = 20
hauteur% = 5*dline%
hligne% = 100

full_space 0


picture 1 : top 1,140 : width 1,width_client(0) : height 1,height_client(0)-40
w% = width_client(1)
dline% = 10

picture 2 : width 2,140 : height 2,80
2d_target_is 2
2d_pen_color 1,0,0
2d_fill_color 255,255,254
2d_rectangle 0,0,20,80
2d_fill_color 255,255,253
2d_rectangle 20,0,40,80
2d_fill_color 255,255,252
2d_rectangle 40,0,60,80
2d_fill_color 255,255,251
2d_rectangle 60,0,80,80
2d_fill_color 255,255,250
2d_rectangle 80,0,100,80
2d_fill_color 255,255,249
2d_rectangle 100,0,120,80
2d_fill_color 255,255,248
2d_rectangle 120,0,140,80
2d_pen_color 0,0,1
2d_fill_color 0,0,1
2d_rectangle 12,0,28,40
2d_fill_color 0,0,2
2d_rectangle 32,0,48,40
2d_fill_color 0,0,3
2d_rectangle 72,0,88,40
2d_fill_color 0,0,4
2d_rectangle 92,0,108,40
2d_fill_color 0,0,5
2d_rectangle 112,0,128,40
on_click 2,clickPiano

container_option 3 : top 3,90 : width 3,130 : height 3,40 : left 3,5
  caption 3,"Octaves"
option 31 : parent 31,3 : top 31,15 : left 31,5 :  width 31,20 : on_click 31,clickOctave
option 32 : parent 32,3 : top 32,15 : left 32,20 : width 32,20 : on_click 32,clickOctave
option 33 : parent 33,3 : top 33,15 : left 33,35 : width 33,20 : on_click 33,clickOctave
option 34 : parent 34,3 : top 34,15 : left 34,50 : width 34,20 : on_click 34,clickOctave
option 35 : parent 35,3 : top 35,15 : left 35,65 : width 35,20 : on_click 35,clickOctave
option 36 : parent 36,3 : top 36,15 : left 36,80 : width 36,20 : on_click 36,clickOctave
option 37 : parent 37,3 : top 37,15 : left 37,95 : width 37,20 : on_click 37,clickOctave
option 38 : parent 38,3 : top 38,15 : left 38,110 : width 38,15: on_click 38,clickOctave
mark_on  30+octave%


2d_target_is 1
2d_fill_off
print_target_is 1
font_size 1,8

button 4 : top 4,10 : left 4,180 : caption 4,"Exporter" : on_click 4,exporter
dlist 5
save_dialog 6 : filter 6,"Fichiers texte (*.TXT)|*.txt"
alpha 7 : top 7,110 : left 7,180

trame()

end

clickPiano:
  x% = mouse_x_left_down(2)
  y% = mouse_y_left_down(2)
  cr% = color_pixel_red(2,x%,y%)
  cb% = color_pixel_blue(2,x%,y%)
  if cr%=255            : ' c'est une blanche ?
    note1% = 255 - cb%
    note% = tabBlanches%(note1%) + delta%
    nomNote$ = "("+nomOctave$+")"+nomBlanches$(note1%)
    caption 7, "blanche "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
    couleur% = 1
    hauteur% = 5*dline% - (note1%-1)*dline%/2
  else
    if cr%=0            : ' est-ce une noire ?
      note1% = cb%
      nomNote$ = "("+nomOctave$+")"+nomNoires$(note1%)
      note% = tabNoires%(note1%) + delta%
      caption 7, "noire "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$ 
      couleur% = 2             
      hauteur% = 5*dline% - (note1%-1)*dline%/2
      if note1%>2 then hauteur% = hauteur% - dline%/2
    end_if
  end_if
 
  NombreCumulees% = NombreCumulees% + 1
  NotesCumulees%(NombreCumulees%)      = note%
  NomsCumulees$(NombreCumulees%)        = nomNote$
  OctavesCumulees%(NombreCumulees%)    = octave%
  Note1Cumulees%(NombreCumulees%)      = note1%
  NoteCouleurCumulees%(NombreCumulees%) = couleur%
 
  DessinerNote()
  adresse% = adresse% + 20
 
  return
 
clickOctave:
  octave% = number_click - 30
  delta% = (octave%-5)*12
  nomOctave$ = mid$(tabOctave$,octave%,1)
  return
 
exporter:
  if NombreCumulees%=0
    message "Il n'y a rien à exporter !"
    return
  end_if
  f$ = file_name$(6)
  if f$="_" then return
  if file_exists(f$)=1
    if message_confirmation_yes_no("Ce fichier existe déjà. Remplacer ?")<>1 then return
  end_if   
  clear 5
  for i%=1 to NombreCumulees%
    item_add 5,NomsCumulees$(i%)+"="+str$(NotesCumulees%(i%))
  next i%
  file_save 5,f$
  return
 
sub DessinerNote()
  dim_local a%
  a% = adresse%
  if NoteCouleurCumulees%(NombreCumulees%)=2
    print_locate a%-9,hligne%+hauteur%-7
    print "#"
    a% = a% + 5
    adresse% = adresse% + 3
  end_if
  2d_circle a%,hligne%+hauteur%,dline%/2
  if Note1Cumulees%(NombreCumulees%)=1
'    if NoteCouleurCumulees%(NombreCumulees%)=1
      2d_line a%-7,hligne%+hauteur%,a%+7,hligne%+hauteur%
'    end_if
  end_if
  print_locate a%-5,hligne%+60
  print mid$(tabOctave$,octave%,1)
 
  if adresse%>(width_client(1)-25)
    hligne% = hligne% + 100
    trame()
    adresse% = 20
  end_if

end_sub

sub trame()
  2d_line 0,hligne%,w%,hligne%
  2d_line 0,hligne%+dline%,w%,hligne%+dline%
  2d_line 0,hligne%+2*dline%,w%,hligne%+2*dline%
  2d_line 0,hligne%+3*dline%,w%,hligne%+3*dline%
  2d_line 0,hligne%+4*dline%,w%,hligne%+4*dline%

  ' séparateur de mesure
  2d_line 10,hligne%,10,hligne%+4*dline%
end_sub
Il est assez facile d'étendre le piano à 8 octaves, d'ajouter des options permettant de choisir les durées des notes, les instruments, etc.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

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

MessageSujet: Re: Maquette d'une rédaction de partition de piano   Sam 3 Fév 2018 - 17:12

En voici une version avec un clavier entier de 8 octaves:
Code:
' Redaction_Partition_Piano.bas

label clickPiano, exporter

dim w%, h%, dline%, x%, y%, cr%, cv%, cb%, note1%, note%, i%, nom$
dim octave%, delta%
dim couleur%, adresse%, hauteur%, dhauteur%, hligne%, f$
dim tabBlanches%(7), tabNoires%(5)
dim nomBlanches$(7), nomNoires$(5)
dim tabOctave$, nomOctave$, nomNote$
dim NotesCumulees%(100), NomsCumulees$(100), OctavesCumulees%(100)
dim Note1Cumulees%(100), NoteCouleurCumulees%(100), NombreCumulees%

data "do",60,"re",62,"mi",64,"fa",65,"sol",67,"la",69,"si",71   : ' notes blanches
data "do #",61,"re #",63,"fa #",66,"sol #",68,"la #",70         : ' notes noires
tabOctave$ = "dcba0123"

for i%=1 to 7
  read nomBlanches$(i%)
  read tabBlanches%(i%)
next i%
for i%=1 to 5
  read nomNoires$(i%)
  read tabNoires%(i%)
next i%

NombreCumulees% = 0
octave% = 5
delta% = 0
adresse% = 20
hauteur% = 5*dline%
hligne% = 100

full_space 0


picture 1 : top 1,140 : width 1,width_client(0) : height 1,height_client(0)-40
w% = width_client(1)
dline% = 10

picture 2 : width 2,1020 : height 2,80
2d_target_is 2
2d_pen_color 1,0,0
DessinerOctave(1,-100)
DessinerOctave(2,40)
DessinerOctave(3,180)
DessinerOctave(4,320)
DessinerOctave(5,460)
DessinerOctave(6,600)
DessinerOctave(7,740)
DessinerOctave(8,880)



on_click 2,clickPiano

container_option 3 : top 3,10 : width 3,130 : height 3,40 : left 3,width(2)+10
  caption 3,"Octaves"
option 31 : parent 31,3 : top 31,15 : left 31,5 :  width 31,20
option 32 : parent 32,3 : top 32,15 : left 32,20 : width 32,20
option 33 : parent 33,3 : top 33,15 : left 33,35 : width 33,20
option 34 : parent 34,3 : top 34,15 : left 34,50 : width 34,20
option 35 : parent 35,3 : top 35,15 : left 35,65 : width 35,20
option 36 : parent 36,3 : top 36,15 : left 36,80 : width 36,20
option 37 : parent 37,3 : top 37,15 : left 37,95 : width 37,20
option 38 : parent 38,3 : top 38,15 : left 38,110 : width 38,15
mark_on 30+octave%
set_focus 30+octave%

2d_target_is 1
2d_fill_off
print_target_is 1
font_size 1,8

button 4 : top 4,90 : left 4,320 : caption 4,"Exporter" : on_click 4,exporter
dlist 5
save_dialog 6 : filter 6,"Fichiers texte (*.TXT)|*.txt"
alpha 8 : top 8,110 : left 8,10 : caption 8,"Note jouée:"
alpha 7 : top 7,110 : left 7,80 : font_bold 7

trame()

end

clickPiano:
  x% = mouse_x_left_down(2)
  y% = mouse_y_left_down(2)
  cr% = color_pixel_red(2,x%,y%)
  cv% = color_pixel_green(2,x%,y%)
  cb% = color_pixel_blue(2,x%,y%)
  if cr%=255             : ' c'est une blanche ?
    note1% = 255 - cb%
    octave% = 255 - cv%
    nomOctave$ = mid$(tabOctave$,octave%,1)
    delta% = (octave%-5)*12
    note% = tabBlanches%(note1%) + delta%
    nomNote$ = "("+nomOctave$+")"+nomBlanches$(note1%)
    caption 7, "blanche "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
    couleur% = 1
    hauteur% = 5*dline% - (note1%-1)*dline%/2
  else
    if cr%=0             : ' est-ce une noire ?
      note1% = cb%
      octave% = cv%
      nomOctave$ = mid$(tabOctave$,octave%,1)
      delta% = (octave%-5)*12
      nomNote$ = "("+nomOctave$+")"+nomNoires$(note1%)
      note% = tabNoires%(note1%) + delta%
      caption 7, "noire "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$  
      couleur% = 2              
      hauteur% = 5*dline% - (note1%-1)*dline%/2
      if note1%>2 then hauteur% = hauteur% - dline%/2
    end_if
  end_if
  mark_on 30+octave%
  set_focus 30+octave%
  display
  
  NombreCumulees% = NombreCumulees% + 1
  NotesCumulees%(NombreCumulees%)       = note%
  NomsCumulees$(NombreCumulees%)        = nomNote$
  OctavesCumulees%(NombreCumulees%)     = octave%
  Note1Cumulees%(NombreCumulees%)       = note1%
  NoteCouleurCumulees%(NombreCumulees%) = couleur%
  
  DessinerNote()
  adresse% = adresse% + 20
  
  return
  
exporter:
  if NombreCumulees%=0
    message "Il n'y a rien à exporter !"
    return
  end_if
  f$ = file_name$(6)
  if f$="_" then return
  if file_exists(f$)=1
    if message_confirmation_yes_no("Ce fichier existe déjà. Remplacer ?")<>1 then return
  end_if    
  clear 5
  for i%=1 to NombreCumulees%
    item_add 5,NomsCumulees$(i%)+"="+str$(NotesCumulees%(i%))
  next i%
  file_save 5,f$
  return
  
sub DessinerNote()
  dim_local a%
  a% = adresse%
  if NoteCouleurCumulees%(NombreCumulees%)=2
    print_locate a%-9,hligne%+hauteur%-7
    print "#"
    a% = a% + 5
    adresse% = adresse% + 3
  end_if
  2d_circle a%,hligne%+hauteur%,dline%/2
  if Note1Cumulees%(NombreCumulees%)=1
'    if NoteCouleurCumulees%(NombreCumulees%)=1
      2d_line a%-7,hligne%+hauteur%,a%+7,hligne%+hauteur%
'    end_if
  end_if
  print_locate a%-5,hligne%+60
  print mid$(tabOctave$,octave%,1)
  
  if adresse%>(width_client(1)-25)
    hligne% = hligne% + 100
    trame()
    adresse% = 20
  end_if

end_sub

sub trame()
  2d_line 0,hligne%,w%,hligne%
  2d_line 0,hligne%+dline%,w%,hligne%+dline%
  2d_line 0,hligne%+2*dline%,w%,hligne%+2*dline%
  2d_line 0,hligne%+3*dline%,w%,hligne%+3*dline%
  2d_line 0,hligne%+4*dline%,w%,hligne%+4*dline%

  ' séparateur de mesure
  2d_line 10,hligne%,10,hligne%+4*dline%
end_sub

sub DessinerOctave(id%,x%)
  2d_fill_color 255,255-id%,254
  2d_rectangle x%,0,x%+20,80
  2d_fill_color 255,255-id%,253
  2d_rectangle x%+20,0,x%+40,80
  2d_fill_color 255,255-id%,252
  2d_rectangle x%+40,0,x%+60,80
  2d_fill_color 255,255-id%,251
  2d_rectangle x%+60,0,x%+80,80
  2d_fill_color 255,255-id%,250
  2d_rectangle x%+80,0,x%+100,80
  2d_fill_color 255,255-id%,249
  2d_rectangle x%+100,0,x%+120,80
  2d_fill_color 255,255-id%,248
  2d_rectangle x%+120,0,x%+140,80
  2d_pen_color 0,id%,1
  2d_fill_color 0,id%,1
  2d_rectangle x%+12,0,x%+28,40
  2d_fill_color 0,id%,2
  2d_rectangle x%+32,0,x%+48,40
  2d_fill_color 0,id%,3
  2d_rectangle x%+72,0,x%+88,40
  2d_fill_color 0,id%,4
  2d_rectangle x%+92,0,x%+108,40
  2d_fill_color 0,id%,5
  2d_rectangle x%+112,0,x%+128,40
end_sub

Les portées sont toujours écrites comme si c'était l'octave 0 (celle au centre...), mais les identifiants des octaves sont notées en-dessous: d-c-b-a-0-1-2-3. Si la portée est pleine, l'écriture revient à la ligne avec une nouvelle portée.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Marc

avatar

Nombre de messages : 809
Age : 57
Localisation : TOURS
Date d'inscription : 17/03/2014

MessageSujet: Re: Maquette d'une rédaction de partition de piano   Sam 3 Fév 2018 - 17:45

cheers  Bravo Klaus !

Testé avec succès !

Spoiler:
 

Merci de tes éternels partages !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Maquette d'une rédaction de partition de piano   Sam 3 Fév 2018 - 18:05

Content que ça te plaise !

Voici une version avec un sélecteur d'instrument. On démarre avec le piano, mais une combo en haut à droite permet de choisir l'un des 127 instruments possibles. L'instrument choisi sera mémorisé avec la prochaine note, et dans la trame exportée, on verra entre accolades le numéro de l'instrument au moment du changement d'instrument. Il y a aussi un réglage du volume. Il est également mémorisé et restitué dans la trame exportée après la note, entre crochets.

Tout ça, c'est du 100 % Panoramic, sans DLL.

Voici cette version:
Code:
' Redaction_Partition_Piano.bas

label clickPiano, exporter, changevolume

dim w%, h%, dline%, x%, y%, cr%, cv%, cb%, note1%, note%, i%, nom$
dim octave%, delta%, instrument%, instrument1%
dim couleur%, adresse%, hauteur%, dhauteur%, hligne%, f$
dim tabBlanches%(7), tabNoires%(5)
dim nomBlanches$(7), nomNoires$(5)
dim tabOctave$, nomOctave$, nomNote$
dim NotesCumulees%(100), NomsCumulees$(100), OctavesCumulees%(100)
dim Note1Cumulees%(100), NoteCouleurCumulees%(100), NombreCumulees%
dim InstrumentsCumules%(100)

data "do",60,"re",62,"mi",64,"fa",65,"sol",67,"la",69,"si",71  : ' notes blanches
data "do #",61,"re #",63,"fa #",66,"sol #",68,"la #",70        : ' notes noires
tabOctave$ = "dcba0123"

for i%=1 to 7
  read nomBlanches$(i%)
  read tabBlanches%(i%)
next i%
for i%=1 to 5
  read nomNoires$(i%)
  read tabNoires%(i%)
next i%

NombreCumulees% = 0
octave% = 5
delta% = 0
adresse% = 20
hauteur% = 5*dline%
hligne% = 100

full_space 0


picture 1 : top 1,140 : width 1,width_client(0) : height 1,height_client(0)-40
w% = width_client(1)
dline% = 10

picture 2 : width 2,1020 : height 2,80
2d_target_is 2
2d_pen_color 1,0,0
DessinerOctave(1,-100)
DessinerOctave(2,40)
DessinerOctave(3,180)
DessinerOctave(4,320)
DessinerOctave(5,460)
DessinerOctave(6,600)
DessinerOctave(7,740)
DessinerOctave(8,880)



on_click 2,clickPiano

container_option 3 : top 3,10 : width 3,130 : height 3,40 : left 3,width(2)+10
  caption 3,"Octaves"
option 31 : parent 31,3 : top 31,15 : left 31,5 :  width 31,20
option 32 : parent 32,3 : top 32,15 : left 32,20 : width 32,20
option 33 : parent 33,3 : top 33,15 : left 33,35 : width 33,20
option 34 : parent 34,3 : top 34,15 : left 34,50 : width 34,20
option 35 : parent 35,3 : top 35,15 : left 35,65 : width 35,20
option 36 : parent 36,3 : top 36,15 : left 36,80 : width 36,20
option 37 : parent 37,3 : top 37,15 : left 37,95 : width 37,20
option 38 : parent 38,3 : top 38,15 : left 38,110 : width 38,15
mark_on 30+octave%
set_focus 30+octave%

2d_target_is 1
2d_fill_off
print_target_is 1
font_size 1,8

button 4 : top 4,90 : left 4,320 : caption 4,"Exporter" : on_click 4,exporter
dlist 5
save_dialog 6 : filter 6,"Fichiers texte (*.TXT)|*.txt"
alpha 8 : top 8,110 : left 8,10 : caption 8,"Note jouée:"
alpha 7 : top 7,110 : left 7,80 : font_bold 7

combo 40 : top 40,60 : left 40,width(2)+10 : width 40,150
  item_add 40,"Bright acoustic piano"
  item_add 40,"Electric grand piano"
  item_add 40,"Honky-tonk piano"
  item_add 40,"Rhodes piano"
  item_add 40,"Chorused piano"
  item_add 40,"Harpsichord"
  item_add 40,"Clavinet"
  item_add 40,"Celesta"
  item_add 40,"Glockenspiel"
  item_add 40,"Music box"
  item_add 40,"Vibraphone"
  item_add 40,"Marimba"
  item_add 40,"Xylophone"
  item_add 40,"Tubular bells"
  item_add 40,"Dulcimer"
  item_add 40,"Hammond organ"
  item_add 40,"Percussive organ"
  item_add 40,"Rock organ"
  item_add 40,"Church organ"
  item_add 40,"Reed organ"
  item_add 40,"Accordion"
  item_add 40,"Harmonica"
  item_add 40,"Tango accordion"
  item_add 40,"Acoustic guitar (nylon)"
  item_add 40,"Acoustic guitar (steel)"
  item_add 40,"Electric guitar (jazz)"
  item_add 40,"Electric guitar (clean)"
  item_add 40,"Electric guitar (muted)"
  item_add 40,"Overdriven guitar"
  item_add 40,"Distortion guitar"
  item_add 40,"Guitar harmonics"
  item_add 40,"Acoustic bass"
  item_add 40,"Electric bass (finger)"
  item_add 40,"Electric bass (pick)"
  item_add 40,"Fretless bass"
  item_add 40,"Slap bass 1"
  item_add 40,"Slap bass 2"
  item_add 40,"Synth bass 1"
  item_add 40,"Synth bass 2"
  item_add 40,"Violin"
  item_add 40,"Viola"
  item_add 40,"Cello"
  item_add 40,"Contrabass"
  item_add 40,"Tremolo strings"
  item_add 40,"Pizzicato strings"
  item_add 40,"Orchestral harp"
  item_add 40,"Timpani"
  item_add 40,"String ensemble 1"
  item_add 40,"String ensemble 2"
  item_add 40,"Synth. strings 1"
  item_add 40,"Synth. strings 2"
  item_add 40,"Choir Aahs"
  item_add 40,"Voice Oohs"
  item_add 40,"Synth voice"
  item_add 40,"Orchestra hit"
  item_add 40,"Trumpet"
  item_add 40,"Trombone"
  item_add 40,"Tuba#966"
  item_add 40,"Muted trumpet"
  item_add 40,"French horn"
  item_add 40,"Brass section"
  item_add 40,"Synth. brass 1"
  item_add 40,"Synth. brass 2"
  item_add 40,"Soprano sax"
  item_add 40,"Alto sax"
  item_add 40,"Tenor sax"
  item_add 40,"Baritone sax"
  item_add 40,"Oboe"
  item_add 40,"English horn"
  item_add 40,"Bassoon"
  item_add 40,"Clarinet"
  item_add 40,"Piccolo"
  item_add 40,"Flute"
  item_add 40,"Recorder"
  item_add 40,"Pan flute"
  item_add 40,"Bottle blow"
  item_add 40,"Shakuhachi"
  item_add 40,"Whistle"
  item_add 40,"Ocarina"
  item_add 40,"Lead 1 (square)"
  item_add 40,"Lead 2 (sawtooth)"
  item_add 40,"Lead 3 (calliope lead)"
  item_add 40,"Lead 4 (chiff lead)"
  item_add 40,"Lead 5 (charang)"
  item_add 40,"Lead 6 (voice)"
  item_add 40,"Lead 7 (fifths)"
  item_add 40,"Lead 8 (brass + lead)"
  item_add 40,"Pad 1 (new age)"
  item_add 40,"Pad 2 (warm)"
  item_add 40,"Pad 3 (polysynth)"
  item_add 40,"Pad 4 (choir)"
  item_add 40,"Pad 5 (bowed)"
  item_add 40,"Pad 6 (metallic)"
  item_add 40,"Pad 7 (halo)"
  item_add 40,"Pad 8 (sweep)"
  item_add 40,"Synth SFX 1 Ice Rain"
  item_add 40,"Synth SFX 2 Sound Track"
  item_add 40,"Synth SFX 3 Crystal"
  item_add 40,"Synth SFX 4 Atmosphere"
  item_add 40,"Synth SFX 5 Brightness"
  item_add 40,"Synth SFX 6 Goblin"
  item_add 40,"Synth SFX 7 Echo Drops"
  item_add 40,"Synth SFX 8 Star Theme"
  item_add 40,"Sitar"
  item_add 40,"Banjo"
  item_add 40,"Shamisen"
  item_add 40,"Koto"
  item_add 40,"Kalimba"
  item_add 40,"Bagpipe"
  item_add 40,"Fiddle"
  item_add 40,"Shanai"
  item_add 40,"Tinkle Bells"
  item_add 40,"Agogo"
  item_add 40,"Steel Drums"
  item_add 40,"Woodblock"
  item_add 40,"Taiko Drum"
  item_add 40,"Melodic Drum"
  item_add 40,"Synth Drum"
  item_add 40,"Reverse Cymbal"
  item_add 40,"Guitar fret noise"
  item_add 40,"Breath noise"
  item_add 40,"Seashore"
  item_add 40,"Bird tweet"
  item_add 40,"Telephone ring"
  item_add 40,"Helicopter"
  item_add 40,"Applause"
  item_add 40,"Gunshot"
text 40,item_read$(40,1)
instrument1% = 0
instrument% = 1

alpha 41 : top 41,90 : left 41,left(40) : caption 41,"Volume:"
scroll_bar 42 : top 42,90 : left 42,left(41)+50 : width 42,150
  min 42,0 : max 42,127 : position 42,80 : on_change 42,changevolume
alpha 43: top 43,90 : left 43,left(42)+width(42)+10 : caption 43,"80"

trame()

end

changevolume:
  caption 43,str$(position(42))
  return

clickPiano:
  x% = mouse_x_left_down(2)
  y% = mouse_y_left_down(2)
  cr% = color_pixel_red(2,x%,y%)
  cv% = color_pixel_green(2,x%,y%)
  cb% = color_pixel_blue(2,x%,y%)

  if item_index(40)>0 then instrument% = item_index(40) 
  if cr%=255            : ' c'est une blanche ?
    note1% = 255 - cb%
    octave% = 255 - cv%
    nomOctave$ = mid$(tabOctave$,octave%,1)
    delta% = (octave%-5)*12
    note% = tabBlanches%(note1%) + delta%
    if instrument%<>instrument1%
      nomNote$ = "{"+str$(instrument%)+"}("+nomOctave$+")"+nomBlanches$(note1%)
    else
      nomNote$ = "("+nomOctave$+")"+nomBlanches$(note1%)
    end_if
    nomNote$ = nomNote$ + "["+str$(position(42))+"]"
    caption 7, "blanche "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
    couleur% = 1
    hauteur% = 5*dline% - (note1%-1)*dline%/2
  else
    if cr%=0            : ' est-ce une noire ?
      note1% = cb%
      octave% = cv%
      nomOctave$ = mid$(tabOctave$,octave%,1)
      delta% = (octave%-5)*12
      if instrument%<>instrument1%
        nomNote$ = "{"+str$(instrument%)+"}("+nomOctave$+")"+nomNoires$(note1%)
      else
        nomNote$ = "("+nomOctave$+")"+nomNoires$(note1%)
      end_if
      nomNote$ = nomNote$ + "["+str$(position(42))+"]"
      note% = tabNoires%(note1%) + delta%
      caption 7, "noire "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$ 
      couleur% = 2             
      hauteur% = 5*dline% - (note1%-1)*dline%/2
      if note1%>2 then hauteur% = hauteur% - dline%/2
    end_if
  end_if
  instrument1% = instrument%
  mark_on 30+octave%
  set_focus 30+octave%
  display
 
  NombreCumulees% = NombreCumulees% + 1
  NotesCumulees%(NombreCumulees%)      = note%
  NomsCumulees$(NombreCumulees%)        = nomNote$
  OctavesCumulees%(NombreCumulees%)    = octave%
  Note1Cumulees%(NombreCumulees%)      = note1%
  NoteCouleurCumulees%(NombreCumulees%) = couleur%
  InstrumentsCumules%(NombreCumulees%)  = instrument%
 
  DessinerNote()
  adresse% = adresse% + 20
 
  return
 
exporter:
  if NombreCumulees%=0
    message "Il n'y a rien à exporter !"
    return
  end_if
  f$ = file_name$(6)
  if f$="_" then return
  if file_exists(f$)=1
    if message_confirmation_yes_no("Ce fichier existe déjà. Remplacer ?")<>1 then return
  end_if   
  clear 5
  for i%=1 to NombreCumulees%
    item_add 5,NomsCumulees$(i%)+"="+str$(NotesCumulees%(i%))
  next i%
  file_save 5,f$
  return
 
sub DessinerNote()
  dim_local a%
  a% = adresse%
  if NoteCouleurCumulees%(NombreCumulees%)=2
    print_locate a%-9,hligne%+hauteur%-7
    print "#"
    a% = a% + 5
    adresse% = adresse% + 3
  end_if
  2d_circle a%,hligne%+hauteur%,dline%/2
  if Note1Cumulees%(NombreCumulees%)=1
'    if NoteCouleurCumulees%(NombreCumulees%)=1
      2d_line a%-7,hligne%+hauteur%,a%+7,hligne%+hauteur%
'    end_if
  end_if
  print_locate a%-5,hligne%+60
  print mid$(tabOctave$,octave%,1)
 
  if adresse%>(width_client(1)-25)
    hligne% = hligne% + 100
    trame()
    adresse% = 20
  end_if

end_sub

sub trame()
  2d_line 0,hligne%,w%,hligne%
  2d_line 0,hligne%+dline%,w%,hligne%+dline%
  2d_line 0,hligne%+2*dline%,w%,hligne%+2*dline%
  2d_line 0,hligne%+3*dline%,w%,hligne%+3*dline%
  2d_line 0,hligne%+4*dline%,w%,hligne%+4*dline%

  ' séparateur de mesure
  2d_line 10,hligne%,10,hligne%+4*dline%
end_sub

sub DessinerOctave(id%,x%)
  2d_fill_color 255,255-id%,254
  2d_rectangle x%,0,x%+20,80
  2d_fill_color 255,255-id%,253
  2d_rectangle x%+20,0,x%+40,80
  2d_fill_color 255,255-id%,252
  2d_rectangle x%+40,0,x%+60,80
  2d_fill_color 255,255-id%,251
  2d_rectangle x%+60,0,x%+80,80
  2d_fill_color 255,255-id%,250
  2d_rectangle x%+80,0,x%+100,80
  2d_fill_color 255,255-id%,249
  2d_rectangle x%+100,0,x%+120,80
  2d_fill_color 255,255-id%,248
  2d_rectangle x%+120,0,x%+140,80
  2d_pen_color 0,id%,1
  2d_fill_color 0,id%,1
  2d_rectangle x%+12,0,x%+28,40
  2d_fill_color 0,id%,2
  2d_rectangle x%+32,0,x%+48,40
  2d_fill_color 0,id%,3
  2d_rectangle x%+72,0,x%+88,40
  2d_fill_color 0,id%,4
  2d_rectangle x%+92,0,x%+108,40
  2d_fill_color 0,id%,5
  2d_rectangle x%+112,0,x%+128,40
end_sub
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
jjn4

avatar

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

MessageSujet: +++   Sam 3 Fév 2018 - 18:57

Absolument sublime !
cheers
Juste un petit regret...
dommage qu'on ne puisse
pas écouter sa composition finale
(ou alors, j'ai pas trouvé le bouton).
scratch
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://jjn4.e-monsite.com
Klaus

avatar

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

MessageSujet: Re: Maquette d'une rédaction de partition de piano   Sam 3 Fév 2018 - 19:04

Ouais... écouter serait possible, mais on sortirait du 100 % Panoramic. Et puis, il manque encore un élément important, ou plutôt deux: la durée des notes, et les pauses.

Tel quel, je voulais montrer deux choses:
- la possibilité d'afficher graphiquement une partition
- la constitution d'une trame qui pourra être reprise par un petit code Panoramic pour générer les appels aux fonctions MIDI de KGF.dll pour jouer cette trame. Et si l'un utilise deux ou plusieurs trames, on a une polyphonie...

Bon, ce n'est pas un séquenceur, et ce n'était pas l'objectif.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

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

MessageSujet: Re: Maquette d'une rédaction de partition de piano   Dim 4 Fév 2018 - 10:27

Voici une nouvelle version du programme de rédaction. Aucune modification visuelle, mais le codage se fait maintenant de sorte à produire les codes attendues par la fonction MIDI-Compile. Ainsi, il est beaucoup plus facile à générer les trames MIDI pour la piste constituée:
Code:
' Redaction_Partition_Piano.bas

label clickPiano, exporter, changevolume

dim w%, h%, dline%, x%, y%, cr%, cv%, cb%, note1%, note%, i%, nom$
dim octave%, delta%, instrument%, instrument1%
dim couleur%, adresse%, hauteur%, dhauteur%, hligne%, f$
dim tabBlanches%(7), tabNoires%(5)
dim nomBlanches$(7), nomNoires$(5)
dim tabOctave$, nomOctave$, nomNote$
dim NotesCumulees%(100), NomsCumulees$(100), OctavesCumulees%(100)
dim Note1Cumulees%(100), NoteCouleurCumulees%(100), NombreCumulees%
dim InstrumentsCumules%(100)

data "do",60,"re",62,"mi",64,"fa",65,"sol",67,"la",69,"si",71  : ' notes blanches
data "do#",61,"re#",63,"fa#",66,"sol#",68,"la#",70              : ' notes noires
tabOctave$ = "dcba0123"

for i%=1 to 7
  read nomBlanches$(i%)
  read tabBlanches%(i%)
next i%
for i%=1 to 5
  read nomNoires$(i%)
  read tabNoires%(i%)
next i%

NombreCumulees% = 0
octave% = 5
delta% = 0
adresse% = 20
hauteur% = 5*dline%
hligne% = 100

full_space 0


picture 1 : top 1,140 : width 1,width_client(0) : height 1,height_client(0)-40
w% = width_client(1)
dline% = 10

picture 2 : width 2,1020 : height 2,80
2d_target_is 2
2d_pen_color 1,0,0
DessinerOctave(1,-100)
DessinerOctave(2,40)
DessinerOctave(3,180)
DessinerOctave(4,320)
DessinerOctave(5,460)
DessinerOctave(6,600)
DessinerOctave(7,740)
DessinerOctave(8,880)



on_click 2,clickPiano

container_option 3 : top 3,10 : width 3,130 : height 3,40 : left 3,width(2)+10
  caption 3,"Octaves"
option 31 : parent 31,3 : top 31,15 : left 31,5 :  width 31,20
option 32 : parent 32,3 : top 32,15 : left 32,20 : width 32,20
option 33 : parent 33,3 : top 33,15 : left 33,35 : width 33,20
option 34 : parent 34,3 : top 34,15 : left 34,50 : width 34,20
option 35 : parent 35,3 : top 35,15 : left 35,65 : width 35,20
option 36 : parent 36,3 : top 36,15 : left 36,80 : width 36,20
option 37 : parent 37,3 : top 37,15 : left 37,95 : width 37,20
option 38 : parent 38,3 : top 38,15 : left 38,110 : width 38,15
mark_on 30+octave%
set_focus 30+octave%

2d_target_is 1
2d_fill_off
print_target_is 1
font_size 1,8

button 4 : top 4,90 : left 4,320 : caption 4,"Exporter" : on_click 4,exporter
dlist 5
save_dialog 6 : filter 6,"Fichiers texte (*.TXT)|*.txt"
alpha 8 : top 8,110 : left 8,10 : caption 8,"Note jouée:"
alpha 7 : top 7,110 : left 7,80 : font_bold 7

combo 40 : top 40,60 : left 40,width(2)+10 : width 40,150
  item_add 40,"Bright acoustic piano"
  item_add 40,"Electric grand piano"
  item_add 40,"Honky-tonk piano"
  item_add 40,"Rhodes piano"
  item_add 40,"Chorused piano"
  item_add 40,"Harpsichord"
  item_add 40,"Clavinet"
  item_add 40,"Celesta"
  item_add 40,"Glockenspiel"
  item_add 40,"Music box"
  item_add 40,"Vibraphone"
  item_add 40,"Marimba"
  item_add 40,"Xylophone"
  item_add 40,"Tubular bells"
  item_add 40,"Dulcimer"
  item_add 40,"Hammond organ"
  item_add 40,"Percussive organ"
  item_add 40,"Rock organ"
  item_add 40,"Church organ"
  item_add 40,"Reed organ"
  item_add 40,"Accordion"
  item_add 40,"Harmonica"
  item_add 40,"Tango accordion"
  item_add 40,"Acoustic guitar (nylon)"
  item_add 40,"Acoustic guitar (steel)"
  item_add 40,"Electric guitar (jazz)"
  item_add 40,"Electric guitar (clean)"
  item_add 40,"Electric guitar (muted)"
  item_add 40,"Overdriven guitar"
  item_add 40,"Distortion guitar"
  item_add 40,"Guitar harmonics"
  item_add 40,"Acoustic bass"
  item_add 40,"Electric bass (finger)"
  item_add 40,"Electric bass (pick)"
  item_add 40,"Fretless bass"
  item_add 40,"Slap bass 1"
  item_add 40,"Slap bass 2"
  item_add 40,"Synth bass 1"
  item_add 40,"Synth bass 2"
  item_add 40,"Violin"
  item_add 40,"Viola"
  item_add 40,"Cello"
  item_add 40,"Contrabass"
  item_add 40,"Tremolo strings"
  item_add 40,"Pizzicato strings"
  item_add 40,"Orchestral harp"
  item_add 40,"Timpani"
  item_add 40,"String ensemble 1"
  item_add 40,"String ensemble 2"
  item_add 40,"Synth. strings 1"
  item_add 40,"Synth. strings 2"
  item_add 40,"Choir Aahs"
  item_add 40,"Voice Oohs"
  item_add 40,"Synth voice"
  item_add 40,"Orchestra hit"
  item_add 40,"Trumpet"
  item_add 40,"Trombone"
  item_add 40,"Tuba#966"
  item_add 40,"Muted trumpet"
  item_add 40,"French horn"
  item_add 40,"Brass section"
  item_add 40,"Synth. brass 1"
  item_add 40,"Synth. brass 2"
  item_add 40,"Soprano sax"
  item_add 40,"Alto sax"
  item_add 40,"Tenor sax"
  item_add 40,"Baritone sax"
  item_add 40,"Oboe"
  item_add 40,"English horn"
  item_add 40,"Bassoon"
  item_add 40,"Clarinet"
  item_add 40,"Piccolo"
  item_add 40,"Flute"
  item_add 40,"Recorder"
  item_add 40,"Pan flute"
  item_add 40,"Bottle blow"
  item_add 40,"Shakuhachi"
  item_add 40,"Whistle"
  item_add 40,"Ocarina"
  item_add 40,"Lead 1 (square)"
  item_add 40,"Lead 2 (sawtooth)"
  item_add 40,"Lead 3 (calliope lead)"
  item_add 40,"Lead 4 (chiff lead)"
  item_add 40,"Lead 5 (charang)"
  item_add 40,"Lead 6 (voice)"
  item_add 40,"Lead 7 (fifths)"
  item_add 40,"Lead 8 (brass + lead)"
  item_add 40,"Pad 1 (new age)"
  item_add 40,"Pad 2 (warm)"
  item_add 40,"Pad 3 (polysynth)"
  item_add 40,"Pad 4 (choir)"
  item_add 40,"Pad 5 (bowed)"
  item_add 40,"Pad 6 (metallic)"
  item_add 40,"Pad 7 (halo)"
  item_add 40,"Pad 8 (sweep)"
  item_add 40,"Synth SFX 1 Ice Rain"
  item_add 40,"Synth SFX 2 Sound Track"
  item_add 40,"Synth SFX 3 Crystal"
  item_add 40,"Synth SFX 4 Atmosphere"
  item_add 40,"Synth SFX 5 Brightness"
  item_add 40,"Synth SFX 6 Goblin"
  item_add 40,"Synth SFX 7 Echo Drops"
  item_add 40,"Synth SFX 8 Star Theme"
  item_add 40,"Sitar"
  item_add 40,"Banjo"
  item_add 40,"Shamisen"
  item_add 40,"Koto"
  item_add 40,"Kalimba"
  item_add 40,"Bagpipe"
  item_add 40,"Fiddle"
  item_add 40,"Shanai"
  item_add 40,"Tinkle Bells"
  item_add 40,"Agogo"
  item_add 40,"Steel Drums"
  item_add 40,"Woodblock"
  item_add 40,"Taiko Drum"
  item_add 40,"Melodic Drum"
  item_add 40,"Synth Drum"
  item_add 40,"Reverse Cymbal"
  item_add 40,"Guitar fret noise"
  item_add 40,"Breath noise"
  item_add 40,"Seashore"
  item_add 40,"Bird tweet"
  item_add 40,"Telephone ring"
  item_add 40,"Helicopter"
  item_add 40,"Applause"
  item_add 40,"Gunshot"
text 40,item_read$(40,1)
instrument1% = 0
instrument% = 1

alpha 41 : top 41,90 : left 41,left(40) : caption 41,"Volume:"
scroll_bar 42 : top 42,90 : left 42,left(41)+50 : width 42,150
  min 42,0 : max 42,127 : position 42,80 : on_change 42,changevolume
alpha 43: top 43,90 : left 43,left(42)+width(42)+10 : caption 43,"80"

trame()

end

changevolume:
  caption 43,str$(position(42))
  return

clickPiano:
  x% = mouse_x_left_down(2)
  y% = mouse_y_left_down(2)
  cr% = color_pixel_red(2,x%,y%)
  cv% = color_pixel_green(2,x%,y%)
  cb% = color_pixel_blue(2,x%,y%)

  if item_index(40)>0 then instrument% = item_index(40) 
  if cr%=255            : ' c'est une blanche ?
    note1% = 255 - cb%
    octave% = 255 - cv%
    nomOctave$ = mid$(tabOctave$,octave%,1)
    delta% = (octave%-5)*12
    note% = tabBlanches%(note1%) + delta%
    if instrument%<>instrument1%
      nomNote$ = "i"+str$(instrument%)+"+"+nomOctave$+nomBlanches$(note1%)
    else
      nomNote$ = "+"+nomOctave$+nomBlanches$(note1%)
    end_if
    nomNote$ = "["+nomNote$+str$(position(42))+"-]"
    caption 7, "blanche "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
    couleur% = 1
    hauteur% = 5*dline% - (note1%-1)*dline%/2
  else
    if cr%=0            : ' est-ce une noire ?
      note1% = cb%
      octave% = cv%
      nomOctave$ = mid$(tabOctave$,octave%,1)
      delta% = (octave%-5)*12
      if instrument%<>instrument1%
        nomNote$ = "i"+str$(instrument%)+"+"+nomOctave$+nomNoires$(note1%)
      else
        nomNote$ = "+"+nomOctave$+nomNoires$(note1%)
      end_if
      nomNote$ = "["+nomNote$ +str$(position(42))+"-]"
      note% = tabNoires%(note1%) + delta%
      caption 7, "noire "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$ 
      couleur% = 2             
      hauteur% = 5*dline% - (note1%-1)*dline%/2
      if note1%>2 then hauteur% = hauteur% - dline%/2
    end_if
  end_if
  instrument1% = instrument%
  mark_on 30+octave%
  set_focus 30+octave%
  display
 
  NombreCumulees% = NombreCumulees% + 1
  NotesCumulees%(NombreCumulees%)      = note%
  NomsCumulees$(NombreCumulees%)        = nomNote$
  OctavesCumulees%(NombreCumulees%)    = octave%
  Note1Cumulees%(NombreCumulees%)      = note1%
  NoteCouleurCumulees%(NombreCumulees%) = couleur%
  InstrumentsCumules%(NombreCumulees%)  = instrument%
 
  DessinerNote()
  adresse% = adresse% + 20
 
  return
 
exporter:
  if NombreCumulees%=0
    message "Il n'y a rien à exporter !"
    return
  end_if
  f$ = file_name$(6)
  if f$="_" then return
  if file_exists(f$)=1
    if message_confirmation_yes_no("Ce fichier existe déjà. Remplacer ?")<>1 then return
  end_if   
  clear 5
  for i%=1 to NombreCumulees%
    item_add 5,NomsCumulees$(i%)+"="+str$(NotesCumulees%(i%))
  next i%
  file_save 5,f$
  return
 
sub DessinerNote()
  dim_local a%
  a% = adresse%
  if NoteCouleurCumulees%(NombreCumulees%)=2
    print_locate a%-9,hligne%+hauteur%-7
    print "#"
    a% = a% + 5
    adresse% = adresse% + 3
  end_if
  2d_circle a%,hligne%+hauteur%,dline%/2
  if Note1Cumulees%(NombreCumulees%)=1
'    if NoteCouleurCumulees%(NombreCumulees%)=1
      2d_line a%-7,hligne%+hauteur%,a%+7,hligne%+hauteur%
'    end_if
  end_if
  print_locate a%-5,hligne%+60
  print mid$(tabOctave$,octave%,1)
 
  if adresse%>(width_client(1)-25)
    hligne% = hligne% + 100
    trame()
    adresse% = 20
  end_if

end_sub

sub trame()
  2d_line 0,hligne%,w%,hligne%
  2d_line 0,hligne%+dline%,w%,hligne%+dline%
  2d_line 0,hligne%+2*dline%,w%,hligne%+2*dline%
  2d_line 0,hligne%+3*dline%,w%,hligne%+3*dline%
  2d_line 0,hligne%+4*dline%,w%,hligne%+4*dline%

  ' séparateur de mesure
  2d_line 10,hligne%,10,hligne%+4*dline%
end_sub

sub DessinerOctave(id%,x%)
  2d_fill_color 255,255-id%,254
  2d_rectangle x%,0,x%+20,80
  2d_fill_color 255,255-id%,253
  2d_rectangle x%+20,0,x%+40,80
  2d_fill_color 255,255-id%,252
  2d_rectangle x%+40,0,x%+60,80
  2d_fill_color 255,255-id%,251
  2d_rectangle x%+60,0,x%+80,80
  2d_fill_color 255,255-id%,250
  2d_rectangle x%+80,0,x%+100,80
  2d_fill_color 255,255-id%,249
  2d_rectangle x%+100,0,x%+120,80
  2d_fill_color 255,255-id%,248
  2d_rectangle x%+120,0,x%+140,80
  2d_pen_color 0,id%,1
  2d_fill_color 0,id%,1
  2d_rectangle x%+12,0,x%+28,40
  2d_fill_color 0,id%,2
  2d_rectangle x%+32,0,x%+48,40
  2d_fill_color 0,id%,3
  2d_rectangle x%+72,0,x%+88,40
  2d_fill_color 0,id%,4
  2d_rectangle x%+92,0,x%+108,40
  2d_fill_color 0,id%,5
  2d_rectangle x%+112,0,x%+128,40
end_sub

Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

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

MessageSujet: Re: Maquette d'une rédaction de partition de piano   Dim 4 Fév 2018 - 18:01

Une nouvelle version, avec un bouton "Jouer" aui permet d'entendre la partition que l'on vient de rédiger. LE code de ce bouton est le seul endroit qui utilise une DKK (KGF.dll). Tout le reste est 100 % Panoramic.
Code:
' Redaction_Partition_Piano.bas

label clickPiano, exporter, changevolume, jouer, effacer

dim KGF$ : KGF$ = "KGF.dll"

dim w%, h%, dline%, x%, y%, cr%, cv%, cb%, note1%, note%, i%, nom$, notes$, res%
dim octave%, delta%, instrument%, instrument1%
dim couleur%, adresse%, hauteur%, dhauteur%, hligne%, f$
dim tabBlanches%(7), tabNoires%(5)
dim nomBlanches$(7), nomNoires$(5)
dim tabOctave$, nomOctave$, nomNote$
dim NotesCumulees%(100), NomsCumulees$(100), OctavesCumulees%(100)
dim Note1Cumulees%(100), NoteCouleurCumulees%(100), NombreCumulees%
dim InstrumentsCumules%(100)

data "do",60,"re",62,"mi",64,"fa",65,"sol",67,"la",69,"si",71  : ' notes blanches
data "do#",61,"re#",63,"fa#",66,"sol#",68,"la#",70              : ' notes noires
tabOctave$ = "dcba0123"

for i%=1 to 7
  read nomBlanches$(i%)
  read tabBlanches%(i%)
next i%
for i%=1 to 5
  read nomNoires$(i%)
  read tabNoires%(i%)
next i%

NombreCumulees% = 0
octave% = 5
delta% = 0
adresse% = 20
hauteur% = 5*dline%
hligne% = 100

full_space 0


picture 1 : top 1,140 : width 1,width_client(0) : height 1,height_client(0)-40
w% = width_client(1)
dline% = 10

picture 2 : width 2,1020 : height 2,80
2d_target_is 2
2d_pen_color 1,0,0
DessinerOctave(1,-100)
DessinerOctave(2,40)
DessinerOctave(3,180)
DessinerOctave(4,320)
DessinerOctave(5,460)
DessinerOctave(6,600)
DessinerOctave(7,740)
DessinerOctave(8,880)



on_click 2,clickPiano

container_option 3 : top 3,10 : width 3,130 : height 3,40 : left 3,width(2)+10
  caption 3,"Octaves"
option 31 : parent 31,3 : top 31,15 : left 31,5 :  width 31,20
option 32 : parent 32,3 : top 32,15 : left 32,20 : width 32,20
option 33 : parent 33,3 : top 33,15 : left 33,35 : width 33,20
option 34 : parent 34,3 : top 34,15 : left 34,50 : width 34,20
option 35 : parent 35,3 : top 35,15 : left 35,65 : width 35,20
option 36 : parent 36,3 : top 36,15 : left 36,80 : width 36,20
option 37 : parent 37,3 : top 37,15 : left 37,95 : width 37,20
option 38 : parent 38,3 : top 38,15 : left 38,110 : width 38,15
mark_on 30+octave%
set_focus 30+octave%

2d_target_is 1
2d_fill_off
print_target_is 1
font_size 1,8

button 4 : top 4,90 : left 4,320 : caption 4,"Exporter" : on_click 4,exporter
button 11 : top 11,90 : left 11,left(4)+width(4) : caption 11,"Effacer" : on_click 11,Effacer
dlist 5
save_dialog 6 : filter 6,"Fichiers texte (*.TXT)|*.txt"
alpha 8 : top 8,110 : left 8,10 : caption 8,"Note jouée:"
alpha 7 : top 7,110 : left 7,80 : font_bold 7
button 9 : top 9,90 : left 9,520 : caption 9,"Jouer" : on_click 9,jouer

combo 40 : top 40,60 : left 40,width(2)+10 : width 40,150
  item_add 40,"Bright acoustic piano"
  item_add 40,"Electric grand piano"
  item_add 40,"Honky-tonk piano"
  item_add 40,"Rhodes piano"
  item_add 40,"Chorused piano"
  item_add 40,"Harpsichord"
  item_add 40,"Clavinet"
  item_add 40,"Celesta"
  item_add 40,"Glockenspiel"
  item_add 40,"Music box"
  item_add 40,"Vibraphone"
  item_add 40,"Marimba"
  item_add 40,"Xylophone"
  item_add 40,"Tubular bells"
  item_add 40,"Dulcimer"
  item_add 40,"Hammond organ"
  item_add 40,"Percussive organ"
  item_add 40,"Rock organ"
  item_add 40,"Church organ"
  item_add 40,"Reed organ"
  item_add 40,"Accordion"
  item_add 40,"Harmonica"
  item_add 40,"Tango accordion"
  item_add 40,"Acoustic guitar (nylon)"
  item_add 40,"Acoustic guitar (steel)"
  item_add 40,"Electric guitar (jazz)"
  item_add 40,"Electric guitar (clean)"
  item_add 40,"Electric guitar (muted)"
  item_add 40,"Overdriven guitar"
  item_add 40,"Distortion guitar"
  item_add 40,"Guitar harmonics"
  item_add 40,"Acoustic bass"
  item_add 40,"Electric bass (finger)"
  item_add 40,"Electric bass (pick)"
  item_add 40,"Fretless bass"
  item_add 40,"Slap bass 1"
  item_add 40,"Slap bass 2"
  item_add 40,"Synth bass 1"
  item_add 40,"Synth bass 2"
  item_add 40,"Violin"
  item_add 40,"Viola"
  item_add 40,"Cello"
  item_add 40,"Contrabass"
  item_add 40,"Tremolo strings"
  item_add 40,"Pizzicato strings"
  item_add 40,"Orchestral harp"
  item_add 40,"Timpani"
  item_add 40,"String ensemble 1"
  item_add 40,"String ensemble 2"
  item_add 40,"Synth. strings 1"
  item_add 40,"Synth. strings 2"
  item_add 40,"Choir Aahs"
  item_add 40,"Voice Oohs"
  item_add 40,"Synth voice"
  item_add 40,"Orchestra hit"
  item_add 40,"Trumpet"
  item_add 40,"Trombone"
  item_add 40,"Tuba#966"
  item_add 40,"Muted trumpet"
  item_add 40,"French horn"
  item_add 40,"Brass section"
  item_add 40,"Synth. brass 1"
  item_add 40,"Synth. brass 2"
  item_add 40,"Soprano sax"
  item_add 40,"Alto sax"
  item_add 40,"Tenor sax"
  item_add 40,"Baritone sax"
  item_add 40,"Oboe"
  item_add 40,"English horn"
  item_add 40,"Bassoon"
  item_add 40,"Clarinet"
  item_add 40,"Piccolo"
  item_add 40,"Flute"
  item_add 40,"Recorder"
  item_add 40,"Pan flute"
  item_add 40,"Bottle blow"
  item_add 40,"Shakuhachi"
  item_add 40,"Whistle"
  item_add 40,"Ocarina"
  item_add 40,"Lead 1 (square)"
  item_add 40,"Lead 2 (sawtooth)"
  item_add 40,"Lead 3 (calliope lead)"
  item_add 40,"Lead 4 (chiff lead)"
  item_add 40,"Lead 5 (charang)"
  item_add 40,"Lead 6 (voice)"
  item_add 40,"Lead 7 (fifths)"
  item_add 40,"Lead 8 (brass + lead)"
  item_add 40,"Pad 1 (new age)"
  item_add 40,"Pad 2 (warm)"
  item_add 40,"Pad 3 (polysynth)"
  item_add 40,"Pad 4 (choir)"
  item_add 40,"Pad 5 (bowed)"
  item_add 40,"Pad 6 (metallic)"
  item_add 40,"Pad 7 (halo)"
  item_add 40,"Pad 8 (sweep)"
  item_add 40,"Synth SFX 1 Ice Rain"
  item_add 40,"Synth SFX 2 Sound Track"
  item_add 40,"Synth SFX 3 Crystal"
  item_add 40,"Synth SFX 4 Atmosphere"
  item_add 40,"Synth SFX 5 Brightness"
  item_add 40,"Synth SFX 6 Goblin"
  item_add 40,"Synth SFX 7 Echo Drops"
  item_add 40,"Synth SFX 8 Star Theme"
  item_add 40,"Sitar"
  item_add 40,"Banjo"
  item_add 40,"Shamisen"
  item_add 40,"Koto"
  item_add 40,"Kalimba"
  item_add 40,"Bagpipe"
  item_add 40,"Fiddle"
  item_add 40,"Shanai"
  item_add 40,"Tinkle Bells"
  item_add 40,"Agogo"
  item_add 40,"Steel Drums"
  item_add 40,"Woodblock"
  item_add 40,"Taiko Drum"
  item_add 40,"Melodic Drum"
  item_add 40,"Synth Drum"
  item_add 40,"Reverse Cymbal"
  item_add 40,"Guitar fret noise"
  item_add 40,"Breath noise"
  item_add 40,"Seashore"
  item_add 40,"Bird tweet"
  item_add 40,"Telephone ring"
  item_add 40,"Helicopter"
  item_add 40,"Applause"
  item_add 40,"Gunshot"
text 40,item_read$(40,1)
instrument1% = 0
instrument% = 1

alpha 41 : top 41,90 : left 41,left(40) : caption 41,"Volume:"
scroll_bar 42 : top 42,90 : left 42,left(41)+50 : width 42,150
  min 42,0 : max 42,127 : position 42,80 : on_change 42,changevolume
alpha 43: top 43,90 : left 43,left(42)+width(42)+10 : caption 43,"80"

trame()

end

changevolume:
  caption 43,str$(position(42))
  return

clickPiano:
  x% = mouse_x_left_down(2)
  y% = mouse_y_left_down(2)
  cr% = color_pixel_red(2,x%,y%)
  cv% = color_pixel_green(2,x%,y%)
  cb% = color_pixel_blue(2,x%,y%)

  if item_index(40)>0 then instrument% = item_index(40) 
  if cr%=255            : ' c'est une blanche ?
    note1% = 255 - cb%
    octave% = 255 - cv%
    nomOctave$ = mid$(tabOctave$,octave%,1)
    delta% = (octave%-5)*12
    note% = tabBlanches%(note1%) + delta%
    if instrument%<>instrument1%
      nomNote$ = "i"+right$("00"+str$(instrument%),3)+"+"+nomOctave$+nomBlanches$(note1%)
    else
      nomNote$ = "+"+nomOctave$+nomBlanches$(note1%)
    end_if
    nomNote$ = "["+nomNote$+str$(position(42))+"-]"
    caption 7, "blanche "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
    couleur% = 1
    hauteur% = 5*dline% - (note1%-1)*dline%/2
  else
    if cr%=0            : ' est-ce une noire ?
      note1% = cb%
      octave% = cv%
      nomOctave$ = mid$(tabOctave$,octave%,1)
      delta% = (octave%-5)*12
      if instrument%<>instrument1%
        nomNote$ = "i"+right$("00"+str$(instrument%),3)+"+"+nomOctave$+nomNoires$(note1%)
      else
        nomNote$ = "+"+nomOctave$+nomNoires$(note1%)
      end_if
      nomNote$ = "["+nomNote$ +str$(position(42))+"-]"
      note% = tabNoires%(note1%) + delta%
      caption 7, "noire "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$ 
      couleur% = 2             
      hauteur% = 5*dline% - (note1%-1)*dline%/2
      if note1%>2 then hauteur% = hauteur% - dline%/2
    end_if
  end_if
  instrument1% = instrument%
  mark_on 30+octave%
  set_focus 30+octave%
  display
 
  NombreCumulees% = NombreCumulees% + 1
  NotesCumulees%(NombreCumulees%)      = note%
  NomsCumulees$(NombreCumulees%)        = nomNote$
  OctavesCumulees%(NombreCumulees%)    = octave%
  Note1Cumulees%(NombreCumulees%)      = note1%
  NoteCouleurCumulees%(NombreCumulees%) = couleur%
  InstrumentsCumules%(NombreCumulees%)  = instrument%
 
  DessinerNote()
  adresse% = adresse% + 20
 
  return
 
exporter:
  if NombreCumulees%=0
    message "Il n'y a rien à exporter !"
    return
  end_if
  f$ = file_name$(6)
  if f$="_" then return
  if file_exists(f$)=1
    if message_confirmation_yes_no("Ce fichier existe déjà. Remplacer ?")<>1 then return
  end_if   
  clear 5
  for i%=1 to NombreCumulees%
    item_add 5,NomsCumulees$(i%)+"="+str$(NotesCumulees%(i%))
  next i%
  file_save 5,f$
  return
 
effacer:
  NombreCumulees% = 0
  return
 
jouer:
  if NombreCumulees%=0
    message "Il n'y a rien à jouer !"
    return
  end_if
  dll_on KGF$
 
  res% = DLL_call0("MIDI_Initialize")
  res% = DLL_call1("MIDI_Reset",3)
  notes$ = ""
  for i%=1 to NombreCumulees%
    notes$ = notes$ + NomsCumulees$(i%) + " "
  next i%
  res% = DLL_call3("MIDI_Compile",1,0,adr(notes$))
  res% = DLL_call1("MIDI_Play",10)
  res% = DLL_call0("MIDI_Stop")
 
  dll_off
  return
 
sub DessinerNote()
  dim_local a%
  a% = adresse%
  if NoteCouleurCumulees%(NombreCumulees%)=2
    print_locate a%-9,hligne%+hauteur%-7
    print "#"
    a% = a% + 5
    adresse% = adresse% + 3
  end_if
  2d_circle a%,hligne%+hauteur%,dline%/2
  if Note1Cumulees%(NombreCumulees%)=1
'    if NoteCouleurCumulees%(NombreCumulees%)=1
      2d_line a%-7,hligne%+hauteur%,a%+7,hligne%+hauteur%
'    end_if
  end_if
  print_locate a%-5,hligne%+60
  print mid$(tabOctave$,octave%,1)
 
  if adresse%>(width_client(1)-25)
    hligne% = hligne% + 100
    trame()
    adresse% = 20
  end_if

end_sub

sub trame()
  2d_line 0,hligne%,w%,hligne%
  2d_line 0,hligne%+dline%,w%,hligne%+dline%
  2d_line 0,hligne%+2*dline%,w%,hligne%+2*dline%
  2d_line 0,hligne%+3*dline%,w%,hligne%+3*dline%
  2d_line 0,hligne%+4*dline%,w%,hligne%+4*dline%

  ' séparateur de mesure
  2d_line 10,hligne%,10,hligne%+4*dline%
end_sub

sub DessinerOctave(id%,x%)
  2d_fill_color 255,255-id%,254
  2d_rectangle x%,0,x%+20,80
  2d_fill_color 255,255-id%,253
  2d_rectangle x%+20,0,x%+40,80
  2d_fill_color 255,255-id%,252
  2d_rectangle x%+40,0,x%+60,80
  2d_fill_color 255,255-id%,251
  2d_rectangle x%+60,0,x%+80,80
  2d_fill_color 255,255-id%,250
  2d_rectangle x%+80,0,x%+100,80
  2d_fill_color 255,255-id%,249
  2d_rectangle x%+100,0,x%+120,80
  2d_fill_color 255,255-id%,248
  2d_rectangle x%+120,0,x%+140,80
  2d_pen_color 0,id%,1
  2d_fill_color 0,id%,1
  2d_rectangle x%+12,0,x%+28,40
  2d_fill_color 0,id%,2
  2d_rectangle x%+32,0,x%+48,40
  2d_fill_color 0,id%,3
  2d_rectangle x%+72,0,x%+88,40
  2d_fill_color 0,id%,4
  2d_rectangle x%+92,0,x%+108,40
  2d_fill_color 0,id%,5
  2d_rectangle x%+112,0,x%+128,40
end_sub

J'espère que ça vous amusera...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
mindstorm

avatar

Nombre de messages : 559
Age : 49
Localisation : charente
Date d'inscription : 13/02/2013

MessageSujet: Re: Maquette d'une rédaction de partition de piano   Lun 5 Fév 2018 - 18:06

Bonsoir a tous
bravo Karl
malheureusement je ne dois pas avoir la bonne version de panoramic!
les width_client ne plaisent pas a mon editeur.
je vais tenter de faire la modif pour moi ( c'est un coefficient propre a chaque écran il me semble )
une petite question car je n'ai pas pu tester par moi même.
As tu la transposition automatique de la partition pour les instruments qui en ont besoin?
La transposition est la capacité de certains instrument de jouer naturellement dans une autre tonalité ( plus haut ou plus bas)
quand tu fait un do en clarinette tu joue au piano un Sib pour avoir la même note
quand tu fait une do en saxophone tu joue au piano un Mib pour avoir la même
tu peux aussi faire une transposition volontaire pour accompagner quelqu'un qui chante ...
il se trouve que je commence a travailler sur ce sujet pour mon prochain programme.
Malheureusement je ne suis pas du tout aussi rapide que toi No
merci pour ton partage
il vas falloir que je trouve du temps scratch
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Maquette d'une rédaction de partition de piano   Lun 5 Fév 2018 - 18:13

La transposition automatique - oui, ça pourrait se faire. Mais dans ce projet, je suis pas dans l'optique de rédiger une partition pour un instrument particulier. Juste pour le système MIDI de Windows. Et là, quelque soit l'instrument, on do est toujours un do, avec la même fréquence. Seules changent les hamoniques, l'attaque et l'expiration, etc.

Pour le moment, je travaille sur une version plus évolué, permettant de rédiger plusieurs canaux simultanément et de façon synchrone, pour un effet de polyphonie.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
mindstorm

avatar

Nombre de messages : 559
Age : 49
Localisation : charente
Date d'inscription : 13/02/2013

MessageSujet: Re: Maquette d'une rédaction de partition de piano   Lun 5 Fév 2018 - 20:29

tu as vraiment un super projet
bravo encore une fois.
Dans le coup je vais t'emprunter ton programme pour faire ma partie.
Je n'ai pas de clavier et la clarinette comme le saxophone ne peuvent pas jouer d'accords donc pas de polyphonie si l'on joue seul.
Par contre ils sont transpositeur et quand on joue un Do la note entendu est différente "en Hertz"
C'est un truc bizarre sensé faciliter le jeu si l'on change d'instrument ( tous ont le même doigté mais pas la même hauteur de sonorité)
Malheureusement cela impose de réécrire toutes les partitions pour jouer en groupe.
La manœuvre est très simple, mais écrire le programme me permet de formaliser tous les aspects de la chose.
Accessoirement il me fera gagner du temps par la suite.
Tous cela pour te dire merci
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Maquette d'une rédaction de partition de piano   Lun 5 Fév 2018 - 21:01

J'entends bien, Mindstorm ! Dans la foulée des modifications pour la version plyphonique, je pense pouvoir intégrer un delta de transposition paramétrable pour chaque instrument (0 étant le défaut).
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

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

MessageSujet: Re: Maquette d'une rédaction de partition de piano   Lun 5 Fév 2018 - 22:43

Voici un premier jet d'une version polyphone.

Le programme trace autant de portées sur une page blanche qu'elle peut contenir (chez moi, 6 portées). Chaque portée correspond à un canal. A gauche, il y a des cases OPTION qui permettent de choisir le canal (défaut: premier canal).

On choisit alors son instrument, son volume, puis on compose les notes du canal actuellement choisi.

On peut changer ce canal en cliquant simplement sur l'option correspondante à gauche. On vérifie si l'instrument et le volule correspondent, et on les change le cas échént. Puis on compose les notes de ce canal.

En sélectionnant un canal contenant déjà des notes, son dernier instrument et son dernier volume s'affiche automatiquement.

On peut effacer toute la partition par le bouton "Effacer".

On peut exporter toute la partition par le bouton "Exporter".

On peut jouer toute la partition par le bouton "Jouer" ==> polyphonie !

Code:
' Composeur_de_Partition.bas

label clickPiano, exporter, changevolume, jouer, effacer, changecanal

dim KGF$ : KGF$ = "KGF.dll"

dim w%, h%, dline%, x%, y%, cr%, cv%, cb%, note1%, note%, i%, j%, nom$, notes$
dim res%, no%, temp%
dim octave%, delta%, instrument%, instrument1%, canal%
dim couleur%, hauteur%, dhauteur%, hligne%, f$
dim tabBlanches%(7), tabNoires%(5)
dim nomBlanches$(7), nomNoires$(5)
dim tabOctave$, nomOctave$, nomNote$
dim NombreCanaux%, CanalActuel%, VolumeDefaut%

data "do",60,"re",62,"mi",64,"fa",65,"sol",67,"la",69,"si",71   : ' notes blanches
data "do#",61,"re#",63,"fa#",66,"sol#",68,"la#",70              : ' notes noires
tabOctave$ = "dcba0123"
VolumeDefaut% = 80

for i%=1 to 7
  read nomBlanches$(i%)
  read tabBlanches%(i%)
next i%
for i%=1 to 5
  read nomNoires$(i%)
  read tabNoires%(i%)
next i%

octave% = 5
delta% = 0
hauteur% = 5*dline%
hligne% = 20

full_space 0


picture 1 : top 1,140 : left 1,30
  width 1,width_client(0)-30 : height 1,height_client(0)-140
w% = width_client(1)
dline% = 10

picture 2 : width 2,1020 : height 2,80
2d_target_is 2
2d_pen_color 1,0,0
DessinerOctave(1,-100)
DessinerOctave(2,40)
DessinerOctave(3,180)
DessinerOctave(4,320)
DessinerOctave(5,460)
DessinerOctave(6,600)
DessinerOctave(7,740)
DessinerOctave(8,880)

container_option 100 : top 100,135 : left 100,0 : width 100,35 : height 100,height(1)+5
  i% = 40
  no% = 100
  while i%<height_client(1)
    no% = no% + 1
    option no% : parent no%,100 : top no%,i% : left no%,10 : width no%,20 : on_click no%,changecanal
    i% = i% + 100
  end_while
  NombreCanaux% = no% - 100
dim NotesCumulees%(NombreCanaux%,100), NomsCumulees$(NombreCanaux%,100)
dim OctavesCumulees%(NombreCanaux%,100), Note1Cumulees%(NombreCanaux%,100)
dim NoteCouleurCumulees%(NombreCanaux%,100), NombreCumulees%(NombreCanaux%)
dim InstrumentsCumules%(NombreCanaux%,100), adresse%(NombreCanaux%)
dim CanalPlein%(NombreCanaux%), VolumesCumules%(NombreCanaux%,100)
for i%=1 to NombreCanaux%
  NombreCumulees%(i%) = 0
  CanalPlein%(i%) = 0
  Adresse%(i%) = 20
  InstrumentsCumules%(i%,0) = 1
  VolumesCumules%(i%,0) = VolumeDefaut%
next i%

on_click 2,clickPiano

container_option 3 : top 3,10 : width 3,130 : height 3,40 : left 3,width(2)+10
  caption 3,"Octaves"
option 31 : parent 31,3 : top 31,15 : left 31,5 :  width 31,20
option 32 : parent 32,3 : top 32,15 : left 32,20 : width 32,20
option 33 : parent 33,3 : top 33,15 : left 33,35 : width 33,20
option 34 : parent 34,3 : top 34,15 : left 34,50 : width 34,20
option 35 : parent 35,3 : top 35,15 : left 35,65 : width 35,20
option 36 : parent 36,3 : top 36,15 : left 36,80 : width 36,20
option 37 : parent 37,3 : top 37,15 : left 37,95 : width 37,20
option 38 : parent 38,3 : top 38,15 : left 38,110 : width 38,15
mark_on 30+octave%
set_focus 30+octave%

2d_target_is 1
2d_fill_off
print_target_is 1
font_size 1,8

button 4 : top 4,90 : left 4,320 : caption 4,"Exporter" : on_click 4,exporter
button 11 : top 11,90 : left 11,left(4)+width(4) : caption 11,"Effacer" : on_click 11,Effacer
dlist 5
save_dialog 6 : filter 6,"Fichiers texte (*.TXT)|*.txt"
alpha 8 : top 8,110 : left 8,10 : caption 8,"Note jouée:"
alpha 7 : top 7,110 : left 7,80 : font_bold 7
button 9 : top 9,90 : left 9,520 : caption 9,"Jouer" : on_click 9,jouer

combo 40 : top 40,60 : left 40,width(2)+10 : width 40,150
  item_add 40,"Bright acoustic piano"
  item_add 40,"Electric grand piano"
  item_add 40,"Honky-tonk piano"
  item_add 40,"Rhodes piano"
  item_add 40,"Chorused piano"
  item_add 40,"Harpsichord"
  item_add 40,"Clavinet"
  item_add 40,"Celesta"
  item_add 40,"Glockenspiel"
  item_add 40,"Music box"
  item_add 40,"Vibraphone"
  item_add 40,"Marimba"
  item_add 40,"Xylophone"
  item_add 40,"Tubular bells"
  item_add 40,"Dulcimer"
  item_add 40,"Hammond organ"
  item_add 40,"Percussive organ"
  item_add 40,"Rock organ"
  item_add 40,"Church organ"
  item_add 40,"Reed organ"
  item_add 40,"Accordion"
  item_add 40,"Harmonica"
  item_add 40,"Tango accordion"
  item_add 40,"Acoustic guitar (nylon)"
  item_add 40,"Acoustic guitar (steel)"
  item_add 40,"Electric guitar (jazz)"
  item_add 40,"Electric guitar (clean)"
  item_add 40,"Electric guitar (muted)"
  item_add 40,"Overdriven guitar"
  item_add 40,"Distortion guitar"
  item_add 40,"Guitar harmonics"
  item_add 40,"Acoustic bass"
  item_add 40,"Electric bass (finger)"
  item_add 40,"Electric bass (pick)"
  item_add 40,"Fretless bass"
  item_add 40,"Slap bass 1"
  item_add 40,"Slap bass 2"
  item_add 40,"Synth bass 1"
  item_add 40,"Synth bass 2"
  item_add 40,"Violin"
  item_add 40,"Viola"
  item_add 40,"Cello"
  item_add 40,"Contrabass"
  item_add 40,"Tremolo strings"
  item_add 40,"Pizzicato strings"
  item_add 40,"Orchestral harp"
  item_add 40,"Timpani"
  item_add 40,"String ensemble 1"
  item_add 40,"String ensemble 2"
  item_add 40,"Synth. strings 1"
  item_add 40,"Synth. strings 2"
  item_add 40,"Choir Aahs"
  item_add 40,"Voice Oohs"
  item_add 40,"Synth voice"
  item_add 40,"Orchestra hit"
  item_add 40,"Trumpet"
  item_add 40,"Trombone"
  item_add 40,"Tuba#966"
  item_add 40,"Muted trumpet"
  item_add 40,"French horn"
  item_add 40,"Brass section"
  item_add 40,"Synth. brass 1"
  item_add 40,"Synth. brass 2"
  item_add 40,"Soprano sax"
  item_add 40,"Alto sax"
  item_add 40,"Tenor sax"
  item_add 40,"Baritone sax"
  item_add 40,"Oboe"
  item_add 40,"English horn"
  item_add 40,"Bassoon"
  item_add 40,"Clarinet"
  item_add 40,"Piccolo"
  item_add 40,"Flute"
  item_add 40,"Recorder"
  item_add 40,"Pan flute"
  item_add 40,"Bottle blow"
  item_add 40,"Shakuhachi"
  item_add 40,"Whistle"
  item_add 40,"Ocarina"
  item_add 40,"Lead 1 (square)"
  item_add 40,"Lead 2 (sawtooth)"
  item_add 40,"Lead 3 (calliope lead)"
  item_add 40,"Lead 4 (chiff lead)"
  item_add 40,"Lead 5 (charang)"
  item_add 40,"Lead 6 (voice)"
  item_add 40,"Lead 7 (fifths)"
  item_add 40,"Lead 8 (brass + lead)"
  item_add 40,"Pad 1 (new age)"
  item_add 40,"Pad 2 (warm)"
  item_add 40,"Pad 3 (polysynth)"
  item_add 40,"Pad 4 (choir)"
  item_add 40,"Pad 5 (bowed)"
  item_add 40,"Pad 6 (metallic)"
  item_add 40,"Pad 7 (halo)"
  item_add 40,"Pad 8 (sweep)"
  item_add 40,"Synth SFX 1 Ice Rain"
  item_add 40,"Synth SFX 2 Sound Track"
  item_add 40,"Synth SFX 3 Crystal"
  item_add 40,"Synth SFX 4 Atmosphere"
  item_add 40,"Synth SFX 5 Brightness"
  item_add 40,"Synth SFX 6 Goblin"
  item_add 40,"Synth SFX 7 Echo Drops"
  item_add 40,"Synth SFX 8 Star Theme"
  item_add 40,"Sitar"
  item_add 40,"Banjo"
  item_add 40,"Shamisen"
  item_add 40,"Koto"
  item_add 40,"Kalimba"
  item_add 40,"Bagpipe"
  item_add 40,"Fiddle"
  item_add 40,"Shanai"
  item_add 40,"Tinkle Bells"
  item_add 40,"Agogo"
  item_add 40,"Steel Drums"
  item_add 40,"Woodblock"
  item_add 40,"Taiko Drum"
  item_add 40,"Melodic Drum"
  item_add 40,"Synth Drum"
  item_add 40,"Reverse Cymbal"
  item_add 40,"Guitar fret noise"
  item_add 40,"Breath noise"
  item_add 40,"Seashore"
  item_add 40,"Bird tweet"
  item_add 40,"Telephone ring"
  item_add 40,"Helicopter"
  item_add 40,"Applause"
  item_add 40,"Gunshot"
text 40,item_read$(40,1)
instrument1% = 0
instrument% = 1

alpha 41 : top 41,90 : left 41,left(40) : caption 41,"Volume:"
scroll_bar 42 : top 42,90 : left 42,left(41)+50 : width 42,150
  min 42,0 : max 42,127 : position 42,VolumeDefaut% : on_change 42,changevolume
alpha 43: top 43,90 : left 43,left(42)+width(42)+10 : caption 43,"80"

  CanalActuel% = 1
  mark_on 100+CanalActuel%

trame()

end

changevolume:
  caption 43,str$(position(42))
  VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%)) = position(42)
  return

clickPiano:
  if CanalPlein%(CanalActuel%)=1 then return
  
  x% = mouse_x_left_down(2)
  y% = mouse_y_left_down(2)
  cr% = color_pixel_red(2,x%,y%)
  cv% = color_pixel_green(2,x%,y%)
  cb% = color_pixel_blue(2,x%,y%)

  if item_index(40)>0 then instrument% = item_index(40)  
  if cr%=255             : ' c'est une blanche ?
    note1% = 255 - cb%
    octave% = 255 - cv%
    nomOctave$ = mid$(tabOctave$,octave%,1)
    delta% = (octave%-5)*12
    note% = tabBlanches%(note1%) + delta%
    if instrument%<>instrument1%
      nomNote$ = "i"+right$("00"+str$(instrument%),3)+"+"+nomOctave$+nomBlanches$(note1%)
    else
      nomNote$ = "+"+nomOctave$+nomBlanches$(note1%)
    end_if
    nomNote$ = "["+nomNote$+str$(position(42))+"-]"
    caption 7, "blanche "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
    couleur% = 1
    hauteur% = 5*dline% - (note1%-1)*dline%/2
  else
    if cr%=0             : ' est-ce une noire ?
      note1% = cb%
      octave% = cv%
      nomOctave$ = mid$(tabOctave$,octave%,1)
      delta% = (octave%-5)*12
      if instrument%<>instrument1%
        nomNote$ = "i"+right$("00"+str$(instrument%),3)+"+"+nomOctave$+nomNoires$(note1%)
      else
        nomNote$ = "+"+nomOctave$+nomNoires$(note1%)
      end_if
      nomNote$ = "["+nomNote$ +str$(position(42))+"-]"
      note% = tabNoires%(note1%) + delta%
      caption 7, "noire "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$  
      couleur% = 2              
      hauteur% = 5*dline% - (note1%-1)*dline%/2
      if note1%>2 then hauteur% = hauteur% - dline%/2
    end_if
  end_if
  instrument1% = instrument%
  mark_on 30+octave%
  set_focus 30+octave%
  display
  
  NombreCumulees%(CanalActuel%) = NombreCumulees%(CanalActuel%) + 1
  NotesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))       = note%
  NomsCumulees$(CanalActuel%,NombreCumulees%(CanalActuel%))        = nomNote$
  OctavesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))     = octave%
  Note1Cumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))       = note1%
  NoteCouleurCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%)) = couleur%
  InstrumentsCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))  = instrument%
  VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))      = position(42)
  
  DessinerNote()
  adresse%(CanalActuel%) = adresse%(CanalActuel%) + 20
  
  return
  
exporter:
  temp% = 0
  for i%=1 to NombreCanaux%
    if NombreCumulees%(i%)>0 then temp% = 1
  next i%
  if temp%=0
    message "Il n'y a rien à exporter !"
    return
  end_if
  f$ = file_name$(6)
  if f$="_" then return
  if file_exists(f$)=1
    if message_confirmation_yes_no("Ce fichier existe déjà. Remplacer ?")<>1 then return
  end_if    
  clear 5
  for j%=1 to NombreCanaux%
    item_add 5,"Canal "+str$(j%)
    if NombreCumulees%(j%)>0
      for i%=1 to NombreCumulees%(j%)
        item_add 5,NomsCumulees$(j%,i%)+"="+str$(NotesCumulees%(j%,i%))
      next i%
    end_if
  next j%
  file_save 5,f$
  return
  
effacer:
  color 1,255,255,255
  CanalActuel% = 1
  mark_on 100+CanalActuel%
  set_focus 100+CanalActuel%
  for i%=1 to NombreCanaux%
    NombreCumulees%(i%) = 0
    CanalPlein%(i%) = 0
    Adresse%(i%) = 20
    InstrumentsCumules%(i%,0) = 1
    VolumesCumules%(i%,0) = VolumeDefaut%
  next i%
  position 42,VolumeDefaut%
  trame()
  return
  
jouer:
  temp% = 0
  for i%=1 to NombreCanaux%
    if NombreCumulees%(i%)>0 then temp% = 1
  next i%
  if temp%=0
    message "Il n'y a rien à exporter !"
    return
  end_if
  dll_on KGF$
  
  res% = DLL_call0("MIDI_Initialize")
  res% = DLL_call1("MIDI_Reset",NombreCanaux%)
  for j%=1 to NombreCanaux%
    notes$ = ""
    for i%=1 to NombreCumulees%(j%)
      notes$ = notes$ + NomsCumulees$(j%,i%) + " "
    next i%
    res% = DLL_call3("MIDI_Compile",j%,0,adr(notes$))
  next j%
  res% = DLL_call1("MIDI_Play",10)
  res% = DLL_call0("MIDI_Stop")
  
  dll_off
  return
  
changecanal:
  CanalActuel% = number_click - 100
  set_focus 100+CanalActuel%
  text 40,item_read$(40,InstrumentsCumules%(CanalActuel%,NombreCumulees%(CanalActuel%)))
  position 42,VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))
  return
  
sub DessinerNote()
  dim_local a%, hligne%
  a% = adresse%(CanalActuel%)
  hligne% = 20 + (CanalActuel%-1)*100
  if NoteCouleurCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))=2
    print_locate a%-9,hligne%+hauteur%-7
    print "#"
    a% = a% + 5
    adresse%(CanalActuel%) = adresse%(CanalActuel%) + 3
  end_if
  2d_circle a%,hligne%+hauteur%,dline%/2
  if Note1Cumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))=1
'    if NoteCouleurCumulees%(NombreCumulees%)=1
      2d_line a%-7,hligne%+hauteur%,a%+7,hligne%+hauteur%
'    end_if
  end_if
  print_locate a%-5,hligne%+57
  print mid$(tabOctave$,octave%,1)
  
  if adresse%(CanalActuel%)>(width_client(1)-25) then CanalPlein%(CanalActuel%) = 1

end_sub

sub trame()
  ' v% donne le numéro de la trame dans la page (1=première ligne)
  dim_local hligne%, v%
  v% = 0
  hligne% = 0
  for v%=1 to NombreCanaux%
    hligne% = 20 + (v%-1)*100
    2d_line 0,hligne%,w%,hligne%
    2d_line 0,hligne%+dline%,w%,hligne%+dline%
    2d_line 0,hligne%+2*dline%,w%,hligne%+2*dline%
    2d_line 0,hligne%+3*dline%,w%,hligne%+3*dline%
    2d_line 0,hligne%+4*dline%,w%,hligne%+4*dline%

    ' séparateur de mesure
    2d_line 10,hligne%,10,hligne%+4*dline%
  next v%
end_sub

sub DessinerOctave(id%,x%)
  2d_fill_color 255,255-id%,254
  2d_rectangle x%,0,x%+20,80
  2d_fill_color 255,255-id%,253
  2d_rectangle x%+20,0,x%+40,80
  2d_fill_color 255,255-id%,252
  2d_rectangle x%+40,0,x%+60,80
  2d_fill_color 255,255-id%,251
  2d_rectangle x%+60,0,x%+80,80
  2d_fill_color 255,255-id%,250
  2d_rectangle x%+80,0,x%+100,80
  2d_fill_color 255,255-id%,249
  2d_rectangle x%+100,0,x%+120,80
  2d_fill_color 255,255-id%,248
  2d_rectangle x%+120,0,x%+140,80
  2d_pen_color 0,id%,1
  2d_fill_color 0,id%,1
  2d_rectangle x%+12,0,x%+28,40
  2d_fill_color 0,id%,2
  2d_rectangle x%+32,0,x%+48,40
  2d_fill_color 0,id%,3
  2d_rectangle x%+72,0,x%+88,40
  2d_fill_color 0,id%,4
  2d_rectangle x%+92,0,x%+108,40
  2d_fill_color 0,id%,5
  2d_rectangle x%+112,0,x%+128,40
end_sub


Ce qui manque:
- des pauses (en cours)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

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

MessageSujet: Re: Maquette d'une rédaction de partition de piano   Mar 6 Fév 2018 - 0:02

Version polyphonie avec une touche "Pause":
Code:
' Composeur_de_Partition.bas

label clickPiano, exporter, changevolume, jouer, effacer, changecanal, PianoPause

dim KGF$ : KGF$ = "KGF.dll"

dim w%, h%, dline%, x%, y%, cr%, cv%, cb%, note1%, note%, i%, j%, nom$, notes$
dim res%, no%, temp%
dim octave%, delta%, instrument%, instrument1%, canal%
dim couleur%, hauteur%, dhauteur%, hligne%, f$
dim tabBlanches%(7), tabNoires%(5)
dim nomBlanches$(7), nomNoires$(5)
dim tabOctave$, nomOctave$, nomNote$
dim NombreCanaux%, CanalActuel%, VolumeDefaut%

data "do",60,"re",62,"mi",64,"fa",65,"sol",67,"la",69,"si",71  : ' notes blanches
data "do#",61,"re#",63,"fa#",66,"sol#",68,"la#",70              : ' notes noires
tabOctave$ = "dcba0123"
VolumeDefaut% = 80

for i%=1 to 7
  read nomBlanches$(i%)
  read tabBlanches%(i%)
next i%
for i%=1 to 5
  read nomNoires$(i%)
  read tabNoires%(i%)
next i%

octave% = 5
delta% = 0
hauteur% = 5*dline%
hligne% = 20

full_space 0


picture 1 : top 1,140 : left 1,30
  width 1,width_client(0)-30 : height 1,height_client(0)-140
w% = width_client(1)
dline% = 10

picture 2 : width 2,1020 : height 2,80
2d_target_is 2
2d_pen_color 1,0,0
DessinerOctave(1,-100)
DessinerOctave(2,40)
DessinerOctave(3,180)
DessinerOctave(4,320)
DessinerOctave(5,460)
DessinerOctave(6,600)
DessinerOctave(7,740)
DessinerOctave(8,880)

container_option 100 : top 100,135 : left 100,0 : width 100,35 : height 100,height(1)+5
  i% = 40
  no% = 100
  while i%<height_client(1)
    no% = no% + 1
    option no% : parent no%,100 : top no%,i% : left no%,10 : width no%,20 : on_click no%,changecanal
    i% = i% + 100
  end_while
  NombreCanaux% = no% - 100
dim NotesCumulees%(NombreCanaux%,100), NomsCumulees$(NombreCanaux%,100)
dim OctavesCumulees%(NombreCanaux%,100), Note1Cumulees%(NombreCanaux%,100)
dim NoteCouleurCumulees%(NombreCanaux%,100), NombreCumulees%(NombreCanaux%)
dim InstrumentsCumules%(NombreCanaux%,100), adresse%(NombreCanaux%)
dim CanalPlein%(NombreCanaux%), VolumesCumules%(NombreCanaux%,100)
for i%=1 to NombreCanaux%
  NombreCumulees%(i%) = 0
  CanalPlein%(i%) = 0
  Adresse%(i%) = 20
  InstrumentsCumules%(i%,0) = 1
  VolumesCumules%(i%,0) = VolumeDefaut%
next i%

on_click 2,clickPiano

container_option 3 : top 3,10 : width 3,130 : height 3,40 : left 3,width(2)+10
  caption 3,"Octaves"
option 31 : parent 31,3 : top 31,15 : left 31,5 :  width 31,20
option 32 : parent 32,3 : top 32,15 : left 32,20 : width 32,20
option 33 : parent 33,3 : top 33,15 : left 33,35 : width 33,20
option 34 : parent 34,3 : top 34,15 : left 34,50 : width 34,20
option 35 : parent 35,3 : top 35,15 : left 35,65 : width 35,20
option 36 : parent 36,3 : top 36,15 : left 36,80 : width 36,20
option 37 : parent 37,3 : top 37,15 : left 37,95 : width 37,20
option 38 : parent 38,3 : top 38,15 : left 38,110 : width 38,15
mark_on 30+octave%
set_focus 30+octave%

2d_target_is 1
2d_fill_off
print_target_is 1
font_size 1,8

button 4 : top 4,100 : left 4,320 : caption 4,"Exporter" : on_click 4,exporter
button 11 : top 11,100 : left 11,left(4)+width(4) : caption 11,"Effacer" : on_click 11,Effacer
dlist 5
save_dialog 6 : filter 6,"Fichiers texte (*.TXT)|*.txt"
alpha 8 : top 8,110 : left 8,10 : caption 8,"Note jouée:"
alpha 7 : top 7,110 : left 7,80 : font_bold 7
button 9 : top 9,100 : left 9,520 : caption 9,"Jouer" : on_click 9,jouer
button 12 : top 12,top(2)+height(2) : left 12,0 : width 12,width(2) : height 12,15 : caption 12,"Pause" : on_click 12,PianoPause

combo 40 : top 40,60 : left 40,width(2)+10 : width 40,150
  item_add 40,"Bright acoustic piano"
  item_add 40,"Electric grand piano"
  item_add 40,"Honky-tonk piano"
  item_add 40,"Rhodes piano"
  item_add 40,"Chorused piano"
  item_add 40,"Harpsichord"
  item_add 40,"Clavinet"
  item_add 40,"Celesta"
  item_add 40,"Glockenspiel"
  item_add 40,"Music box"
  item_add 40,"Vibraphone"
  item_add 40,"Marimba"
  item_add 40,"Xylophone"
  item_add 40,"Tubular bells"
  item_add 40,"Dulcimer"
  item_add 40,"Hammond organ"
  item_add 40,"Percussive organ"
  item_add 40,"Rock organ"
  item_add 40,"Church organ"
  item_add 40,"Reed organ"
  item_add 40,"Accordion"
  item_add 40,"Harmonica"
  item_add 40,"Tango accordion"
  item_add 40,"Acoustic guitar (nylon)"
  item_add 40,"Acoustic guitar (steel)"
  item_add 40,"Electric guitar (jazz)"
  item_add 40,"Electric guitar (clean)"
  item_add 40,"Electric guitar (muted)"
  item_add 40,"Overdriven guitar"
  item_add 40,"Distortion guitar"
  item_add 40,"Guitar harmonics"
  item_add 40,"Acoustic bass"
  item_add 40,"Electric bass (finger)"
  item_add 40,"Electric bass (pick)"
  item_add 40,"Fretless bass"
  item_add 40,"Slap bass 1"
  item_add 40,"Slap bass 2"
  item_add 40,"Synth bass 1"
  item_add 40,"Synth bass 2"
  item_add 40,"Violin"
  item_add 40,"Viola"
  item_add 40,"Cello"
  item_add 40,"Contrabass"
  item_add 40,"Tremolo strings"
  item_add 40,"Pizzicato strings"
  item_add 40,"Orchestral harp"
  item_add 40,"Timpani"
  item_add 40,"String ensemble 1"
  item_add 40,"String ensemble 2"
  item_add 40,"Synth. strings 1"
  item_add 40,"Synth. strings 2"
  item_add 40,"Choir Aahs"
  item_add 40,"Voice Oohs"
  item_add 40,"Synth voice"
  item_add 40,"Orchestra hit"
  item_add 40,"Trumpet"
  item_add 40,"Trombone"
  item_add 40,"Tuba#966"
  item_add 40,"Muted trumpet"
  item_add 40,"French horn"
  item_add 40,"Brass section"
  item_add 40,"Synth. brass 1"
  item_add 40,"Synth. brass 2"
  item_add 40,"Soprano sax"
  item_add 40,"Alto sax"
  item_add 40,"Tenor sax"
  item_add 40,"Baritone sax"
  item_add 40,"Oboe"
  item_add 40,"English horn"
  item_add 40,"Bassoon"
  item_add 40,"Clarinet"
  item_add 40,"Piccolo"
  item_add 40,"Flute"
  item_add 40,"Recorder"
  item_add 40,"Pan flute"
  item_add 40,"Bottle blow"
  item_add 40,"Shakuhachi"
  item_add 40,"Whistle"
  item_add 40,"Ocarina"
  item_add 40,"Lead 1 (square)"
  item_add 40,"Lead 2 (sawtooth)"
  item_add 40,"Lead 3 (calliope lead)"
  item_add 40,"Lead 4 (chiff lead)"
  item_add 40,"Lead 5 (charang)"
  item_add 40,"Lead 6 (voice)"
  item_add 40,"Lead 7 (fifths)"
  item_add 40,"Lead 8 (brass + lead)"
  item_add 40,"Pad 1 (new age)"
  item_add 40,"Pad 2 (warm)"
  item_add 40,"Pad 3 (polysynth)"
  item_add 40,"Pad 4 (choir)"
  item_add 40,"Pad 5 (bowed)"
  item_add 40,"Pad 6 (metallic)"
  item_add 40,"Pad 7 (halo)"
  item_add 40,"Pad 8 (sweep)"
  item_add 40,"Synth SFX 1 Ice Rain"
  item_add 40,"Synth SFX 2 Sound Track"
  item_add 40,"Synth SFX 3 Crystal"
  item_add 40,"Synth SFX 4 Atmosphere"
  item_add 40,"Synth SFX 5 Brightness"
  item_add 40,"Synth SFX 6 Goblin"
  item_add 40,"Synth SFX 7 Echo Drops"
  item_add 40,"Synth SFX 8 Star Theme"
  item_add 40,"Sitar"
  item_add 40,"Banjo"
  item_add 40,"Shamisen"
  item_add 40,"Koto"
  item_add 40,"Kalimba"
  item_add 40,"Bagpipe"
  item_add 40,"Fiddle"
  item_add 40,"Shanai"
  item_add 40,"Tinkle Bells"
  item_add 40,"Agogo"
  item_add 40,"Steel Drums"
  item_add 40,"Woodblock"
  item_add 40,"Taiko Drum"
  item_add 40,"Melodic Drum"
  item_add 40,"Synth Drum"
  item_add 40,"Reverse Cymbal"
  item_add 40,"Guitar fret noise"
  item_add 40,"Breath noise"
  item_add 40,"Seashore"
  item_add 40,"Bird tweet"
  item_add 40,"Telephone ring"
  item_add 40,"Helicopter"
  item_add 40,"Applause"
  item_add 40,"Gunshot"
text 40,item_read$(40,1)
instrument1% = 0
instrument% = 1

alpha 41 : top 41,90 : left 41,left(40) : caption 41,"Volume:"
scroll_bar 42 : top 42,90 : left 42,left(41)+50 : width 42,150
  min 42,0 : max 42,127 : position 42,VolumeDefaut% : on_change 42,changevolume
alpha 43: top 43,90 : left 43,left(42)+width(42)+10 : caption 43,"80"

  CanalActuel% = 1
  mark_on 100+CanalActuel%

trame()

end

changevolume:
  caption 43,str$(position(42))
  VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%)) = position(42)
  return

PianoPause:
  if CanalPlein%(CanalActuel%)=1 then return
  nomNote$ = "[]"
  caption 7, "pause 0 = "+nomNote$
  hauteur% = 2*dline%
  note% = 0
  note1% = 0
  couleur% = 1
 
  NombreCumulees%(CanalActuel%) = NombreCumulees%(CanalActuel%) + 1
  NotesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))      = note%
  NomsCumulees$(CanalActuel%,NombreCumulees%(CanalActuel%))        = nomNote$
  OctavesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))    = octave%
  Note1Cumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))      = note1%
  NoteCouleurCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%)) = couleur%
  InstrumentsCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))  = instrument%
  VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))      = position(42)
 
  DessinerPause()
  adresse%(CanalActuel%) = adresse%(CanalActuel%) + 20
  return
 
 
clickPiano:
  if CanalPlein%(CanalActuel%)=1 then return
 
  x% = mouse_x_left_down(2)
  y% = mouse_y_left_down(2)
  cr% = color_pixel_red(2,x%,y%)
  cv% = color_pixel_green(2,x%,y%)
  cb% = color_pixel_blue(2,x%,y%)

  if item_index(40)>0 then instrument% = item_index(40) 
  if cr%=255            : ' c'est une blanche ?
    note1% = 255 - cb%
    octave% = 255 - cv%
    nomOctave$ = mid$(tabOctave$,octave%,1)
    delta% = (octave%-5)*12
    note% = tabBlanches%(note1%) + delta%
    if instrument%<>instrument1%
      nomNote$ = "i"+right$("00"+str$(instrument%),3)+"+"+nomOctave$+nomBlanches$(note1%)
    else
      nomNote$ = "+"+nomOctave$+nomBlanches$(note1%)
    end_if
    nomNote$ = "["+nomNote$+str$(position(42))+"-]"
    caption 7, "blanche "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
    couleur% = 1
    hauteur% = 5*dline% - (note1%-1)*dline%/2
  else
    if cr%=0            : ' est-ce une noire ?
      note1% = cb%
      octave% = cv%
      nomOctave$ = mid$(tabOctave$,octave%,1)
      delta% = (octave%-5)*12
      if instrument%<>instrument1%
        nomNote$ = "i"+right$("00"+str$(instrument%),3)+"+"+nomOctave$+nomNoires$(note1%)
      else
        nomNote$ = "+"+nomOctave$+nomNoires$(note1%)
      end_if
      nomNote$ = "["+nomNote$ +str$(position(42))+"-]"
      note% = tabNoires%(note1%) + delta%
      caption 7, "noire "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$ 
      couleur% = 2             
      hauteur% = 5*dline% - (note1%-1)*dline%/2
      if note1%>2 then hauteur% = hauteur% - dline%/2
    end_if
  end_if
  instrument1% = instrument%
  mark_on 30+octave%
  set_focus 30+octave%
  display
 
  NombreCumulees%(CanalActuel%) = NombreCumulees%(CanalActuel%) + 1
  NotesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))      = note%
  NomsCumulees$(CanalActuel%,NombreCumulees%(CanalActuel%))        = nomNote$
  OctavesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))    = octave%
  Note1Cumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))      = note1%
  NoteCouleurCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%)) = couleur%
  InstrumentsCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))  = instrument%
  VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))      = position(42)
 
  DessinerNote()
  adresse%(CanalActuel%) = adresse%(CanalActuel%) + 20
 
  return
 
exporter:
  temp% = 0
  for i%=1 to NombreCanaux%
    if NombreCumulees%(i%)>0 then temp% = 1
  next i%
  if temp%=0
    message "Il n'y a rien à exporter !"
    return
  end_if
  f$ = file_name$(6)
  if f$="_" then return
  if file_exists(f$)=1
    if message_confirmation_yes_no("Ce fichier existe déjà. Remplacer ?")<>1 then return
  end_if   
  clear 5
  for j%=1 to NombreCanaux%
    item_add 5,"Canal "+str$(j%)
    if NombreCumulees%(j%)>0
      for i%=1 to NombreCumulees%(j%)
        item_add 5,NomsCumulees$(j%,i%)+"="+str$(NotesCumulees%(j%,i%))
      next i%
    end_if
  next j%
  file_save 5,f$
  return
 
effacer:
  color 1,255,255,255
  CanalActuel% = 1
  mark_on 100+CanalActuel%
  set_focus 100+CanalActuel%
  for i%=1 to NombreCanaux%
    NombreCumulees%(i%) = 0
    CanalPlein%(i%) = 0
    Adresse%(i%) = 20
    InstrumentsCumules%(i%,0) = 1
    VolumesCumules%(i%,0) = VolumeDefaut%
  next i%
  position 42,VolumeDefaut%
  trame()
  return
 
jouer:
  temp% = 0
  for i%=1 to NombreCanaux%
    if NombreCumulees%(i%)>0 then temp% = 1
  next i%
  if temp%=0
    message "Il n'y a rien à exporter !"
    return
  end_if
  dll_on KGF$
 
  res% = DLL_call0("MIDI_Initialize")
  res% = DLL_call1("MIDI_Reset",NombreCanaux%)
  for j%=1 to NombreCanaux%
    notes$ = ""
    for i%=1 to NombreCumulees%(j%)
      notes$ = notes$ + NomsCumulees$(j%,i%) + " "
    next i%
    res% = DLL_call3("MIDI_Compile",j%,0,adr(notes$))
  next j%
  res% = DLL_call1("MIDI_Play",10)
  res% = DLL_call0("MIDI_Stop")
 
  dll_off
  return
 
changecanal:
  CanalActuel% = number_click - 100
  set_focus 100+CanalActuel%
  text 40,item_read$(40,InstrumentsCumules%(CanalActuel%,NombreCumulees%(CanalActuel%)))
  position 42,VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))
  return
 
sub DessinerPause()
  dim_local a%, hligne%
  a% = adresse%(CanalActuel%)
  hligne% = 20 + (CanalActuel%-1)*100
  2d_rectangle a%,hligne%+hauteur%,a%+dline%,hligne%+hauteur%+dline%/2
  if adresse%(CanalActuel%)>(width_client(1)-25) then CanalPlein%(CanalActuel%) = 1
end_sub
 
sub DessinerNote()
  dim_local a%, hligne%
  a% = adresse%(CanalActuel%)
  hligne% = 20 + (CanalActuel%-1)*100
  if NoteCouleurCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))=2
    print_locate a%-9,hligne%+hauteur%-7
    print "#"
    a% = a% + 5
    adresse%(CanalActuel%) = adresse%(CanalActuel%) + 3
  end_if
  2d_circle a%,hligne%+hauteur%,dline%/2
  if Note1Cumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))=1
'    if NoteCouleurCumulees%(NombreCumulees%)=1
      2d_line a%-7,hligne%+hauteur%,a%+7,hligne%+hauteur%
'    end_if
  end_if
  print_locate a%-5,hligne%+57
  print mid$(tabOctave$,octave%,1)
 
  if adresse%(CanalActuel%)>(width_client(1)-25) then CanalPlein%(CanalActuel%) = 1

end_sub

sub trame()
  ' v% donne le numéro de la trame dans la page (1=première ligne)
  dim_local hligne%, v%
  v% = 0
  hligne% = 0
  for v%=1 to NombreCanaux%
    hligne% = 20 + (v%-1)*100
    2d_line 0,hligne%,w%,hligne%
    2d_line 0,hligne%+dline%,w%,hligne%+dline%
    2d_line 0,hligne%+2*dline%,w%,hligne%+2*dline%
    2d_line 0,hligne%+3*dline%,w%,hligne%+3*dline%
    2d_line 0,hligne%+4*dline%,w%,hligne%+4*dline%

    ' séparateur de mesure
    2d_line 10,hligne%,10,hligne%+4*dline%
  next v%
end_sub

sub DessinerOctave(id%,x%)
  2d_fill_color 255,255-id%,254
  2d_rectangle x%,0,x%+20,80
  2d_fill_color 255,255-id%,253
  2d_rectangle x%+20,0,x%+40,80
  2d_fill_color 255,255-id%,252
  2d_rectangle x%+40,0,x%+60,80
  2d_fill_color 255,255-id%,251
  2d_rectangle x%+60,0,x%+80,80
  2d_fill_color 255,255-id%,250
  2d_rectangle x%+80,0,x%+100,80
  2d_fill_color 255,255-id%,249
  2d_rectangle x%+100,0,x%+120,80
  2d_fill_color 255,255-id%,248
  2d_rectangle x%+120,0,x%+140,80
  2d_pen_color 0,id%,1
  2d_fill_color 0,id%,1
  2d_rectangle x%+12,0,x%+28,40
  2d_fill_color 0,id%,2
  2d_rectangle x%+32,0,x%+48,40
  2d_fill_color 0,id%,3
  2d_rectangle x%+72,0,x%+88,40
  2d_fill_color 0,id%,4
  2d_rectangle x%+92,0,x%+108,40
  2d_fill_color 0,id%,5
  2d_rectangle x%+112,0,x%+128,40
end_sub

Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Marc

avatar

Nombre de messages : 809
Age : 57
Localisation : TOURS
Date d'inscription : 17/03/2014

MessageSujet: Re: Maquette d'une rédaction de partition de piano   Mar 6 Fév 2018 - 0:53

Extra !

Je me suis amusé à mettre quelques notes de piano sur une portée + quelques notes de flûte sur la portée suivante et pour finir un peu de batterie (Drum) sur une autre portée.

Puis lecture !

Super ! ça fonctionne admirablement bien ! Lecture de mes 3 pistes simultanément. Une vraie polyphonie.

Bon, je vous l'avoue, je suis encore à des années-lumière de pouvoir sortir un tube...

Merci Klaus !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Maquette d'une rédaction de partition de piano   Mar 6 Fév 2018 - 10:09

Et voici une version avec transposirion automatique, par instrument.

Dans les DATA du programme, il y a la liste des instruments, chacun précédé d'un 0 (zéro). Ce chiffre est le décalage de transposition pour cet instrument. Par défaut, tous sont à zéro, bien sûr. Mais on peut coder son propre décalage initial. La valeur est donné en nombre de demi-tons, entre -11 et +11. Exemple: un décale de -2 transforme un fa en re#.

Le décalage est affiché à l'écran, enn haut à droite, sous le volume. On peut changer cette valeur à cet endroit, ponctuellement pour la session.

Maintenant, lorsque le curseur survolle le clavier, la note est affichée, et on surveiller ainsi la transposition.

Code:
' Composeur_de_Partition.bas

label clickPiano, exporter, changevolume, jouer, effacer, changecanal
label PianoPause, MovePiano, changetransposition, changeinstrument

dim KGF$ : KGF$ = "KGF.dll"

dim w%, h%, dline%, x%, y%, cr%, cv%, cb%, note1%, note%, i%, j%, nom$, notes$, s$
dim res%, no%, temp%
dim octave%, delta%, instrument%, instrument1%, canal%
dim couleur%, hauteur%, dhauteur%, hligne%, f$
dim tabBlanches%(7), tabNoires%(5)
dim nomBlanches$(7), nomNoires$(5)
dim DeltaTranspositions%(127), DeltaTransposition%
dim tabOctave$, nomOctave$, nomNote$
dim NombreCanaux%, CanalActuel%, VolumeDefaut%
dim note2%, octave2%, nomOctave2$, delta2%, note2a%, nomNote2$

data "do",60,"re",62,"mi",64,"fa",65,"sol",67,"la",69,"si",71  : ' notes blanches
data "do#",61,"re#",63,"fa#",66,"sol#",68,"la#",70              : ' notes noires

' ici; décalage de transposition, nom instrument
data 0,"Bright acoustic piano"
data 0,"Electric grand piano"
data 0,"Honky-tonk piano"
data 0,"Rhodes piano"
data 0,"Chorused piano"
data 0,"Harpsichord"
data 0,"Clavinet"
data 0,"Celesta"
data 0,"Glockenspiel"
data 0,"Music box"
data 0,"Vibraphone"
data 0,"Marimba"
data 0,"Xylophone"
data 0,"Tubular bells"
data 0,"Dulcimer"
data 0,"Hammond organ"
data 0,"Percussive organ"
data 0,"Rock organ"
data 0,"Church organ"
data 0,"Reed organ"
data 0,"Accordion"
data 0,"Harmonica"
data 0,"Tango accordion"
data 0,"Acoustic guitar (nylon)"
data 0,"Acoustic guitar (steel)"
data 0,"Electric guitar (jazz)"
data 0,"Electric guitar (clean)"
data 0,"Electric guitar (muted)"
data 0,"Overdriven guitar"
data 0,"Distortion guitar"
data 0,"Guitar harmonics"
data 0,"Acoustic bass"
data 0,"Electric bass (finger)"
data 0,"Electric bass (pick)"
data 0,"Fretless bass"
data 0,"Slap bass 1"
data 0,"Slap bass 2"
data 0,"Synth bass 1"
data 0,"Synth bass 2"
data 0,"Violin"
data 0,"Viola"
data 0,"Cello"
data 0,"Contrabass"
data 0,"Tremolo strings"
data 0,"Pizzicato strings"
data 0,"Orchestral harp"
data 0,"Timpani"
data 0,"String ensemble 1"
data 0,"String ensemble 2"
data 0,"Synth. strings 1"
data 0,"Synth. strings 2"
data 0,"Choir Aahs"
data 0,"Voice Oohs"
data 0,"Synth voice"
data 0,"Orchestra hit"
data 0,"Trumpet"
data 0,"Trombone"
data 0,"Tuba#966"
data 0,"Muted trumpet"
data 0,"French horn"
data 0,"Brass section"
data 0,"Synth. brass 1"
data 0,"Synth. brass 2"
data 0,"Soprano sax"
data 0,"Alto sax"
data 0,"Tenor sax"
data 0,"Baritone sax"
data 0,"Oboe"
data 0,"English horn"
data 0,"Bassoon"
data 0,"Clarinet"
data 0,"Piccolo"
data 0,"Flute"
data 0,"Recorder"
data 0,"Pan flute"
data 0,"Bottle blow"
data 0,"Shakuhachi"
data 0,"Whistle"
data 0,"Ocarina"
data 0,"Lead 1 (square)"
data 0,"Lead 2 (sawtooth)"
data 0,"Lead 3 (calliope lead)"
data 0,"Lead 4 (chiff lead)"
data 0,"Lead 5 (charang)"
data 0,"Lead 6 (voice)"
data 0,"Lead 7 (fifths)"
data 0,"Lead 8 (brass + lead)"
data 0,"Pad 1 (new age)"
data 0,"Pad 2 (warm)"
data 0,"Pad 3 (polysynth)"
data 0,"Pad 4 (choir)"
data 0,"Pad 5 (bowed)"
data 0,"Pad 6 (metallic)"
data 0,"Pad 7 (halo)"
data 0,"Pad 8 (sweep)"
data 0,"Synth SFX 1 Ice Rain"
data 0,"Synth SFX 2 Sound Track"
data 0,"Synth SFX 3 Crystal"
data 0,"Synth SFX 4 Atmosphere"
data 0,"Synth SFX 5 Brightness"
data 0,"Synth SFX 6 Goblin"
data 0,"Synth SFX 7 Echo Drops"
data 0,"Synth SFX 8 Star Theme"
data 0,"Sitar"
data 0,"Banjo"
data 0,"Shamisen"
data 0,"Koto"
data 0,"Kalimba"
data 0,"Bagpipe"
data 0,"Fiddle"
data 0,"Shanai"
data 0,"Tinkle Bells"
data 0,"Agogo"
data 0,"Steel Drums"
data 0,"Woodblock"
data 0,"Taiko Drum"
data 0,"Melodic Drum"
data 0,"Synth Drum"
data 0,"Reverse Cymbal"
data 0,"Guitar fret noise"
data 0,"Breath noise"
data 0,"Seashore"
data 0,"Bird tweet"
data 0,"Telephone ring"
data 0,"Helicopter"
data 0,"Applause"
data 0,"Gunshot"


tabOctave$ = "dcba0123"
VolumeDefaut% = 80

for i%=1 to 7
  read nomBlanches$(i%)
  read tabBlanches%(i%)
next i%
for i%=1 to 5
  read nomNoires$(i%)
  read tabNoires%(i%)
next i%
for i%=1 to 127
  DeltaTranspositions%(i%) = 0
next i%

octave% = 5
delta% = 0
hauteur% = 5*dline%
hligne% = 20

full_space 0


picture 1 : top 1,140 : left 1,30
  width 1,width_client(0)-30 : height 1,height_client(0)-140
w% = width_client(1)
dline% = 10

picture 2 : width 2,1020 : height 2,80
2d_target_is 2
2d_pen_color 1,0,0
DessinerOctave(1,-100)
DessinerOctave(2,40)
DessinerOctave(3,180)
DessinerOctave(4,320)
DessinerOctave(5,460)
DessinerOctave(6,600)
DessinerOctave(7,740)
DessinerOctave(8,880)
on_mouse_move 2,MovePiano

container_option 100 : top 100,135 : left 100,0 : width 100,35 : height 100,height(1)+5
  i% = 40
  no% = 100
  while i%<height_client(1)
    no% = no% + 1
    option no% : parent no%,100 : top no%,i% : left no%,10 : width no%,20 : on_click no%,changecanal
    i% = i% + 100
  end_while
  NombreCanaux% = no% - 100
dim NotesCumulees%(NombreCanaux%,100), NomsCumulees$(NombreCanaux%,100)
dim OctavesCumulees%(NombreCanaux%,100), Note1Cumulees%(NombreCanaux%,100)
dim NoteCouleurCumulees%(NombreCanaux%,100), NombreCumulees%(NombreCanaux%)
dim InstrumentsCumules%(NombreCanaux%,100), adresse%(NombreCanaux%)
dim CanalPlein%(NombreCanaux%), VolumesCumules%(NombreCanaux%,100)
for i%=1 to NombreCanaux%
  NombreCumulees%(i%) = 0
  CanalPlein%(i%) = 0
  Adresse%(i%) = 20
  InstrumentsCumules%(i%,0) = 1
  VolumesCumules%(i%,0) = VolumeDefaut%
next i%

on_click 2,clickPiano

container_option 3 : top 3,10 : width 3,130 : height 3,40 : left 3,width(2)+10
  caption 3,"Octaves"
option 31 : parent 31,3 : top 31,15 : left 31,5 :  width 31,20
option 32 : parent 32,3 : top 32,15 : left 32,20 : width 32,20
option 33 : parent 33,3 : top 33,15 : left 33,35 : width 33,20
option 34 : parent 34,3 : top 34,15 : left 34,50 : width 34,20
option 35 : parent 35,3 : top 35,15 : left 35,65 : width 35,20
option 36 : parent 36,3 : top 36,15 : left 36,80 : width 36,20
option 37 : parent 37,3 : top 37,15 : left 37,95 : width 37,20
option 38 : parent 38,3 : top 38,15 : left 38,110 : width 38,15
mark_on 30+octave%
set_focus 30+octave%

2d_target_is 1
2d_fill_off
print_target_is 1
font_size 1,8

button 4 : top 4,100 : left 4,320 : caption 4,"Exporter" : on_click 4,exporter
button 11 : top 11,100 : left 11,left(4)+width(4) : caption 11,"Effacer" : on_click 11,Effacer
dlist 5
save_dialog 6 : filter 6,"Fichiers texte (*.TXT)|*.txt"
alpha 8 : top 8,110 : left 8,10 : caption 8,"Note jouée:"
alpha 7 : top 7,110 : left 7,80 : font_bold 7
button 9 : top 9,100 : left 9,520 : caption 9,"Jouer" : on_click 9,jouer
button 12 : top 12,top(2)+height(2) : left 12,0 : width 12,width(2) : height 12,15 : caption 12,"Pause" : on_click 12,PianoPause

combo 40 : top 40,60 : left 40,width(2)+10 : width 40,150
for i%=1 to 127
  read DeltaTranspositions%(i%)
  read s$
  item_add 40,s$
next i%
text 40,item_read$(40,1)
on_click 40,changeinstrument
instrument1% = 0
instrument% = 1

alpha 41 : top 41,90 : left 41,left(40) : caption 41,"Volume:"
scroll_bar 42 : top 42,90 : left 42,left(41)+50 : width 42,150
  min 42,0 : max 42,127 : position 42,VolumeDefaut% : on_change 42,changevolume
alpha 43: top 43,90 : left 43,left(42)+width(42)+10 : caption 43,"80"

alpha 51 : top 51,120 : left 51,left(40) : caption 51,"Transpo:"
scroll_bar 52 : top 52,120 : left 52,left(51)+50 : width 52,150
  min 52,-11 : max 52,11 : position 52,0 : on_change 52,changetransposition
alpha 53: top 53,120 : left 53,left(52)+width(52)+10 : caption 53,"0"

  CanalActuel% = 1
  mark_on 100+CanalActuel%

trame()

end

changevolume:
  caption 43,str$(position(42))
  VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%)) = position(42)
  return

changetransposition:
  caption 53,str$(position(52))
  DeltaTranspositions%(instrument%) = position(52)
  DeltaTransposition% = position(52)
  return

PianoPause:
  if CanalPlein%(CanalActuel%)=1 then return
  nomNote$ = "[]"
  caption 7, "pause 0 = "+nomNote$
  hauteur% = 2*dline%
  note% = 0
  note1% = 0
  couleur% = 1
 
  NombreCumulees%(CanalActuel%) = NombreCumulees%(CanalActuel%) + 1
  NotesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))      = note%
  NomsCumulees$(CanalActuel%,NombreCumulees%(CanalActuel%))        = nomNote$
  OctavesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))    = octave%
  Note1Cumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))      = note1%
  NoteCouleurCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%)) = couleur%
  InstrumentsCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))  = instrument%
  VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))      = position(42)
 
  DessinerPause()
  adresse%(CanalActuel%) = adresse%(CanalActuel%) + 20
  return
 
changeinstrument:
  instrument% = item_index(40)
  position 52,DeltaTranspositions%(instrument%)
  DeltaTransposition% = DeltaTranspositions%(instrument%)
  return
   
MovePiano:
  off_mouse_move 2
  MovePiano()
  on_mouse_move 2,MovePiano
  return
 
clickPiano:
  if CanalPlein%(CanalActuel%)=1 then return
 
  x% = mouse_x_left_down(2)
  y% = mouse_y_left_down(2)
  cr% = color_pixel_red(2,x%,y%)
  cv% = color_pixel_green(2,x%,y%)
  cb% = color_pixel_blue(2,x%,y%)

  if cr%=255            : ' c'est une blanche ?
    note1% = 255 - cb%
    octave% = 255 - cv%
    note% = tabBlanches%(note1%) + DeltaTransposition%
   
    if note%<tabBlanches%(1)
      note% = note% + 12
      octave% = octave% - 1
    end_if
    if note%>tabBlanches%(7)
      note% = note% - 12
      octave% = octave% + 1
    end_if
    for i%=1 to 7
      if tabBlanches%(i%)=note%
        note1% = i%
        couleur% = 1
        exit_for
      end_if
    next i%
    for i%=1 to 5
      if tabNoires%(i%)=note%
        note1% = i%
        couleur% = 2
        exit_for
      end_if
    next i%
   
    nomOctave$ = mid$(tabOctave$,octave%,1)
    delta% = (octave%-5)*12
    if instrument%<>instrument1%
      nomNote$ = "i"+right$("00"+str$(instrument%),3)+"+"+nomOctave$+nomBlanches$(note1%)
    else
      nomNote$ = "+"+nomOctave$+nomBlanches$(note1%)
    end_if
   
    if couleur%=1
      note% = tabBlanches%(note1%) + delta%
      nomNote$ = "+"+nomOctave$+nomBlanches$(note1%)
      nomNote$ = "["+nomNote$+str$(position(42))+"-]"
      caption 7, "blanche "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
    else
      note% = tabNoires%(note1%) + delta%
      nomNote$ = "+"+nomOctave$+nomNoires$(note1%)
      nomNote$ = "["+nomNote$+str$(position(42))+"-]"
      caption 7, "noire "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
    end_if
   
    hauteur% = 5*dline% - (note1%-1)*dline%/2
  else
    if cr%=0            : ' est-ce une noire ?
      note1% = cb%
      octave% = cv%
      note% = tabNoires%(note1%)
     
      couleur% = 0
      note% = note% + DeltaTransposition%
      if note%<tabBlanches%(1)
        note% = note% + 12
        octave% = octave% - 1
      end_if
      if note%>tabBlanches%(7)
        note% = note% - 12
        octave% = octave% + 1
      end_if
      for i%=1 to 7
        if tabBlanches%(i%)=note%
          note1% = i%
          couleur% = 1
          exit_for
        end_if
      next i%
      for i%=1 to 5
        if tabNoires%(i%)=note%
          note1% = i%
          couleur% = 2
          exit_for
        end_if
      next i%
     
      nomOctave$ = mid$(tabOctave$,octave%,1)
      delta% = (octave%-5)*12
      if instrument%<>instrument1%
        nomNote$ = "i"+right$("00"+str$(instrument%),3)+"+"+nomOctave$+nomNoires$(note1%)
      else
        nomNote$ = "+"+nomOctave$+nomNoires$(note1%)
      end_if
      if couleur%=1
        note% = tabBlanches%(note1%) + delta%
        nomNote$ = "+"+nomOctave$+nomBlanches$(note1%)
        nomNote$ = "["+nomNote$+str$(position(42))+"-]"
        caption 7, "blanche "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
      else
        note% = tabNoires%(note1%) + delta%
        nomNote$ = "+"+nomOctave$+nomNoires$(note1%)
        nomNote$ = "["+nomNote$+str$(position(42))+"-]"
        caption 7, "noire "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
      end_if
      hauteur% = 5*dline% - (note1%-1)*dline%/2
      if note1%>2 then hauteur% = hauteur% - dline%/2
    end_if
  end_if
  instrument1% = instrument%
  mark_on 30+octave%
  set_focus 30+octave%
  display
 
  NombreCumulees%(CanalActuel%) = NombreCumulees%(CanalActuel%) + 1
  NotesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))      = note%
  NomsCumulees$(CanalActuel%,NombreCumulees%(CanalActuel%))        = nomNote$
  OctavesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))    = octave%
  Note1Cumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))      = note1%
  NoteCouleurCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%)) = couleur%
  InstrumentsCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))  = instrument%
  VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))      = position(42)
 
  DessinerNote()
  adresse%(CanalActuel%) = adresse%(CanalActuel%) + 20
 
  return
 
exporter:
  temp% = 0
  for i%=1 to NombreCanaux%
    if NombreCumulees%(i%)>0 then temp% = 1
  next i%
  if temp%=0
    message "Il n'y a rien à exporter !"
    return
  end_if
  f$ = file_name$(6)
  if f$="_" then return
  if file_exists(f$)=1
    if message_confirmation_yes_no("Ce fichier existe déjà. Remplacer ?")<>1 then return
  end_if   
  clear 5
  for j%=1 to NombreCanaux%
    item_add 5,"Canal "+str$(j%)
    if NombreCumulees%(j%)>0
      for i%=1 to NombreCumulees%(j%)
        item_add 5,NomsCumulees$(j%,i%)+"="+str$(NotesCumulees%(j%,i%))
      next i%
    end_if
  next j%
  file_save 5,f$
  return
 
effacer:
  color 1,255,255,255
  CanalActuel% = 1
  mark_on 100+CanalActuel%
  set_focus 100+CanalActuel%
  for i%=1 to NombreCanaux%
    NombreCumulees%(i%) = 0
    CanalPlein%(i%) = 0
    Adresse%(i%) = 20
    InstrumentsCumules%(i%,0) = 1
    VolumesCumules%(i%,0) = VolumeDefaut%
  next i%
  position 42,VolumeDefaut%
  trame()
  return
 
jouer:
  temp% = 0
  for i%=1 to NombreCanaux%
    if NombreCumulees%(i%)>0 then temp% = 1
  next i%
  if temp%=0
    message "Il n'y a rien à exporter !"
    return
  end_if
  dll_on KGF$
 
  res% = DLL_call0("MIDI_Initialize")
  res% = DLL_call1("MIDI_Reset",NombreCanaux%)
  for j%=1 to NombreCanaux%
    notes$ = ""
    for i%=1 to NombreCumulees%(j%)
      notes$ = notes$ + NomsCumulees$(j%,i%) + " "
    next i%
    res% = DLL_call3("MIDI_Compile",j%,0,adr(notes$))
  next j%
  res% = DLL_call1("MIDI_Play",10)
  res% = DLL_call0("MIDI_Stop")
 
  dll_off
  return
 
changecanal:
  CanalActuel% = number_click - 100
  set_focus 100+CanalActuel%
  text 40,item_read$(40,InstrumentsCumules%(CanalActuel%,NombreCumulees%(CanalActuel%)))
  position 42,VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))
  return
 
sub DessinerPause()
  dim_local a%, hligne%
  a% = adresse%(CanalActuel%)
  hligne% = 20 + (CanalActuel%-1)*100
  2d_rectangle a%,hligne%+hauteur%,a%+dline%,hligne%+hauteur%+dline%/2
  if adresse%(CanalActuel%)>(width_client(1)-25) then CanalPlein%(CanalActuel%) = 1
end_sub
 
sub DessinerNote()
  dim_local a%, hligne%
  a% = adresse%(CanalActuel%)
  hligne% = 20 + (CanalActuel%-1)*100
  if NoteCouleurCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))=2
    print_locate a%-9,hligne%+hauteur%-7
    print "#"
    a% = a% + 5
    adresse%(CanalActuel%) = adresse%(CanalActuel%) + 3
  end_if
  2d_circle a%,hligne%+hauteur%,dline%/2
  if Note1Cumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))=1
'    if NoteCouleurCumulees%(NombreCumulees%)=1
      2d_line a%-7,hligne%+hauteur%,a%+7,hligne%+hauteur%
'    end_if
  end_if
  print_locate a%-5,hligne%+57
  print mid$(tabOctave$,octave%,1)
 
  if adresse%(CanalActuel%)>(width_client(1)-25) then CanalPlein%(CanalActuel%) = 1

end_sub

sub trame()
  ' v% donne le numéro de la trame dans la page (1=première ligne)
  dim_local hligne%, v%
  v% = 0
  hligne% = 0
  for v%=1 to NombreCanaux%
    hligne% = 20 + (v%-1)*100
    2d_line 0,hligne%,w%,hligne%
    2d_line 0,hligne%+dline%,w%,hligne%+dline%
    2d_line 0,hligne%+2*dline%,w%,hligne%+2*dline%
    2d_line 0,hligne%+3*dline%,w%,hligne%+3*dline%
    2d_line 0,hligne%+4*dline%,w%,hligne%+4*dline%

    ' séparateur de mesure
    2d_line 10,hligne%,10,hligne%+4*dline%
  next v%
end_sub

sub DessinerOctave(id%,x%)
  2d_fill_color 255,255-id%,254
  2d_rectangle x%,0,x%+20,80
  2d_fill_color 255,255-id%,253
  2d_rectangle x%+20,0,x%+40,80
  2d_fill_color 255,255-id%,252
  2d_rectangle x%+40,0,x%+60,80
  2d_fill_color 255,255-id%,251
  2d_rectangle x%+60,0,x%+80,80
  2d_fill_color 255,255-id%,250
  2d_rectangle x%+80,0,x%+100,80
  2d_fill_color 255,255-id%,249
  2d_rectangle x%+100,0,x%+120,80
  2d_fill_color 255,255-id%,248
  2d_rectangle x%+120,0,x%+140,80
'  2d_pen_color 0,id%,1
  2d_fill_color 0,id%,1
  2d_rectangle x%+12,0,x%+28,40
  2d_fill_color 0,id%,2
  2d_rectangle x%+32,0,x%+48,40
  2d_fill_color 0,id%,3
  2d_rectangle x%+72,0,x%+88,40
  2d_fill_color 0,id%,4
  2d_rectangle x%+92,0,x%+108,40
  2d_fill_color 0,id%,5
  2d_rectangle x%+112,0,x%+128,40
end_sub

sub MovePiano()
  dim_local i%, couleur2%
   
  x% = mouse_x_position(2)
  y% = mouse_y_position(2)
  cr% = color_pixel_red(2,x%,y%)
  cv% = color_pixel_green(2,x%,y%)
  cb% = color_pixel_blue(2,x%,y%)
 
  if cb%=0 then exit_sub  : ' ne pas réagir sur une bordure de touche !
 
  if cr%=255            : ' c'est une blanche ?
    note2% = 255 - cb%
    octave2% = 255 - cv%
    note2a% = tabBlanches%(note2%)

    couleur2% = 0
    note2a% = note2a% + DeltaTransposition%
    if note2a%<tabBlanches%(1)
      note2a% = note2a% + 12
      octave2% = octave2% - 1
    end_if
    if note2a%>tabBlanches%(7)
      note2a% = note2a% - 12
      octave2% = octave2% + 1
    end_if
    for i%=1 to 7
      if tabBlanches%(i%)=note2a%
        note2% = i%
        couleur2% = 1
        exit_for
      end_if
    next i%
    for i%=1 to 5
      if tabNoires%(i%)=note2a%
        note2% = i%
        couleur2% = 2
        exit_for
      end_if
    next i%
   
    nomOctave2$ = mid$(tabOctave$,octave2%,1)
    delta2% = (octave2%-5)*12
    if couleur2%=1
      note2a% = tabBlanches%(note2%) + delta2%
      nomNote2$ = "+"+nomOctave2$+nomBlanches$(note2%)
      nomNote2$ = "["+nomNote2$+str$(position(42))+"-]"
      caption 7, "blanche "+str$(note2%)+"  "+str$(note2a%)+" = "+nomNote2$
    else
      note2a% = tabNoires%(note2%) + delta2%
      nomNote2$ = "+"+nomOctave2$+nomNoires$(note2%)
      nomNote2$ = "["+nomNote2$+str$(position(42))+"-]"
      caption 7, "noire "+str$(note2%)+"  "+str$(note2a%)+" = "+nomNote2$
    end_if
  else
    if cr%=0            : ' est-ce une noire ?
      note2% = cb%
      octave2% = cv%
      note2a% = tabNoires%(note2%)
     
      couleur2% = 0
      note2a% = note2a% + DeltaTransposition%
      if note2a%<tabBlanches%(1)
        note2a% = note2a% + 12
        octave2% = octave2% - 1
      end_if
      if note2a%>tabBlanches%(7)
        note2a% = note2a% - 12
        octave2% = octave2% + 1
      end_if
      for i%=1 to 7
        if tabBlanches%(i%)=note2a%
          note2% = i%
          couleur2% = 1
          exit_for
        end_if
      next i%
      for i%=1 to 5
        if tabNoires%(i%)=note2a%
          note2% = i%
          couleur2% = 2
          exit_for
        end_if
      next i%
 
      nomOctave2$ = mid$(tabOctave$,octave2%,1)
      delta2% = (octave2%-5)*12
      if couleur2%=1
        note2a% = tabBlanches%(note2%) + delta2%
        nomNote2$ = "+"+nomOctave2$+nomBlanches$(note2%)
        nomNote2$ = "["+nomNote2$+str$(position(42))+"-]"
        caption 7, "blanche "+str$(note2%)+"  "+str$(note2a%)+" = "+nomNote2$
      else
        note2a% = tabNoires%(note2%) + delta2%
        nomNote2$ = "+"+nomOctave2$+nomNoires$(note2%)
        nomNote2$ = "["+nomNote2$+str$(position(42))+"-]"
        caption 7, "noire "+str$(note2%)+"  "+str$(note2a%)+" = "+nomNote2$
      end_if
    end_if
  end_if

end_sub


Prochaine étape: la correction (le remplacement d'une note déjà régidée).
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
mindstorm

avatar

Nombre de messages : 559
Age : 49
Localisation : charente
Date d'inscription : 13/02/2013

MessageSujet: Re: Maquette d'une rédaction de partition de piano   Mar 6 Fév 2018 - 18:50

super Klaus
Désolé je n'ai pas encore eu le temps de développer mon idées No
Je vais taché de prendre le temps nécessaire " pour le plaisir"
encore merci
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Maquette d'une rédaction de partition de piano   Mar 6 Fév 2018 - 23:58

Voixi une "version d'étape" sur le chemin vers la modification de notes déjà saisies. Maintenant, on peut cliquer sur une note, et elle sera "marquée" par un fond colorée. En cliquant sur une aitre note, cette "marque" se déplace.
Code:
' Composeur_de_Partition.bas

inactive 0
caption 0,"Composeur de Partition"

label clickPiano, exporter, changevolume, jouer, effacer, changecanal
label PianoPause, MovePiano, changetransposition, changeinstrument, ChangeFormat
label ClickPartition

dim KGF$ : KGF$ = "KGF.dll"         

dim w%, h%, dline%, x%, y%, cr%, cv%, cb%, note1%, note%, i%, j%, nom$, notes$, s$
dim res%, no%, temp%
dim octave%, delta%, instrument%, instrument1%, canal%
dim couleur%, hauteur%, dhauteur%, hligne%, f$
dim tabBlanches%(7), tabNoires%(5)                           
dim nomBlanches$(7), nomNoires$(5)
dim DeltaTranspositions%(127), DeltaTransposition%
dim tabOctave$, nomOctave$, nomNote$
dim NombreCanaux%, CanalActuel%, VolumeDefaut%, ExportFormat%
dim note2%, octave2%, nomOctave2$, delta2%, note2a%, nomNote2$
dim ClickCanal%, ClickNote%, SaveCanal%, SaveNote%

data "do",60,"re",62,"mi",64,"fa",65,"sol",67,"la",69,"si",71  : ' notes blanches
data "do#",61,"re#",63,"fa#",66,"sol#",68,"la#",70              : ' notes noires

' ici; décalage de transposition, nom instrument
data 0,"Bright acoustic piano"
data 0,"Electric grand piano"
data 0,"Honky-tonk piano"
data 0,"Rhodes piano"
data 0,"Chorused piano"
data 0,"Harpsichord"
data 0,"Clavinet"
data 0,"Celesta"
data 0,"Glockenspiel"
data 0,"Music box"
data 0,"Vibraphone"
data 0,"Marimba"
data 0,"Xylophone"
data 0,"Tubular bells"
data 0,"Dulcimer"
data 0,"Hammond organ"
data 0,"Percussive organ"
data 0,"Rock organ"
data 0,"Church organ"
data 0,"Reed organ"
data 0,"Accordion"
data 0,"Harmonica"
data 0,"Tango accordion"
data 0,"Acoustic guitar (nylon)"
data 0,"Acoustic guitar (steel)"
data 0,"Electric guitar (jazz)"
data 0,"Electric guitar (clean)"
data 0,"Electric guitar (muted)"
data 0,"Overdriven guitar"
data 0,"Distortion guitar"
data 0,"Guitar harmonics"
data 0,"Acoustic bass"
data 0,"Electric bass (finger)"
data 0,"Electric bass (pick)"
data 0,"Fretless bass"
data 0,"Slap bass 1"
data 0,"Slap bass 2"
data 0,"Synth bass 1"
data 0,"Synth bass 2"
data 0,"Violin"
data 0,"Viola"
data 0,"Cello"
data 0,"Contrabass"
data 0,"Tremolo strings"
data 0,"Pizzicato strings"
data 0,"Orchestral harp"
data 0,"Timpani"
data 0,"String ensemble 1"
data 0,"String ensemble 2"
data 0,"Synth. strings 1"
data 0,"Synth. strings 2"
data 0,"Choir Aahs"
data 0,"Voice Oohs"
data 0,"Synth voice"
data 0,"Orchestra hit"
data 0,"Trumpet"
data 0,"Trombone"
data 0,"Tuba#966"
data 0,"Muted trumpet"
data 0,"French horn"
data 0,"Brass section"
data 0,"Synth. brass 1"
data 0,"Synth. brass 2"
data 0,"Soprano sax"
data 0,"Alto sax"
data 0,"Tenor sax"
data 0,"Baritone sax"
data 0,"Oboe"
data 0,"English horn"
data 0,"Bassoon"
data 0,"Clarinet"
data 0,"Piccolo"
data 0,"Flute"
data 0,"Recorder"
data 0,"Pan flute"
data 0,"Bottle blow"
data 0,"Shakuhachi"
data 0,"Whistle"
data 0,"Ocarina"
data 0,"Lead 1 (square)"
data 0,"Lead 2 (sawtooth)"
data 0,"Lead 3 (calliope lead)"
data 0,"Lead 4 (chiff lead)"
data 0,"Lead 5 (charang)"
data 0,"Lead 6 (voice)"
data 0,"Lead 7 (fifths)"
data 0,"Lead 8 (brass + lead)"
data 0,"Pad 1 (new age)"
data 0,"Pad 2 (warm)"
data 0,"Pad 3 (polysynth)"
data 0,"Pad 4 (choir)"
data 0,"Pad 5 (bowed)"
data 0,"Pad 6 (metallic)"
data 0,"Pad 7 (halo)"
data 0,"Pad 8 (sweep)"
data 0,"Synth SFX 1 Ice Rain"
data 0,"Synth SFX 2 Sound Track"
data 0,"Synth SFX 3 Crystal"
data 0,"Synth SFX 4 Atmosphere"
data 0,"Synth SFX 5 Brightness"
data 0,"Synth SFX 6 Goblin"
data 0,"Synth SFX 7 Echo Drops"
data 0,"Synth SFX 8 Star Theme"
data 0,"Sitar"
data 0,"Banjo"
data 0,"Shamisen"
data 0,"Koto"
data 0,"Kalimba"
data 0,"Bagpipe"
data 0,"Fiddle"
data 0,"Shanai"
data 0,"Tinkle Bells"
data 0,"Agogo"
data 0,"Steel Drums"
data 0,"Woodblock"
data 0,"Taiko Drum"
data 0,"Melodic Drum"
data 0,"Synth Drum"
data 0,"Reverse Cymbal"
data 0,"Guitar fret noise"
data 0,"Breath noise"
data 0,"Seashore"
data 0,"Bird tweet"
data 0,"Telephone ring"
data 0,"Helicopter"
data 0,"Applause"
data 0,"Gunshot"


tabOctave$ = "dcba0123"
VolumeDefaut% = 80

for i%=1 to 7
  read nomBlanches$(i%)
  read tabBlanches%(i%)
next i%
for i%=1 to 5
  read nomNoires$(i%)
  read tabNoires%(i%)
next i%
for i%=1 to 127
  DeltaTranspositions%(i%) = 0
next i%

octave% = 5
delta% = 0
hauteur% = 5*dline%
hligne% = 20

full_space 0


picture 1 : top 1,140 : left 1,30 : on_click 1,ClickPartition
  width 1,width_client(0)-30 : height 1,height_client(0)-140
w% = width_client(1)
dline% = 10

picture 2 : width 2,1020 : height 2,80
2d_target_is 2
2d_pen_color 1,0,0
DessinerOctave(1,-100)
DessinerOctave(2,40)
DessinerOctave(3,180)
DessinerOctave(4,320)
DessinerOctave(5,460)
DessinerOctave(6,600)
DessinerOctave(7,740)
DessinerOctave(8,880)
on_mouse_move 2,MovePiano

container_option 100 : top 100,135 : left 100,0 : width 100,35 : height 100,height(1)+5
  i% = 40
  no% = 100
  while i%<height_client(1)
    no% = no% + 1
    option no% : parent no%,100 : top no%,i% : left no%,10 : width no%,20 : on_click no%,changecanal
    i% = i% + 100
  end_while
  NombreCanaux% = no% - 100
dim NotesCumulees%(NombreCanaux%,100), NomsCumulees$(NombreCanaux%,100)
dim OctavesCumulees%(NombreCanaux%,100), Note1Cumulees%(NombreCanaux%,100)
dim NoteCouleurCumulees%(NombreCanaux%,100), NombreCumulees%(NombreCanaux%)
dim InstrumentsCumules%(NombreCanaux%,100), adresse%(NombreCanaux%,100)
dim CanalPlein%(NombreCanaux%), VolumesCumules%(NombreCanaux%,100)
for i%=1 to NombreCanaux%
  NombreCumulees%(i%) = 0
  CanalPlein%(i%) = 0
  Adresse%(i%,0) = 0
  InstrumentsCumules%(i%,0) = 1
  VolumesCumules%(i%,0) = VolumeDefaut%
next i%

on_click 2,clickPiano

container_option 3 : top 3,10 : width 3,130 : height 3,40 : left 3,width(2)+10
  caption 3,"Octaves"
option 31 : parent 31,3 : top 31,15 : left 31,5 :  width 31,20
option 32 : parent 32,3 : top 32,15 : left 32,20 : width 32,20
option 33 : parent 33,3 : top 33,15 : left 33,35 : width 33,20
option 34 : parent 34,3 : top 34,15 : left 34,50 : width 34,20
option 35 : parent 35,3 : top 35,15 : left 35,65 : width 35,20
option 36 : parent 36,3 : top 36,15 : left 36,80 : width 36,20
option 37 : parent 37,3 : top 37,15 : left 37,95 : width 37,20
option 38 : parent 38,3 : top 38,15 : left 38,110 : width 38,15
mark_on 30+octave%
set_focus 30+octave%

2d_target_is 1
2d_fill_off
print_target_is 1
font_size 1,8

button 11 : top 11,100 : left 11,320 : caption 11,"Effacer" : on_click 11,Effacer
dlist 5
save_dialog 6 : filter 6,"Fichiers texte (*.TXT)|*.txt"
alpha 8 : top 8,110 : left 8,10 : caption 8,"Note jouée:"
alpha 7 : top 7,110 : left 7,80 : font_bold 7
button 9 : top 9,100 : left 9,left(11)+width(11) : caption 9,"Jouer" : on_click 9,jouer

alpha 60 : top 60,110 : left 60,left(9)+width(9)+20 : caption 60,"Format:"
combo 61 : top 61,105 : left 61,left(60)+50 : width 61,80 : on_change 61,ChangeFormat
  item_add 61,"Composeur"
  item_add 61,"MIDI_Load"
  text 61,item_read$(61,2)
ExportFormat% = 2
button 4 : top 4,100 : left 4,left(61)+width(61) : caption 4,"Exporter" : on_click 4,exporter

button 12 : top 12,top(2)+height(2) : left 12,0 : width 12,width(2) : height 12,15 : caption 12,"Pause" : on_click 12,PianoPause

combo 40 : top 40,60 : left 40,width(2)+10 : width 40,150
for i%=1 to 127
  read DeltaTranspositions%(i%)
  read s$
  item_add 40,s$
next i%
text 40,item_read$(40,1)
on_click 40,changeinstrument
instrument1% = 0
instrument% = 1

alpha 41 : top 41,90 : left 41,left(40) : caption 41,"Volume:"
scroll_bar 42 : top 42,90 : left 42,left(41)+50 : width 42,150
  min 42,0 : max 42,127 : position 42,VolumeDefaut% : on_change 42,changevolume
alpha 43: top 43,90 : left 43,left(42)+width(42)+10 : caption 43,"80"

alpha 51 : top 51,120 : left 51,left(40) : caption 51,"Transpo:"
scroll_bar 52 : top 52,120 : left 52,left(51)+50 : width 52,150
  min 52,-11 : max 52,11 : position 52,0 : on_change 52,changetransposition
alpha 53: top 53,120 : left 53,left(52)+width(52)+10 : caption 53,"0"

  CanalActuel% = 1
  mark_on 100+CanalActuel%

image 201              : ' image de travail interne
SaveCanal% = 0
SaveNote%  = 0

trame()
active 0

end

changevolume:
  caption 43,str$(position(42))
  VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%)) = position(42)
  return

changetransposition:
  caption 53,str$(position(52))
  DeltaTranspositions%(instrument%) = position(52)
  DeltaTransposition% = position(52)
  return

PianoPause:
  if CanalPlein%(CanalActuel%)=1 then return
  nomNote$ = "[]"
  caption 7, "pause 0 = "+nomNote$
  hauteur% = 2*dline%
  note% = 0
  note1% = 0
  couleur% = 1
 
  NombreCumulees%(CanalActuel%) = NombreCumulees%(CanalActuel%) + 1
  NotesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))      = note%
  NomsCumulees$(CanalActuel%,NombreCumulees%(CanalActuel%))        = nomNote$
  OctavesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))    = octave%
  Note1Cumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))      = note1%
  NoteCouleurCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%)) = couleur%
  InstrumentsCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))  = instrument%
  VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))      = position(42)
 
  DessinerPause()
  adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)) = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)-1) + 20
  return
 
changeinstrument:
  instrument% = item_index(40)
  position 52,DeltaTranspositions%(instrument%)
  DeltaTransposition% = DeltaTranspositions%(instrument%)
  return
 
ChangeFormat:
  ExportFormat% = item_index(61)
  return
   
MovePiano:
  off_mouse_move 2
  MovePiano()
  on_mouse_move 2,MovePiano
  return
 
clickPiano:
  if CanalPlein%(CanalActuel%)=1 then return
 
  x% = mouse_x_left_down(2)
  y% = mouse_y_left_down(2)
  cr% = color_pixel_red(2,x%,y%)
  cv% = color_pixel_green(2,x%,y%)
  cb% = color_pixel_blue(2,x%,y%)

  if cr%=255            : ' c'est une blanche ?
    note1% = 255 - cb%
    octave% = 255 - cv%
    note% = tabBlanches%(note1%) + DeltaTransposition%
   
    if note%<tabBlanches%(1)
      note% = note% + 12
      octave% = octave% - 1
    end_if
    if note%>tabBlanches%(7)
      note% = note% - 12
      octave% = octave% + 1
    end_if
    for i%=1 to 7
      if tabBlanches%(i%)=note%
        note1% = i%
        couleur% = 1
        exit_for
      end_if
    next i%
    for i%=1 to 5
      if tabNoires%(i%)=note%
        note1% = i%
        couleur% = 2
        exit_for
      end_if
    next i%
   
    nomOctave$ = mid$(tabOctave$,octave%,1)
    delta% = (octave%-5)*12
    if instrument%<>instrument1%
      nomNote$ = "i"+right$("00"+str$(instrument%),3)+"+"+nomOctave$+nomBlanches$(note1%)
    else
      nomNote$ = "+"+nomOctave$+nomBlanches$(note1%)
    end_if
   
    if couleur%=1
      note% = tabBlanches%(note1%) + delta%
      nomNote$ = "+"+nomOctave$+nomBlanches$(note1%)
      nomNote$ = "["+nomNote$+str$(position(42))+"-]"
      caption 7, "blanche "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
    else
      note% = tabNoires%(note1%) + delta%
      nomNote$ = "+"+nomOctave$+nomNoires$(note1%)
      nomNote$ = "["+nomNote$+str$(position(42))+"-]"
      caption 7, "noire "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
    end_if
   
    hauteur% = 5*dline% - (note1%-1)*dline%/2
  else
    if cr%=0            : ' est-ce une noire ?
      note1% = cb%
      octave% = cv%
      note% = tabNoires%(note1%)
     
      couleur% = 0
      note% = note% + DeltaTransposition%
      if note%<tabBlanches%(1)
        note% = note% + 12
        octave% = octave% - 1
      end_if
      if note%>tabBlanches%(7)
        note% = note% - 12
        octave% = octave% + 1
      end_if
      for i%=1 to 7
        if tabBlanches%(i%)=note%
          note1% = i%
          couleur% = 1
          exit_for
        end_if
      next i%
      for i%=1 to 5
        if tabNoires%(i%)=note%
          note1% = i%
          couleur% = 2
          exit_for
        end_if
      next i%
     
      nomOctave$ = mid$(tabOctave$,octave%,1)
      delta% = (octave%-5)*12
      if instrument%<>instrument1%
        nomNote$ = "i"+right$("00"+str$(instrument%),3)+"+"+nomOctave$+nomNoires$(note1%)
      else
        nomNote$ = "+"+nomOctave$+nomNoires$(note1%)
      end_if
      if couleur%=1
        note% = tabBlanches%(note1%) + delta%
        nomNote$ = "+"+nomOctave$+nomBlanches$(note1%)
        nomNote$ = "["+nomNote$+str$(position(42))+"-]"
        caption 7, "blanche "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
      else
        note% = tabNoires%(note1%) + delta%
        nomNote$ = "+"+nomOctave$+nomNoires$(note1%)
        nomNote$ = "["+nomNote$+str$(position(42))+"-]"
        caption 7, "noire "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
      end_if
      hauteur% = 5*dline% - (note1%-1)*dline%/2
      if note1%>2 then hauteur% = hauteur% - dline%/2
    end_if
  end_if
  instrument1% = instrument%
  mark_on 30+octave%
  set_focus 30+octave%
  display
 
  NombreCumulees%(CanalActuel%) = NombreCumulees%(CanalActuel%) + 1
  NotesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))      = note%
  NomsCumulees$(CanalActuel%,NombreCumulees%(CanalActuel%))        = nomNote$
  OctavesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))    = octave%
  Note1Cumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))      = note1%
  NoteCouleurCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%)) = couleur%
  InstrumentsCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))  = instrument%
  VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))      = position(42)
 
  DessinerNote()
  adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)) = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)-1) + 20
 
  return
 
exporter:
  temp% = 0
  for i%=1 to NombreCanaux%
    if NombreCumulees%(i%)>0 then temp% = 1
  next i%
  if temp%=0
    message "Il n'y a rien à exporter !"
    return
  end_if
  f$ = file_name$(6)
  if f$="_" then return
  if file_exists(f$)=1
    if message_confirmation_yes_no("Ce fichier existe déjà. Remplacer ?")<>1 then return
  end_if 
  select ExportFormat%
    case 1: ' format Composeur 
      clear 5
      for j%=1 to NombreCanaux%
        item_add 5,"Canal "+str$(j%)
        if NombreCumulees%(j%)>0
          for i%=1 to NombreCumulees%(j%)
            item_add 5,NomsCumulees$(j%,i%)+"="+str$(NotesCumulees%(j%,i%))
          next i%
        end_if
      next j%
      file_save 5,f$
    case 2: ' format MIDI_LOAD
      clear 5
      item_add 5,"#MIDI_EXPORT"
      item_add 5,str$(NombreCanaux%)
      temp% = 0
      for i%=1 to NombreCanaux%
        if NombreCumulees%(i%)>temp% then temp% = NombreCumulees%(i%)
      next i%
      for i%=1 to temp%
        for j%=1 to NombreCanaux%
          if i%<=NombreCumulees%(j%)
            item_add 5,str$(InstrumentsCumules%(j%,i%))+","+str$(NotesCumulees%(j%,i%))+","+str$(VolumesCumules%(j%,i%))+",1,1"
          else
            item_add 5,"0,0,0,0,0"
          end_if
        next j%
      next i%
      file_save 5,f$
      return
  end_select
  return
 
effacer:
  color 1,255,255,255
  CanalActuel% = 1
  mark_on 100+CanalActuel%
  set_focus 100+CanalActuel%
  for i%=1 to NombreCanaux%
    NombreCumulees%(i%) = 0
    CanalPlein%(i%) = 0
    Adresse%(i%,0) = 0
    InstrumentsCumules%(i%,0) = 1
    VolumesCumules%(i%,0) = VolumeDefaut%
  next i%
  position 42,VolumeDefaut%
  trame()
  return
 
jouer:
  temp% = 0
  for i%=1 to NombreCanaux%
    if NombreCumulees%(i%)>0 then temp% = 1
  next i%
  if temp%=0
    message "Il n'y a rien à exporter !"
    return
  end_if
  dll_on KGF$
 
  res% = DLL_call0("MIDI_Initialize")
  res% = DLL_call1("MIDI_Reset",NombreCanaux%)
  for j%=1 to NombreCanaux%
    notes$ = ""
    for i%=1 to NombreCumulees%(j%)
      notes$ = notes$ + NomsCumulees$(j%,i%) + " "
    next i%
    res% = DLL_call3("MIDI_Compile",j%,0,adr(notes$))
  next j%
  res% = DLL_call1("MIDI_Play",10)
  res% = DLL_call0("MIDI_Stop")
 
  dll_off
  return
 
changecanal:
  CanalActuel% = number_click - 100
  set_focus 100+CanalActuel%
  text 40,item_read$(40,InstrumentsCumules%(CanalActuel%,NombreCumulees%(CanalActuel%)))
  position 42,VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))
  return
 
ClickPartition:
  x% = mouse_x_left_down(1)
  y% = mouse_y_left_down(1)
  ClickCanal% = (y%-20+99)/100 
  ClickNote% = (x%-20+19)/20
  if ClickNote%>NombreCumulees%(ClickCanal%) then return
  MarquerClick(ClickCanal%,ClickNote%)
 
  return 
 
 
 
sub DessinerPause()
  dim_local a%, hligne%
  a% = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)-1) + 20
  hligne% = 20 + (CanalActuel%-1)*100
  2d_rectangle a%,hligne%+hauteur%,a%+dline%,hligne%+hauteur%+dline%/2
  if adresse%(CanalActuel%,NombreCumulees%(CanalActuel%))>(width_client(1)-25) then CanalPlein%(CanalActuel%) = 1
end_sub
 
sub DessinerNote()
  dim_local a%, hligne%
  a% = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)-1) + 20
  hligne% = 20 + (CanalActuel%-1)*100
  if NoteCouleurCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))=2
    print_locate a%-9,hligne%+hauteur%-7
    print "#"
    a% = a% + 5
    adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)) = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)) + 3
  end_if
  2d_circle a%,hligne%+hauteur%,dline%/2
  if Note1Cumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))=1
  2d_line a%-7,hligne%+hauteur%,a%+7,hligne%+hauteur%
  end_if
  print_locate a%-5,hligne%+57
  print mid$(tabOctave$,octave%,1)
 
  if adresse%(CanalActuel%,NombreCumulees%(CanalActuel%))>(width_client(1)-25) then CanalPlein%(CanalActuel%) = 1

end_sub

sub trame()
  ' v% donne le numéro de la trame dans la page (1=première ligne)
  dim_local hligne%, v%
  v% = 0
  hligne% = 0
  for v%=1 to NombreCanaux%
    hligne% = 20 + (v%-1)*100
    2d_line 0,hligne%,w%,hligne%
    2d_line 0,hligne%+dline%,w%,hligne%+dline%
    2d_line 0,hligne%+2*dline%,w%,hligne%+2*dline%
    2d_line 0,hligne%+3*dline%,w%,hligne%+3*dline%
    2d_line 0,hligne%+4*dline%,w%,hligne%+4*dline%

    ' séparateur de mesure
    2d_line 10,hligne%,10,hligne%+4*dline%
  next v%
end_sub

sub DessinerOctave(id%,x%)
  2d_fill_color 255,255-id%,254
  2d_rectangle x%,0,x%+20,80
  2d_fill_color 255,255-id%,253
  2d_rectangle x%+20,0,x%+40,80
  2d_fill_color 255,255-id%,252
  2d_rectangle x%+40,0,x%+60,80
  2d_fill_color 255,255-id%,251
  2d_rectangle x%+60,0,x%+80,80
  2d_fill_color 255,255-id%,250
  2d_rectangle x%+80,0,x%+100,80
  2d_fill_color 255,255-id%,249
  2d_rectangle x%+100,0,x%+120,80
  2d_fill_color 255,255-id%,248
  2d_rectangle x%+120,0,x%+140,80
'  2d_pen_color 0,id%,1
  2d_fill_color 0,id%,1
  2d_rectangle x%+12,0,x%+28,40
  2d_fill_color 0,id%,2
  2d_rectangle x%+32,0,x%+48,40
  2d_fill_color 0,id%,3
  2d_rectangle x%+72,0,x%+88,40
  2d_fill_color 0,id%,4
  2d_rectangle x%+92,0,x%+108,40
  2d_fill_color 0,id%,5
  2d_rectangle x%+112,0,x%+128,40
end_sub

sub MovePiano()
  dim_local i%, couleur2%
   
  x% = mouse_x_position(2)
  y% = mouse_y_position(2)
  cr% = color_pixel_red(2,x%,y%)
  cv% = color_pixel_green(2,x%,y%)
  cb% = color_pixel_blue(2,x%,y%)
 
  if cb%=0 then exit_sub  : ' ne pas réagir sur une bordure de touche !
 
  if cr%=255            : ' c'est une blanche ?
    note2% = 255 - cb%
    octave2% = 255 - cv%
    note2a% = tabBlanches%(note2%)

    couleur2% = 0
    note2a% = note2a% + DeltaTransposition%
    if note2a%<tabBlanches%(1)
      note2a% = note2a% + 12
      octave2% = octave2% - 1
    end_if
    if note2a%>tabBlanches%(7)
      note2a% = note2a% - 12
      octave2% = octave2% + 1
    end_if
    for i%=1 to 7
      if tabBlanches%(i%)=note2a%
        note2% = i%
        couleur2% = 1
        exit_for
      end_if
    next i%
    for i%=1 to 5
      if tabNoires%(i%)=note2a%
        note2% = i%
        couleur2% = 2
        exit_for
      end_if
    next i%
   
    nomOctave2$ = mid$(tabOctave$,octave2%,1)
    delta2% = (octave2%-5)*12
    if couleur2%=1
      note2a% = tabBlanches%(note2%) + delta2%
      nomNote2$ = "+"+nomOctave2$+nomBlanches$(note2%)
      nomNote2$ = "["+nomNote2$+str$(position(42))+"-]"
      caption 7, "blanche "+str$(note2%)+"  "+str$(note2a%)+" = "+nomNote2$
    else
      note2a% = tabNoires%(note2%) + delta2%
      nomNote2$ = "+"+nomOctave2$+nomNoires$(note2%)
      nomNote2$ = "["+nomNote2$+str$(position(42))+"-]"
      caption 7, "noire "+str$(note2%)+"  "+str$(note2a%)+" = "+nomNote2$
    end_if
  else
    if cr%=0            : ' est-ce une noire ?
      note2% = cb%
      octave2% = cv%
      note2a% = tabNoires%(note2%)
     
      couleur2% = 0
      note2a% = note2a% + DeltaTransposition%
      if note2a%<tabBlanches%(1)
        note2a% = note2a% + 12
        octave2% = octave2% - 1
      end_if
      if note2a%>tabBlanches%(7)
        note2a% = note2a% - 12
        octave2% = octave2% + 1
      end_if
      for i%=1 to 7
        if tabBlanches%(i%)=note2a%
          note2% = i%
          couleur2% = 1
          exit_for
        end_if
      next i%
      for i%=1 to 5
        if tabNoires%(i%)=note2a%
          note2% = i%
          couleur2% = 2
          exit_for
        end_if
      next i%
 
      nomOctave2$ = mid$(tabOctave$,octave2%,1)
      delta2% = (octave2%-5)*12
      if couleur2%=1
        note2a% = tabBlanches%(note2%) + delta2%
        nomNote2$ = "+"+nomOctave2$+nomBlanches$(note2%)
        nomNote2$ = "["+nomNote2$+str$(position(42))+"-]"
        caption 7, "blanche "+str$(note2%)+"  "+str$(note2a%)+" = "+nomNote2$
      else
        note2a% = tabNoires%(note2%) + delta2%
        nomNote2$ = "+"+nomOctave2$+nomNoires$(note2%)
        nomNote2$ = "["+nomNote2$+str$(position(42))+"-]"
        caption 7, "noire "+str$(note2%)+"  "+str$(note2a%)+" = "+nomNote2$
      end_if
    end_if
  end_if

end_sub
                               
sub MarquerClick()
  dim_local hligne%, x%
  if SaveCanal%>0
    hligne% = (SaveCanal%-1)*100
    x% = 20*SaveNote% -7
    2d_image_paste 201,x%,hligne%
  end_if   
  SaveCanal% = ClickCanal%
  SaveNote% = ClickNote%
  hligne% = (ClickCanal%-1)*100
  x% = 20*ClickNote% -7
  2d_image_copy 201,x%,hligne%,x%+19,hligne%+99
  2d_fill_color 200,200,255
  2d_pen_color 200,200,255
  2d_rectangle x%,hligne%,x%+19,hligne%+99
 
  2d_pen_color 0,0,0
  2d_line x%,hligne%+20,x%+19,hligne%+20
  2d_line x%,hligne%+20+dline%,x%+19,hligne%+20+dline%
  2d_line x%,hligne%+20+2*dline%,x%+19,hligne%+20+2*dline%
  2d_line x%,hligne%+20+3*dline%,x%+19,hligne%+20+3*dline%
  2d_line x%,hligne%+20+4*dline%,x%+19,hligne%+20+4*dline%
 
  if NotesCumulees%(ClickCanal%,ClickNote%)=0
    RedessinerPause()
  else
    RedessinerNote()
  end_if
 
  2d_fill_color 255,255,255
   
end_sub

sub RedessinerPause()
  dim_local a%, hligne%
  a% = adresse%(ClickCanal%,ClickNote%)
  hligne% = (ClickCanal%-1)*100
  hauteur% = 2*dline%
  2d_rectangle a%,hligne%+20+hauteur%,a%+dline%,hligne%+20+hauteur%+dline%/2
end_sub

sub RedessinerNote()   
  dim_local a%, hligne%
 
  a% = adresse%(ClickCanal%,ClickNote%)
  hligne% = 20 + (ClickCanal%-1)*100
  hauteur% = 5*dline% - (Note1Cumulees%(ClickCanal%,ClickNote%)-1)*dline%/2
 
  if NoteCouleurCumulees%(ClickCanal%,ClickNote%)=2
    hauteur% = 5*dline% - (Note1Cumulees%(ClickCanal%,ClickNote%)-1)*dline%/2
    if Note1Cumulees%(ClickCanal%,ClickNote%)>2 then hauteur% = hauteur% - dline%/2
    print_locate a%-9,hligne%+hauteur%-7
    print "#"
    a% = a% + 5
  end_if
  2d_circle a%,hligne%+hauteur%,dline%/2
  if Note1Cumulees%(ClickCanal%,ClickNote%)=1
  2d_line a%-7,hligne%+hauteur%,a%+7,hligne%+hauteur%
  end_if
  print_locate a%-5,hligne%+57
  print mid$(tabOctave$,octave%,1) 

  end_sub

Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

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

MessageSujet: Re: Maquette d'une rédaction de partition de piano   Mer 7 Fév 2018 - 0:52

Et voici la version qui permet le remplacement de notes ou pauses par une autre note ou une pause. Pour cela, dans une partition déjà saisie, on clique sur la note à remplacer, et elle sera marquée par un fond en couleur. Ensuite, on clique sur le bouton "Remplacer", puis sur une touche quelconque du piano, avec la sélection de volume et/ou instrument nécessaire, ou alors sur la touche "Pause", et la noté sélectionnée sera remplacée par la note choisie ou par la pause.
Code:
' Composeur_de_Partition.bas

inactive 0
caption 0,"Composeur de Partition"

label clickPiano, exporter, changevolume, jouer, effacer, changecanal
label PianoPause, MovePiano, changetransposition, changeinstrument, ChangeFormat
label ClickPartition, Remplacer

dim KGF$ : KGF$ = "KGF.dll"          

dim w%, h%, dline%, x%, y%, cr%, cv%, cb%, note1%, note%, i%, j%, nom$, notes$, s$
dim res%, no%, temp%
dim octave%, delta%, instrument%, instrument1%, canal%
dim couleur%, hauteur%, dhauteur%, hligne%, f$
dim tabBlanches%(7), tabNoires%(5)                            
dim nomBlanches$(7), nomNoires$(5)
dim DeltaTranspositions%(127), DeltaTransposition%
dim tabOctave$, nomOctave$, nomNote$
dim NombreCanaux%, CanalActuel%, VolumeDefaut%, ExportFormat%
dim note2%, octave2%, nomOctave2$, delta2%, note2a%, nomNote2$
dim ClickCanal%, ClickNote%, SaveCanal%, SaveNote%, ModeRemplacement%

data "do",60,"re",62,"mi",64,"fa",65,"sol",67,"la",69,"si",71   : ' notes blanches
data "do#",61,"re#",63,"fa#",66,"sol#",68,"la#",70              : ' notes noires

' ici; décalage de transposition, nom instrument
data 0,"Bright acoustic piano"
data 0,"Electric grand piano"
data 0,"Honky-tonk piano"
data 0,"Rhodes piano"
data 0,"Chorused piano"
data 0,"Harpsichord"
data 0,"Clavinet"
data 0,"Celesta"
data 0,"Glockenspiel"
data 0,"Music box"
data 0,"Vibraphone"
data 0,"Marimba"
data 0,"Xylophone"
data 0,"Tubular bells"
data 0,"Dulcimer"
data 0,"Hammond organ"
data 0,"Percussive organ"
data 0,"Rock organ"
data 0,"Church organ"
data 0,"Reed organ"
data 0,"Accordion"
data 0,"Harmonica"
data 0,"Tango accordion"
data 0,"Acoustic guitar (nylon)"
data 0,"Acoustic guitar (steel)"
data 0,"Electric guitar (jazz)"
data 0,"Electric guitar (clean)"
data 0,"Electric guitar (muted)"
data 0,"Overdriven guitar"
data 0,"Distortion guitar"
data 0,"Guitar harmonics"
data 0,"Acoustic bass"
data 0,"Electric bass (finger)"
data 0,"Electric bass (pick)"
data 0,"Fretless bass"
data 0,"Slap bass 1"
data 0,"Slap bass 2"
data 0,"Synth bass 1"
data 0,"Synth bass 2"
data 0,"Violin"
data 0,"Viola"
data 0,"Cello"
data 0,"Contrabass"
data 0,"Tremolo strings"
data 0,"Pizzicato strings"
data 0,"Orchestral harp"
data 0,"Timpani"
data 0,"String ensemble 1"
data 0,"String ensemble 2"
data 0,"Synth. strings 1"
data 0,"Synth. strings 2"
data 0,"Choir Aahs"
data 0,"Voice Oohs"
data 0,"Synth voice"
data 0,"Orchestra hit"
data 0,"Trumpet"
data 0,"Trombone"
data 0,"Tuba#966"
data 0,"Muted trumpet"
data 0,"French horn"
data 0,"Brass section"
data 0,"Synth. brass 1"
data 0,"Synth. brass 2"
data 0,"Soprano sax"
data 0,"Alto sax"
data 0,"Tenor sax"
data 0,"Baritone sax"
data 0,"Oboe"
data 0,"English horn"
data 0,"Bassoon"
data 0,"Clarinet"
data 0,"Piccolo"
data 0,"Flute"
data 0,"Recorder"
data 0,"Pan flute"
data 0,"Bottle blow"
data 0,"Shakuhachi"
data 0,"Whistle"
data 0,"Ocarina"
data 0,"Lead 1 (square)"
data 0,"Lead 2 (sawtooth)"
data 0,"Lead 3 (calliope lead)"
data 0,"Lead 4 (chiff lead)"
data 0,"Lead 5 (charang)"
data 0,"Lead 6 (voice)"
data 0,"Lead 7 (fifths)"
data 0,"Lead 8 (brass + lead)"
data 0,"Pad 1 (new age)"
data 0,"Pad 2 (warm)"
data 0,"Pad 3 (polysynth)"
data 0,"Pad 4 (choir)"
data 0,"Pad 5 (bowed)"
data 0,"Pad 6 (metallic)"
data 0,"Pad 7 (halo)"
data 0,"Pad 8 (sweep)"
data 0,"Synth SFX 1 Ice Rain"
data 0,"Synth SFX 2 Sound Track"
data 0,"Synth SFX 3 Crystal"
data 0,"Synth SFX 4 Atmosphere"
data 0,"Synth SFX 5 Brightness"
data 0,"Synth SFX 6 Goblin"
data 0,"Synth SFX 7 Echo Drops"
data 0,"Synth SFX 8 Star Theme"
data 0,"Sitar"
data 0,"Banjo"
data 0,"Shamisen"
data 0,"Koto"
data 0,"Kalimba"
data 0,"Bagpipe"
data 0,"Fiddle"
data 0,"Shanai"
data 0,"Tinkle Bells"
data 0,"Agogo"
data 0,"Steel Drums"
data 0,"Woodblock"
data 0,"Taiko Drum"
data 0,"Melodic Drum"
data 0,"Synth Drum"
data 0,"Reverse Cymbal"
data 0,"Guitar fret noise"
data 0,"Breath noise"
data 0,"Seashore"
data 0,"Bird tweet"
data 0,"Telephone ring"
data 0,"Helicopter"
data 0,"Applause"
data 0,"Gunshot"


tabOctave$ = "dcba0123"
VolumeDefaut% = 80

for i%=1 to 7
  read nomBlanches$(i%)
  read tabBlanches%(i%)
next i%
for i%=1 to 5
  read nomNoires$(i%)
  read tabNoires%(i%)
next i%
for i%=1 to 127
  DeltaTranspositions%(i%) = 0
next i%

octave% = 5
delta% = 0
hauteur% = 5*dline%
hligne% = 20
ModeRemplacement% = 0

full_space 0


picture 1 : top 1,140 : left 1,30 : on_click 1,ClickPartition
  width 1,width_client(0)-30 : height 1,height_client(0)-140
w% = width_client(1)
dline% = 10

picture 2 : width 2,1020 : height 2,80
2d_target_is 2
2d_pen_color 1,0,0
DessinerOctave(1,-100)
DessinerOctave(2,40)
DessinerOctave(3,180)
DessinerOctave(4,320)
DessinerOctave(5,460)
DessinerOctave(6,600)
DessinerOctave(7,740)
DessinerOctave(8,880)
on_mouse_move 2,MovePiano

container_option 100 : top 100,135 : left 100,0 : width 100,35 : height 100,height(1)+5
  i% = 40
  no% = 100
  while i%<height_client(1)
    no% = no% + 1
    option no% : parent no%,100 : top no%,i% : left no%,10 : width no%,20 : on_click no%,changecanal
    i% = i% + 100
  end_while
  NombreCanaux% = no% - 100
dim NotesCumulees%(NombreCanaux%,100), NomsCumulees$(NombreCanaux%,100)
dim OctavesCumulees%(NombreCanaux%,100), Note1Cumulees%(NombreCanaux%,100)
dim NoteCouleurCumulees%(NombreCanaux%,100), NombreCumulees%(NombreCanaux%)
dim InstrumentsCumules%(NombreCanaux%,100), adresse%(NombreCanaux%,100)
dim CanalPlein%(NombreCanaux%), VolumesCumules%(NombreCanaux%,100)
for i%=1 to NombreCanaux%
  NombreCumulees%(i%) = 0
  CanalPlein%(i%) = 0
  Adresse%(i%,0) = 0
  InstrumentsCumules%(i%,0) = 1
  VolumesCumules%(i%,0) = VolumeDefaut%
next i%

on_click 2,clickPiano

container_option 3 : top 3,10 : width 3,130 : height 3,40 : left 3,width(2)+10
  caption 3,"Octaves"
option 31 : parent 31,3 : top 31,15 : left 31,5 :  width 31,20
option 32 : parent 32,3 : top 32,15 : left 32,20 : width 32,20
option 33 : parent 33,3 : top 33,15 : left 33,35 : width 33,20
option 34 : parent 34,3 : top 34,15 : left 34,50 : width 34,20
option 35 : parent 35,3 : top 35,15 : left 35,65 : width 35,20
option 36 : parent 36,3 : top 36,15 : left 36,80 : width 36,20
option 37 : parent 37,3 : top 37,15 : left 37,95 : width 37,20
option 38 : parent 38,3 : top 38,15 : left 38,110 : width 38,15
mark_on 30+octave%
set_focus 30+octave%

2d_target_is 1
2d_fill_off
print_target_is 1
font_size 1,8

button 13 : top 13,100 : left 13,320 : caption 13,"Remplacer" : on_click 13,Remplacer
button 11 : top 11,100 : left 11,left(13)+width(13) : caption 11,"Effacer tout" : on_click 11,Effacer
dlist 5
save_dialog 6 : filter 6,"Fichiers texte (*.TXT)|*.txt"
alpha 8 : top 8,110 : left 8,10 : caption 8,"Note jouée:"
alpha 7 : top 7,110 : left 7,80 : font_bold 7
button 9 : top 9,100 : left 9,left(11)+width(11) : caption 9,"Jouer" : on_click 9,jouer

alpha 60 : top 60,110 : left 60,left(9)+width(9)+20 : caption 60,"Format:"
combo 61 : top 61,105 : left 61,left(60)+50 : width 61,80 : on_change 61,ChangeFormat
  item_add 61,"Composeur"
  item_add 61,"MIDI_Load"
  text 61,item_read$(61,2)
ExportFormat% = 2
button 4 : top 4,100 : left 4,left(61)+width(61) : caption 4,"Exporter" : on_click 4,exporter

button 12 : top 12,top(2)+height(2) : left 12,0 : width 12,width(2) : height 12,15 : caption 12,"Pause" : on_click 12,PianoPause

combo 40 : top 40,60 : left 40,width(2)+10 : width 40,150
for i%=1 to 127
  read DeltaTranspositions%(i%)
  read s$
  item_add 40,s$
next i%
text 40,item_read$(40,1)
on_click 40,changeinstrument
instrument1% = 0
instrument% = 1

alpha 41 : top 41,90 : left 41,left(40) : caption 41,"Volume:"
scroll_bar 42 : top 42,90 : left 42,left(41)+50 : width 42,150
  min 42,0 : max 42,127 : position 42,VolumeDefaut% : on_change 42,changevolume
alpha 43: top 43,90 : left 43,left(42)+width(42)+10 : caption 43,"80"

alpha 51 : top 51,120 : left 51,left(40) : caption 51,"Transpo:"
scroll_bar 52 : top 52,120 : left 52,left(51)+50 : width 52,150
  min 52,-11 : max 52,11 : position 52,0 : on_change 52,changetransposition
alpha 53: top 53,120 : left 53,left(52)+width(52)+10 : caption 53,"0"

  CanalActuel% = 1
  mark_on 100+CanalActuel%

image 201              : ' image de travail interne
SaveCanal% = 0
SaveNote%  = 0

trame()
active 0

end

changevolume:
  caption 43,str$(position(42))
  VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%)) = position(42)
  return

changetransposition:
  caption 53,str$(position(52))
  DeltaTranspositions%(instrument%) = position(52)
  DeltaTransposition% = position(52)
  return

PianoPause:
  if CanalPlein%(CanalActuel%)=1 then return
  nomNote$ = "[]"
  caption 7, "pause 0 = "+nomNote$
  hauteur% = 2*dline%
  note% = 0
  note1% = 0
  couleur% = 1
  
  if ModeRemplacement%=0
    NombreCumulees%(CanalActuel%) = NombreCumulees%(CanalActuel%) + 1
    NotesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))       = note%
    NomsCumulees$(CanalActuel%,NombreCumulees%(CanalActuel%))        = nomNote$
    OctavesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))     = octave%
    Note1Cumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))       = note1%
    NoteCouleurCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%)) = couleur%
    InstrumentsCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))  = instrument%
    VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))      = position(42)
  
    DessinerPause()
    adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)) = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)-1) + 20
  else
    ClickCanal% = SaveCanal%
    ClickNote% = SaveNote%
    NotesCumulees%(ClickCanal%,ClickNote%)       = note%
    NomsCumulees$(ClickCanal%,ClickNote%)        = nomNote$
    OctavesCumulees%(ClickCanal%,ClickNote%)     = octave%
    Note1Cumulees%(ClickCanal%,ClickNote%)       = note1%
    NoteCouleurCumulees%(ClickCanal%,ClickNote%) = couleur%
    InstrumentsCumules%(ClickCanal%,ClickNote%)  = instrument%
    VolumesCumules%(ClickCanal%,ClickNote%)      = position(42)

    hligne% = (ClickCanal%-1)*100
    x% = 20*ClickNote% -7
    2d_fill_color 255,255,255
    2d_pen_color 255,255,255
    2d_rectangle x%,hligne%,x%+19,hligne%+99
  
    2d_pen_color 0,0,0
    2d_line x%,hligne%+20,x%+19,hligne%+20
    2d_line x%,hligne%+20+dline%,x%+19,hligne%+20+dline%
    2d_line x%,hligne%+20+2*dline%,x%+19,hligne%+20+2*dline%
    2d_line x%,hligne%+20+3*dline%,x%+19,hligne%+20+3*dline%
    2d_line x%,hligne%+20+4*dline%,x%+19,hligne%+20+4*dline%
    RedessinerPause()
    SaveCanal% = 0
    ModeRemplacement% = 0
    font_bold_off 13
  end_if
  return
  
changeinstrument:
  instrument% = item_index(40)
  position 52,DeltaTranspositions%(instrument%)
  DeltaTransposition% = DeltaTranspositions%(instrument%)
  return
  
ChangeFormat:
  ExportFormat% = item_index(61)
  return
    
MovePiano:
  off_mouse_move 2
  MovePiano()
  on_mouse_move 2,MovePiano
  return
  
clickPiano:
  if CanalPlein%(CanalActuel%)=1 then return
  
  x% = mouse_x_left_down(2)
  y% = mouse_y_left_down(2)
  cr% = color_pixel_red(2,x%,y%)
  cv% = color_pixel_green(2,x%,y%)
  cb% = color_pixel_blue(2,x%,y%)

  if cr%=255             : ' c'est une blanche ?
    note1% = 255 - cb%
    octave% = 255 - cv%
    note% = tabBlanches%(note1%) + DeltaTransposition%
    
    if note%<tabBlanches%(1)
      note% = note% + 12
      octave% = octave% - 1
    end_if
    if note%>tabBlanches%(7)
      note% = note% - 12
      octave% = octave% + 1
    end_if
    for i%=1 to 7
      if tabBlanches%(i%)=note%
        note1% = i%
        couleur% = 1
        exit_for
      end_if
    next i%
    for i%=1 to 5
      if tabNoires%(i%)=note%
        note1% = i%
        couleur% = 2
        exit_for
      end_if
    next i%
    
    nomOctave$ = mid$(tabOctave$,octave%,1)
    delta% = (octave%-5)*12
    if instrument%<>instrument1%
      nomNote$ = "i"+right$("00"+str$(instrument%),3)+"+"+nomOctave$+nomBlanches$(note1%)
    else
      nomNote$ = "+"+nomOctave$+nomBlanches$(note1%)
    end_if
    
    if couleur%=1
      note% = tabBlanches%(note1%) + delta%
      nomNote$ = "+"+nomOctave$+nomBlanches$(note1%)
      nomNote$ = "["+nomNote$+str$(position(42))+"-]"
      caption 7, "blanche "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
    else
      note% = tabNoires%(note1%) + delta%
      nomNote$ = "+"+nomOctave$+nomNoires$(note1%)
      nomNote$ = "["+nomNote$+str$(position(42))+"-]"
      caption 7, "noire "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
    end_if
    
    hauteur% = 5*dline% - (note1%-1)*dline%/2
  else
    if cr%=0             : ' est-ce une noire ?
      note1% = cb%
      octave% = cv%
      note% = tabNoires%(note1%)
      
      couleur% = 0
      note% = note% + DeltaTransposition%
      if note%<tabBlanches%(1)
        note% = note% + 12
        octave% = octave% - 1
      end_if
      if note%>tabBlanches%(7)
        note% = note% - 12
        octave% = octave% + 1
      end_if
      for i%=1 to 7
        if tabBlanches%(i%)=note%
          note1% = i%
          couleur% = 1
          exit_for
        end_if
      next i%
      for i%=1 to 5
        if tabNoires%(i%)=note%
          note1% = i%
          couleur% = 2
          exit_for
        end_if
      next i%
      
      nomOctave$ = mid$(tabOctave$,octave%,1)
      delta% = (octave%-5)*12
      if instrument%<>instrument1%
        nomNote$ = "i"+right$("00"+str$(instrument%),3)+"+"+nomOctave$+nomNoires$(note1%)
      else
        nomNote$ = "+"+nomOctave$+nomNoires$(note1%)
      end_if
      if couleur%=1
        note% = tabBlanches%(note1%) + delta%
        nomNote$ = "+"+nomOctave$+nomBlanches$(note1%)
        nomNote$ = "["+nomNote$+str$(position(42))+"-]"
        caption 7, "blanche "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
      else
        note% = tabNoires%(note1%) + delta%
        nomNote$ = "+"+nomOctave$+nomNoires$(note1%)
        nomNote$ = "["+nomNote$+str$(position(42))+"-]"
        caption 7, "noire "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
      end_if
      hauteur% = 5*dline% - (note1%-1)*dline%/2
      if note1%>2 then hauteur% = hauteur% - dline%/2
    end_if
  end_if
  instrument1% = instrument%
  mark_on 30+octave%
  set_focus 30+octave%
  display
  
  if ModeRemplacement%=0
    NombreCumulees%(CanalActuel%) = NombreCumulees%(CanalActuel%) + 1
    NotesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))       = note%
    NomsCumulees$(CanalActuel%,NombreCumulees%(CanalActuel%))        = nomNote$
    OctavesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))     = octave%
    Note1Cumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))       = note1%
    NoteCouleurCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%)) = couleur%
    InstrumentsCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))  = instrument%
    VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))      = position(42)
  
    DessinerNote()
    adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)) = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)-1) + 20
  else
    ClickCanal% = SaveCanal%
    ClickNote% = SaveNote%
    
    NotesCumulees%(ClickCanal%,ClickNote%)       = note%
    NomsCumulees$(ClickCanal%,ClickNote%)        = nomNote$
    OctavesCumulees%(ClickCanal%,ClickNote%)     = octave%
    Note1Cumulees%(ClickCanal%,ClickNote%)       = note1%
    NoteCouleurCumulees%(ClickCanal%,ClickNote%) = couleur%
    InstrumentsCumules%(ClickCanal%,ClickNote%)  = instrument%
    VolumesCumules%(ClickCanal%,ClickNote%)      = position(42)  
    
    hligne% = (ClickCanal%-1)*100
    x% = 20*ClickNote% -7
    2d_fill_color 255,255,255
    2d_pen_color 255,255,255
    2d_rectangle x%,hligne%,x%+19,hligne%+99
    
    2d_pen_color 0,0,0  
    2d_line x%,hligne%+20,x%+19,hligne%+20
    2d_line x%,hligne%+20+dline%,x%+19,hligne%+20+dline%
    2d_line x%,hligne%+20+2*dline%,x%+19,hligne%+20+2*dline%
    2d_line x%,hligne%+20+3*dline%,x%+19,hligne%+20+3*dline%
    2d_line x%,hligne%+20+4*dline%,x%+19,hligne%+20+4*dline%
    RedessinerNote()
    SaveCanal% = 0
    ModeRemplacement% = 0
    font_bold_off 13
  end_if
  return
  
exporter:
  temp% = 0
  for i%=1 to NombreCanaux%
    if NombreCumulees%(i%)>0 then temp% = 1
  next i%
  if temp%=0
    message "Il n'y a rien à exporter !"
    return
  end_if
  f$ = file_name$(6)
  if f$="_" then return
  if file_exists(f$)=1
    if message_confirmation_yes_no("Ce fichier existe déjà. Remplacer ?")<>1 then return
  end_if  
  select ExportFormat%
    case 1: ' format Composeur  
      clear 5
      for j%=1 to NombreCanaux%
        item_add 5,"Canal "+str$(j%)
        if NombreCumulees%(j%)>0
          for i%=1 to NombreCumulees%(j%)
            item_add 5,NomsCumulees$(j%,i%)+"="+str$(NotesCumulees%(j%,i%))
          next i%
        end_if
      next j%
      file_save 5,f$
    case 2: ' format MIDI_LOAD
      clear 5
      item_add 5,"#MIDI_EXPORT"
      item_add 5,str$(NombreCanaux%)
      temp% = 0
      for i%=1 to NombreCanaux%
        if NombreCumulees%(i%)>temp% then temp% = NombreCumulees%(i%)
      next i%
      for i%=1 to temp%
        for j%=1 to NombreCanaux%
          if i%<=NombreCumulees%(j%)
            item_add 5,str$(InstrumentsCumules%(j%,i%))+","+str$(NotesCumulees%(j%,i%))+","+str$(VolumesCumules%(j%,i%))+",1,1"
          else
            item_add 5,"0,0,0,0,0"
          end_if
        next j%
      next i%
      file_save 5,f$
      return
  end_select
  return
  
effacer:
  color 1,255,255,255
  CanalActuel% = 1
  mark_on 100+CanalActuel%
  set_focus 100+CanalActuel%
  for i%=1 to NombreCanaux%
    NombreCumulees%(i%) = 0
    CanalPlein%(i%) = 0
    Adresse%(i%,0) = 0
    InstrumentsCumules%(i%,0) = 1
    VolumesCumules%(i%,0) = VolumeDefaut%
  next i%
  position 42,VolumeDefaut%
  ModeRemplacement% = 0
  font_bold_off 13
  trame()                
  return
  
jouer:
  temp% = 0
  for i%=1 to NombreCanaux%
    if NombreCumulees%(i%)>0 then temp% = 1
  next i%
  if temp%=0
    message "Il n'y a rien à exporter !"
    return
  end_if
  dll_on KGF$
  
  res% = DLL_call0("MIDI_Initialize")
  res% = DLL_call1("MIDI_Reset",NombreCanaux%)
  for j%=1 to NombreCanaux%
    notes$ = ""
    for i%=1 to NombreCumulees%(j%)
      notes$ = notes$ + NomsCumulees$(j%,i%) + " "
    next i%
    res% = DLL_call3("MIDI_Compile",j%,0,adr(notes$))
  next j%
  res% = DLL_call1("MIDI_Play",10)
  res% = DLL_call0("MIDI_Stop")
  
  dll_off
  return
  
changecanal:
  CanalActuel% = number_click - 100
  set_focus 100+CanalActuel%
  text 40,item_read$(40,InstrumentsCumules%(CanalActuel%,NombreCumulees%(CanalActuel%)))
  position 42,VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))
  return
  
ClickPartition:
  x% = mouse_x_left_down(1)
  y% = mouse_y_left_down(1)
  ClickCanal% = (y%-20+99)/100  
  ClickNote% = (x%-20+19)/20
  if ClickNote%>NombreCumulees%(ClickCanal%) then return
  MarquerClick(ClickCanal%,ClickNote%)
  
  return  
  
Remplacer:
  if SaveCanal%>0
    ModeRemplacement% = 1
    font_bold 13
  else
    message "Aucune note n'est sélectionnée !"
  end_if
  return
  
  
sub DessinerPause()
  dim_local a%, hligne%
  a% = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)-1) + 20
  hligne% = 20 + (CanalActuel%-1)*100
  2d_rectangle a%,hligne%+hauteur%,a%+dline%,hligne%+hauteur%+dline%/2
  if adresse%(CanalActuel%,NombreCumulees%(CanalActuel%))>(width_client(1)-25) then CanalPlein%(CanalActuel%) = 1
end_sub
  
sub DessinerNote()
  dim_local a%, hligne%
  a% = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)-1) + 20
  hligne% = 20 + (CanalActuel%-1)*100
  if NoteCouleurCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))=2
    print_locate a%-9,hligne%+hauteur%-7
    print "#"
    a% = a% + 5
    adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)) = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)) + 3
  end_if
  2d_circle a%,hligne%+hauteur%,dline%/2
  if Note1Cumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))=1
  2d_line a%-7,hligne%+hauteur%,a%+7,hligne%+hauteur%
  end_if
  print_locate a%-5,hligne%+57
  print mid$(tabOctave$,octave%,1)
  
  if adresse%(CanalActuel%,NombreCumulees%(CanalActuel%))>(width_client(1)-25) then CanalPlein%(CanalActuel%) = 1

end_sub

sub trame()
  ' v% donne le numéro de la trame dans la page (1=première ligne)
  dim_local hligne%, v%
  v% = 0
  hligne% = 0
  for v%=1 to NombreCanaux%
    hligne% = 20 + (v%-1)*100
    2d_line 0,hligne%,w%,hligne%
    2d_line 0,hligne%+dline%,w%,hligne%+dline%
    2d_line 0,hligne%+2*dline%,w%,hligne%+2*dline%
    2d_line 0,hligne%+3*dline%,w%,hligne%+3*dline%
    2d_line 0,hligne%+4*dline%,w%,hligne%+4*dline%

    ' séparateur de mesure
    2d_line 10,hligne%,10,hligne%+4*dline%
  next v%
end_sub

sub DessinerOctave(id%,x%)
  2d_fill_color 255,255-id%,254
  2d_rectangle x%,0,x%+20,80
  2d_fill_color 255,255-id%,253
  2d_rectangle x%+20,0,x%+40,80
  2d_fill_color 255,255-id%,252
  2d_rectangle x%+40,0,x%+60,80
  2d_fill_color 255,255-id%,251
  2d_rectangle x%+60,0,x%+80,80
  2d_fill_color 255,255-id%,250
  2d_rectangle x%+80,0,x%+100,80
  2d_fill_color 255,255-id%,249
  2d_rectangle x%+100,0,x%+120,80
  2d_fill_color 255,255-id%,248
  2d_rectangle x%+120,0,x%+140,80
'  2d_pen_color 0,id%,1
  2d_fill_color 0,id%,1
  2d_rectangle x%+12,0,x%+28,40
  2d_fill_color 0,id%,2
  2d_rectangle x%+32,0,x%+48,40
  2d_fill_color 0,id%,3
  2d_rectangle x%+72,0,x%+88,40
  2d_fill_color 0,id%,4
  2d_rectangle x%+92,0,x%+108,40
  2d_fill_color 0,id%,5
  2d_rectangle x%+112,0,x%+128,40
end_sub

sub MovePiano()
  dim_local i%, couleur2%
    
  x% = mouse_x_position(2)
  y% = mouse_y_position(2)
  cr% = color_pixel_red(2,x%,y%)
  cv% = color_pixel_green(2,x%,y%)
  cb% = color_pixel_blue(2,x%,y%)
  
  if cb%=0 then exit_sub   : ' ne pas réagir sur une bordure de touche !
  
  if cr%=255             : ' c'est une blanche ?
    note2% = 255 - cb%
    octave2% = 255 - cv%
    note2a% = tabBlanches%(note2%)

    couleur2% = 0
    note2a% = note2a% + DeltaTransposition%
    if note2a%<tabBlanches%(1)
      note2a% = note2a% + 12
      octave2% = octave2% - 1
    end_if
    if note2a%>tabBlanches%(7)
      note2a% = note2a% - 12
      octave2% = octave2% + 1
    end_if
    for i%=1 to 7
      if tabBlanches%(i%)=note2a%
        note2% = i%
        couleur2% = 1
        exit_for
      end_if
    next i%
    for i%=1 to 5
      if tabNoires%(i%)=note2a%
        note2% = i%
        couleur2% = 2
        exit_for
      end_if
    next i%
    
    nomOctave2$ = mid$(tabOctave$,octave2%,1)
    delta2% = (octave2%-5)*12
    if couleur2%=1
      note2a% = tabBlanches%(note2%) + delta2%
      nomNote2$ = "+"+nomOctave2$+nomBlanches$(note2%)
      nomNote2$ = "["+nomNote2$+str$(position(42))+"-]"
      caption 7, "blanche "+str$(note2%)+"  "+str$(note2a%)+" = "+nomNote2$
    else
      note2a% = tabNoires%(note2%) + delta2%
      nomNote2$ = "+"+nomOctave2$+nomNoires$(note2%)
      nomNote2$ = "["+nomNote2$+str$(position(42))+"-]"
      caption 7, "noire "+str$(note2%)+"  "+str$(note2a%)+" = "+nomNote2$
    end_if
  else
    if cr%=0             : ' est-ce une noire ?
      note2% = cb%
      octave2% = cv%
      note2a% = tabNoires%(note2%)
      
      couleur2% = 0
      note2a% = note2a% + DeltaTransposition%
      if note2a%<tabBlanches%(1)
        note2a% = note2a% + 12
        octave2% = octave2% - 1
      end_if
      if note2a%>tabBlanches%(7)
        note2a% = note2a% - 12
        octave2% = octave2% + 1
      end_if
      for i%=1 to 7
        if tabBlanches%(i%)=note2a%
          note2% = i%
          couleur2% = 1
          exit_for
        end_if
      next i%
      for i%=1 to 5
        if tabNoires%(i%)=note2a%
          note2% = i%
          couleur2% = 2
          exit_for
        end_if
      next i%
  
      nomOctave2$ = mid$(tabOctave$,octave2%,1)
      delta2% = (octave2%-5)*12
      if couleur2%=1
        note2a% = tabBlanches%(note2%) + delta2%
        nomNote2$ = "+"+nomOctave2$+nomBlanches$(note2%)
        nomNote2$ = "["+nomNote2$+str$(position(42))+"-]"
        caption 7, "blanche "+str$(note2%)+"  "+str$(note2a%)+" = "+nomNote2$
      else
        note2a% = tabNoires%(note2%) + delta2%
        nomNote2$ = "+"+nomOctave2$+nomNoires$(note2%)
        nomNote2$ = "["+nomNote2$+str$(position(42))+"-]"
        caption 7, "noire "+str$(note2%)+"  "+str$(note2a%)+" = "+nomNote2$
      end_if
    end_if
  end_if

end_sub
                                
sub MarquerClick()
  dim_local hligne%, x%
  if SaveCanal%>0
    hligne% = (SaveCanal%-1)*100
    x% = 20*SaveNote% -7
    2d_image_paste 201,x%,hligne%
  end_if    
  SaveCanal% = ClickCanal%
  SaveNote% = ClickNote%
  hligne% = (ClickCanal%-1)*100
  x% = 20*ClickNote% -7
  2d_image_copy 201,x%,hligne%,x%+19,hligne%+99
  2d_fill_color 200,200,255
  2d_pen_color 200,200,255
  2d_rectangle x%,hligne%,x%+19,hligne%+99
  
  2d_pen_color 0,0,0
  2d_line x%,hligne%+20,x%+19,hligne%+20
  2d_line x%,hligne%+20+dline%,x%+19,hligne%+20+dline%
  2d_line x%,hligne%+20+2*dline%,x%+19,hligne%+20+2*dline%
  2d_line x%,hligne%+20+3*dline%,x%+19,hligne%+20+3*dline%
  2d_line x%,hligne%+20+4*dline%,x%+19,hligne%+20+4*dline%
  
  if NotesCumulees%(ClickCanal%,ClickNote%)=0
    RedessinerPause()
  else
    RedessinerNote()
  end_if
  
  2d_fill_color 255,255,255
    
end_sub

sub RedessinerPause()
  dim_local a%, hligne%
  a% = adresse%(ClickCanal%,ClickNote%)
  hligne% = (ClickCanal%-1)*100
  hauteur% = 2*dline%
  2d_rectangle a%,hligne%+20+hauteur%,a%+dline%,hligne%+20+hauteur%+dline%/2
end_sub

sub RedessinerNote()    
  dim_local a%, hligne%
  
  a% = adresse%(ClickCanal%,ClickNote%)
  hligne% = 20 + (ClickCanal%-1)*100
  hauteur% = 5*dline% - (Note1Cumulees%(ClickCanal%,ClickNote%)-1)*dline%/2
  
  if NoteCouleurCumulees%(ClickCanal%,ClickNote%)=2
    hauteur% = 5*dline% - (Note1Cumulees%(ClickCanal%,ClickNote%)-1)*dline%/2
    if Note1Cumulees%(ClickCanal%,ClickNote%)>2 then hauteur% = hauteur% - dline%/2
'    print_locate a%-9,hligne%+hauteur%-7
    print_locate a%-6,hligne%+hauteur%-7
    print "#"
    a% = a% + 5
  end_if
  2d_circle a%,hligne%+hauteur%,dline%/2
  if Note1Cumulees%(ClickCanal%,ClickNote%)=1
  2d_line a%-7,hligne%+hauteur%,a%+7,hligne%+hauteur%
  end_if
  print_locate a%-5,hligne%+57
  print mid$(tabOctave$,octave%,1)  

  end_sub


EDIT

Cette version a d'ailleurs une autre nouveauté: il y a maintenant deux formats d'exports: Celui qu existait déjà, et un nouveau format qui est compatible avec la fonction MIDI_Import de KGF.dll, permttant ainsi de jouer sa composition dans un programme Panoramic quelconque.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

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

MessageSujet: Re: Maquette d'une rédaction de partition de piano   Mer 7 Fév 2018 - 10:49

Et voici une version qui permet de supprimer une note (ou pause) d'une portée (bouton "X") et d'insérer une note (ou pause) dans une portée (bouton "+") en dupliquant la note sélectionnée. En plus, il affiche maintenant le numéro courant de la note au-dessus de la portée.
Code:
' Composeur_de_Partition.bas                                               

inactive 0
caption 0,"Composeur de Partition"

label clickPiano, exporter, changevolume, jouer, effacer, changecanal
label PianoPause, MovePiano, changetransposition, changeinstrument, ChangeFormat
label ClickPartition, Remplacer, Supprimer, Inserer

dim KGF$ : KGF$ = "KGF.dll"         

dim w%, h%, dline%, x%, y%, cr%, cv%, cb%, note1%, note%, i%, j%, nom$, notes$, s$
dim res%, no%, temp%
dim octave%, delta%, instrument%, instrument1%, canal%
dim couleur%, hauteur%, dhauteur%, hligne%, f$
dim tabBlanches%(7), tabNoires%(5)                           
dim nomBlanches$(7), nomNoires$(5)
dim DeltaTranspositions%(127), DeltaTransposition%
dim tabOctave$, nomOctave$, nomNote$
dim NombreCanaux%, CanalActuel%, VolumeDefaut%, ExportFormat%, NombreNotesMaxi%
dim note2%, octave2%, nomOctave2$, delta2%, note2a%, nomNote2$
dim ClickCanal%, ClickNote%, SaveCanal%, SaveNote%, ModeRemplacement%

data "do",60,"re",62,"mi",64,"fa",65,"sol",67,"la",69,"si",71  : ' notes blanches
data "do#",61,"re#",63,"fa#",66,"sol#",68,"la#",70              : ' notes noires

' ici; décalage de transposition, nom instrument
data 0,"Bright acoustic piano"
data 0,"Electric grand piano"
data 0,"Honky-tonk piano"
data 0,"Rhodes piano"
data 0,"Chorused piano"
data 0,"Harpsichord"
data 0,"Clavinet"
data 0,"Celesta"
data 0,"Glockenspiel"
data 0,"Music box"
data 0,"Vibraphone"
data 0,"Marimba"
data 0,"Xylophone"
data 0,"Tubular bells"
data 0,"Dulcimer"
data 0,"Hammond organ"
data 0,"Percussive organ"
data 0,"Rock organ"
data 0,"Church organ"
data 0,"Reed organ"
data 0,"Accordion"
data 0,"Harmonica"
data 0,"Tango accordion"
data 0,"Acoustic guitar (nylon)"
data 0,"Acoustic guitar (steel)"
data 0,"Electric guitar (jazz)"
data 0,"Electric guitar (clean)"
data 0,"Electric guitar (muted)"
data 0,"Overdriven guitar"
data 0,"Distortion guitar"
data 0,"Guitar harmonics"
data 0,"Acoustic bass"
data 0,"Electric bass (finger)"
data 0,"Electric bass (pick)"
data 0,"Fretless bass"
data 0,"Slap bass 1"
data 0,"Slap bass 2"
data 0,"Synth bass 1"
data 0,"Synth bass 2"
data 0,"Violin"
data 0,"Viola"
data 0,"Cello"
data 0,"Contrabass"
data 0,"Tremolo strings"
data 0,"Pizzicato strings"
data 0,"Orchestral harp"
data 0,"Timpani"
data 0,"String ensemble 1"
data 0,"String ensemble 2"
data 0,"Synth. strings 1"
data 0,"Synth. strings 2"
data 0,"Choir Aahs"
data 0,"Voice Oohs"
data 0,"Synth voice"
data 0,"Orchestra hit"
data 0,"Trumpet"
data 0,"Trombone"
data 0,"Tuba#966"
data 0,"Muted trumpet"
data 0,"French horn"
data 0,"Brass section"
data 0,"Synth. brass 1"
data 0,"Synth. brass 2"
data 0,"Soprano sax"
data 0,"Alto sax"
data 0,"Tenor sax"
data 0,"Baritone sax"
data 0,"Oboe"
data 0,"English horn"
data 0,"Bassoon"
data 0,"Clarinet"
data 0,"Piccolo"
data 0,"Flute"
data 0,"Recorder"
data 0,"Pan flute"
data 0,"Bottle blow"
data 0,"Shakuhachi"
data 0,"Whistle"
data 0,"Ocarina"
data 0,"Lead 1 (square)"
data 0,"Lead 2 (sawtooth)"
data 0,"Lead 3 (calliope lead)"
data 0,"Lead 4 (chiff lead)"
data 0,"Lead 5 (charang)"
data 0,"Lead 6 (voice)"
data 0,"Lead 7 (fifths)"
data 0,"Lead 8 (brass + lead)"
data 0,"Pad 1 (new age)"
data 0,"Pad 2 (warm)"
data 0,"Pad 3 (polysynth)"
data 0,"Pad 4 (choir)"
data 0,"Pad 5 (bowed)"
data 0,"Pad 6 (metallic)"
data 0,"Pad 7 (halo)"
data 0,"Pad 8 (sweep)"
data 0,"Synth SFX 1 Ice Rain"
data 0,"Synth SFX 2 Sound Track"
data 0,"Synth SFX 3 Crystal"
data 0,"Synth SFX 4 Atmosphere"
data 0,"Synth SFX 5 Brightness"
data 0,"Synth SFX 6 Goblin"
data 0,"Synth SFX 7 Echo Drops"
data 0,"Synth SFX 8 Star Theme"
data 0,"Sitar"
data 0,"Banjo"
data 0,"Shamisen"
data 0,"Koto"
data 0,"Kalimba"
data 0,"Bagpipe"
data 0,"Fiddle"
data 0,"Shanai"
data 0,"Tinkle Bells"
data 0,"Agogo"
data 0,"Steel Drums"
data 0,"Woodblock"
data 0,"Taiko Drum"
data 0,"Melodic Drum"
data 0,"Synth Drum"
data 0,"Reverse Cymbal"
data 0,"Guitar fret noise"
data 0,"Breath noise"
data 0,"Seashore"
data 0,"Bird tweet"
data 0,"Telephone ring"
data 0,"Helicopter"
data 0,"Applause"
data 0,"Gunshot"


tabOctave$ = "dcba0123"
VolumeDefaut% = 80

for i%=1 to 7
  read nomBlanches$(i%)
  read tabBlanches%(i%)
next i%
for i%=1 to 5
  read nomNoires$(i%)
  read tabNoires%(i%)
next i%
for i%=1 to 127
  DeltaTranspositions%(i%) = 0
next i%

octave% = 5
delta% = 0
hauteur% = 5*dline%
hligne% = 20
ModeRemplacement% = 0

full_space 0


picture 1 : top 1,140 : left 1,30 : on_click 1,ClickPartition
  width 1,width_client(0)-30 : height 1,height_client(0)-140
w% = width_client(1)
dline% = 10
NombreNotesMaxi% = (width_client(1)-20)/20

picture 2 : width 2,1020 : height 2,80
2d_target_is 2
2d_pen_color 1,0,0
DessinerOctave(1,-100)
DessinerOctave(2,40)
DessinerOctave(3,180)
DessinerOctave(4,320)
DessinerOctave(5,460)
DessinerOctave(6,600)
DessinerOctave(7,740)
DessinerOctave(8,880)
on_mouse_move 2,MovePiano

container_option 100 : top 100,135 : left 100,0 : width 100,35 : height 100,height(1)+5
  i% = 40
  no% = 100
  while i%<height_client(1)
    no% = no% + 1
    option no% : parent no%,100 : top no%,i% : left no%,10 : width no%,20 : on_click no%,changecanal
    i% = i% + 100
  end_while
  NombreCanaux% = no% - 100
dim NotesCumulees%(NombreCanaux%,100), NomsCumulees$(NombreCanaux%,100)
dim OctavesCumulees%(NombreCanaux%,100), Note1Cumulees%(NombreCanaux%,100)
dim NoteCouleurCumulees%(NombreCanaux%,100), NombreCumulees%(NombreCanaux%)
dim InstrumentsCumules%(NombreCanaux%,100), adresse%(NombreCanaux%,100)
dim CanalPlein%(NombreCanaux%), VolumesCumules%(NombreCanaux%,100)
for i%=1 to NombreCanaux%
  NombreCumulees%(i%) = 0
  CanalPlein%(i%) = 0
  Adresse%(i%,0) = 0
  InstrumentsCumules%(i%,0) = 1
  VolumesCumules%(i%,0) = VolumeDefaut%
next i%

on_click 2,clickPiano

container_option 3 : top 3,10 : width 3,130 : height 3,40 : left 3,width(2)+10
  caption 3,"Octaves"
option 31 : parent 31,3 : top 31,15 : left 31,5 :  width 31,20
option 32 : parent 32,3 : top 32,15 : left 32,20 : width 32,20
option 33 : parent 33,3 : top 33,15 : left 33,35 : width 33,20
option 34 : parent 34,3 : top 34,15 : left 34,50 : width 34,20
option 35 : parent 35,3 : top 35,15 : left 35,65 : width 35,20
option 36 : parent 36,3 : top 36,15 : left 36,80 : width 36,20
option 37 : parent 37,3 : top 37,15 : left 37,95 : width 37,20
option 38 : parent 38,3 : top 38,15 : left 38,110 : width 38,15
mark_on 30+octave%
set_focus 30+octave%

2d_target_is 1
2d_fill_off
print_target_is 1
font_size 1,8

button 15 : top 15,100 : left 15,320 : caption 15,"X" : width 15,30 : on_click 15,Supprimer
button 14 : top 14,100 : left 14,left(15)+width(15) : caption 14,"+" : width 14,30 : on_click 14,Inserer
button 13 : top 13,100 : left 13,left(14)+width(14) : caption 13,"Remplacer" : on_click 13,Remplacer
button 11 : top 11,100 : left 11,left(13)+width(13) : caption 11,"Effacer tout" : on_click 11,Effacer
dlist 5
save_dialog 6 : filter 6,"Fichiers texte (*.TXT)|*.txt"
alpha 8 : top 8,110 : left 8,10 : caption 8,"Note jouée:"
alpha 7 : top 7,110 : left 7,80 : font_bold 7
button 9 : top 9,100 : left 9,left(11)+width(11) : caption 9,"Jouer" : on_click 9,jouer

alpha 60 : top 60,110 : left 60,left(9)+width(9)+20 : caption 60,"Format:"
combo 61 : top 61,105 : left 61,left(60)+50 : width 61,80 : on_change 61,ChangeFormat
  item_add 61,"Composeur"
  item_add 61,"MIDI_Load"
  text 61,item_read$(61,2)
ExportFormat% = 2
button 4 : top 4,100 : left 4,left(61)+width(61) : caption 4,"Exporter" : on_click 4,exporter

button 12 : top 12,top(2)+height(2) : left 12,0 : width 12,width(2) : height 12,15 : caption 12,"Pause" : on_click 12,PianoPause

combo 40 : top 40,60 : left 40,width(2)+10 : width 40,150
for i%=1 to 127
  read DeltaTranspositions%(i%)
  read s$
  item_add 40,s$
next i%
text 40,item_read$(40,1)
on_click 40,changeinstrument
instrument1% = 0
instrument% = 1

alpha 41 : top 41,90 : left 41,left(40) : caption 41,"Volume:"
scroll_bar 42 : top 42,90 : left 42,left(41)+50 : width 42,150
  min 42,0 : max 42,127 : position 42,VolumeDefaut% : on_change 42,changevolume
alpha 43: top 43,90 : left 43,left(42)+width(42)+10 : caption 43,"80"

alpha 51 : top 51,120 : left 51,left(40) : caption 51,"Transpo:"
scroll_bar 52 : top 52,120 : left 52,left(51)+50 : width 52,150
  min 52,-11 : max 52,11 : position 52,0 : on_change 52,changetransposition
alpha 53: top 53,120 : left 53,left(52)+width(52)+10 : caption 53,"0"

  CanalActuel% = 1
  mark_on 100+CanalActuel%

image 201              : ' image de travail interne
SaveCanal% = 0
SaveNote%  = 0

trame()
active 0

end

changevolume:
  caption 43,str$(position(42))
  VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%)) = position(42)
  return

changetransposition:
  caption 53,str$(position(52))
  DeltaTranspositions%(instrument%) = position(52)
  DeltaTransposition% = position(52)
  return

PianoPause:
  if CanalPlein%(CanalActuel%)=1 then return
  nomNote$ = "[]"
  caption 7, "pause 0 = "+nomNote$
  hauteur% = 2*dline%
  note% = 0
  note1% = 0
  couleur% = 1
 
  if ModeRemplacement%=0
    NombreCumulees%(CanalActuel%) = NombreCumulees%(CanalActuel%) + 1
    NotesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))      = note%
    NomsCumulees$(CanalActuel%,NombreCumulees%(CanalActuel%))        = nomNote$
    OctavesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))    = octave%
    Note1Cumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))      = note1%
    NoteCouleurCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%)) = couleur%
    InstrumentsCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))  = instrument%
    VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))      = position(42)
 
    DessinerPause()
    adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)) = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)-1) + 20
  else
    ClickCanal% = SaveCanal%
    ClickNote% = SaveNote%
    NotesCumulees%(ClickCanal%,ClickNote%)      = note%
    NomsCumulees$(ClickCanal%,ClickNote%)        = nomNote$
    OctavesCumulees%(ClickCanal%,ClickNote%)    = octave%
    Note1Cumulees%(ClickCanal%,ClickNote%)      = note1%
    NoteCouleurCumulees%(ClickCanal%,ClickNote%) = couleur%
    InstrumentsCumules%(ClickCanal%,ClickNote%)  = instrument%
    VolumesCumules%(ClickCanal%,ClickNote%)      = position(42)

    hligne% = (ClickCanal%-1)*100
    x% = 20*ClickNote% -7
    2d_fill_color 255,255,255
    2d_pen_color 255,255,255
    2d_rectangle x%,hligne%,x%+19,hligne%+99
 
    2d_pen_color 0,0,0
    2d_line x%,hligne%+20,x%+19,hligne%+20
    2d_line x%,hligne%+20+dline%,x%+19,hligne%+20+dline%
    2d_line x%,hligne%+20+2*dline%,x%+19,hligne%+20+2*dline%
    2d_line x%,hligne%+20+3*dline%,x%+19,hligne%+20+3*dline%
    2d_line x%,hligne%+20+4*dline%,x%+19,hligne%+20+4*dline%
    RedessinerPause()
    SaveCanal% = 0
    ModeRemplacement% = 0
    font_bold_off 13
  end_if
  return
 
changeinstrument:
  instrument% = item_index(40)
  position 52,DeltaTranspositions%(instrument%)
  DeltaTransposition% = DeltaTranspositions%(instrument%)
  return
 
ChangeFormat:
  ExportFormat% = item_index(61)
  return
   
MovePiano:
  off_mouse_move 2
  MovePiano()
  on_mouse_move 2,MovePiano
  return
 
clickPiano:
  if CanalPlein%(CanalActuel%)=1 then return
 
  x% = mouse_x_left_down(2)
  y% = mouse_y_left_down(2)
  cr% = color_pixel_red(2,x%,y%)
  cv% = color_pixel_green(2,x%,y%)
  cb% = color_pixel_blue(2,x%,y%)

  if cr%=255            : ' c'est une blanche ?
    note1% = 255 - cb%
    octave% = 255 - cv%
    note% = tabBlanches%(note1%) + DeltaTransposition%
   
    if note%<tabBlanches%(1)
      note% = note% + 12
      octave% = octave% - 1
    end_if
    if note%>tabBlanches%(7)
      note% = note% - 12
      octave% = octave% + 1
    end_if
    for i%=1 to 7
      if tabBlanches%(i%)=note%
        note1% = i%
        couleur% = 1
        exit_for
      end_if
    next i%
    for i%=1 to 5
      if tabNoires%(i%)=note%
        note1% = i%
        couleur% = 2
        exit_for
      end_if
    next i%
   
    nomOctave$ = mid$(tabOctave$,octave%,1)
    delta% = (octave%-5)*12
    if instrument%<>instrument1%
      nomNote$ = "i"+right$("00"+str$(instrument%),3)+"+"+nomOctave$+nomBlanches$(note1%)
    else
      nomNote$ = "+"+nomOctave$+nomBlanches$(note1%)
    end_if
   
    if couleur%=1
      note% = tabBlanches%(note1%) + delta%
      nomNote$ = "+"+nomOctave$+nomBlanches$(note1%)
      nomNote$ = "["+nomNote$+str$(position(42))+"-]"
      caption 7, "blanche "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
    else
      note% = tabNoires%(note1%) + delta%
      nomNote$ = "+"+nomOctave$+nomNoires$(note1%)
      nomNote$ = "["+nomNote$+str$(position(42))+"-]"
      caption 7, "noire "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
    end_if
   
    hauteur% = 5*dline% - (note1%-1)*dline%/2
  else
    if cr%=0            : ' est-ce une noire ?
      note1% = cb%
      octave% = cv%
      note% = tabNoires%(note1%)
     
      couleur% = 0
      note% = note% + DeltaTransposition%
      if note%<tabBlanches%(1)
        note% = note% + 12
        octave% = octave% - 1
      end_if
      if note%>tabBlanches%(7)
        note% = note% - 12
        octave% = octave% + 1
      end_if
      for i%=1 to 7
        if tabBlanches%(i%)=note%
          note1% = i%
          couleur% = 1
          exit_for
        end_if
      next i%
      for i%=1 to 5
        if tabNoires%(i%)=note%
          note1% = i%
          couleur% = 2
          exit_for
        end_if
      next i%
     
      nomOctave$ = mid$(tabOctave$,octave%,1)
      delta% = (octave%-5)*12
      if instrument%<>instrument1%
        nomNote$ = "i"+right$("00"+str$(instrument%),3)+"+"+nomOctave$+nomNoires$(note1%)
      else
        nomNote$ = "+"+nomOctave$+nomNoires$(note1%)
      end_if
      if couleur%=1
        note% = tabBlanches%(note1%) + delta%
        nomNote$ = "+"+nomOctave$+nomBlanches$(note1%)
        nomNote$ = "["+nomNote$+str$(position(42))+"-]"
        caption 7, "blanche "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
      else
        note% = tabNoires%(note1%) + delta%
        nomNote$ = "+"+nomOctave$+nomNoires$(note1%)
        nomNote$ = "["+nomNote$+str$(position(42))+"-]"
        caption 7, "noire "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
      end_if
      hauteur% = 5*dline% - (note1%-1)*dline%/2
      if note1%>2 then hauteur% = hauteur% - dline%/2
    end_if
  end_if
  instrument1% = instrument%
  mark_on 30+octave%
  set_focus 30+octave%
  display
 
  if ModeRemplacement%=0
    NombreCumulees%(CanalActuel%) = NombreCumulees%(CanalActuel%) + 1
    NotesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))      = note%
    NomsCumulees$(CanalActuel%,NombreCumulees%(CanalActuel%))        = nomNote$
    OctavesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))    = octave%
    Note1Cumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))      = note1%
    NoteCouleurCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%)) = couleur%
    InstrumentsCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))  = instrument%
    VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))      = position(42)
 
    DessinerNote()
    adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)) = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)-1) + 20
  else
    ClickCanal% = SaveCanal%
    ClickNote% = SaveNote%
   
    NotesCumulees%(ClickCanal%,ClickNote%)      = note%
    NomsCumulees$(ClickCanal%,ClickNote%)        = nomNote$
    OctavesCumulees%(ClickCanal%,ClickNote%)    = octave%
    Note1Cumulees%(ClickCanal%,ClickNote%)      = note1%
    NoteCouleurCumulees%(ClickCanal%,ClickNote%) = couleur%
    InstrumentsCumules%(ClickCanal%,ClickNote%)  = instrument%
    VolumesCumules%(ClickCanal%,ClickNote%)      = position(42) 
   
    hligne% = (ClickCanal%-1)*100
    x% = 20*ClickNote% -7
    2d_fill_color 255,255,255
    2d_pen_color 255,255,255
    2d_rectangle x%,hligne%,x%+19,hligne%+99
   
    2d_pen_color 0,0,0 
    2d_line x%,hligne%+20,x%+19,hligne%+20
    2d_line x%,hligne%+20+dline%,x%+19,hligne%+20+dline%
    2d_line x%,hligne%+20+2*dline%,x%+19,hligne%+20+2*dline%
    2d_line x%,hligne%+20+3*dline%,x%+19,hligne%+20+3*dline%
    2d_line x%,hligne%+20+4*dline%,x%+19,hligne%+20+4*dline%
    RedessinerNote()
    SaveCanal% = 0
    ModeRemplacement% = 0
    font_bold_off 13
  end_if
  return
 
exporter:
  temp% = 0
  for i%=1 to NombreCanaux%
    if NombreCumulees%(i%)>0 then temp% = 1
  next i%
  if temp%=0
    message "Il n'y a rien à exporter !"
    return
  end_if
  f$ = file_name$(6)
  if f$="_" then return
  if file_exists(f$)=1
    if message_confirmation_yes_no("Ce fichier existe déjà. Remplacer ?")<>1 then return
  end_if 
  select ExportFormat%
    case 1: ' format Composeur 
      clear 5
      for j%=1 to NombreCanaux%
        item_add 5,"Canal "+str$(j%)
        if NombreCumulees%(j%)>0
          for i%=1 to NombreCumulees%(j%)
            item_add 5,NomsCumulees$(j%,i%)+"="+str$(NotesCumulees%(j%,i%))
          next i%
        end_if
      next j%
      file_save 5,f$
    case 2: ' format MIDI_LOAD
      clear 5
      item_add 5,"#MIDI_EXPORT"
      item_add 5,str$(NombreCanaux%)
      temp% = 0
      for i%=1 to NombreCanaux%
        if NombreCumulees%(i%)>temp% then temp% = NombreCumulees%(i%)
      next i%
      for i%=1 to temp%
        for j%=1 to NombreCanaux%
          if i%<=NombreCumulees%(j%)
            item_add 5,str$(InstrumentsCumules%(j%,i%))+","+str$(NotesCumulees%(j%,i%))+","+str$(VolumesCumules%(j%,i%))+",1,1"
          else
            item_add 5,"0,0,0,0,0"
          end_if
        next j%
      next i%
      file_save 5,f$
      return
  end_select
  return
 
effacer:
  color 1,255,255,255
  CanalActuel% = 1
  mark_on 100+CanalActuel%
  set_focus 100+CanalActuel%
  for i%=1 to NombreCanaux%
    NombreCumulees%(i%)        = 0
    CanalPlein%(i%)            = 0
    Adresse%(i%,0)            = 0
    InstrumentsCumules%(i%,0)  = 1
    VolumesCumules%(i%,0)      = VolumeDefaut%
    NotesCumulees%(i%,0)      = 0
    NomsCumulees$(i%,0)        = ""
    OctavesCumulees%(i%,0)    = 0
    Note1Cumulees%(i%,0)      = 0
    NoteCouleurCumulees%(i%,0) = 0
  next i%
  position 42,VolumeDefaut%
  ModeRemplacement% = 0
  font_bold_off 13
  trame()               
  return
 
jouer:
  temp% = 0
  for i%=1 to NombreCanaux%
    if NombreCumulees%(i%)>0 then temp% = 1
  next i%
  if temp%=0
    message "Il n'y a rien à exporter !"
    return
  end_if
  dll_on KGF$
 
  res% = DLL_call0("MIDI_Initialize")
  res% = DLL_call1("MIDI_Reset",NombreCanaux%)
  for j%=1 to NombreCanaux%
    notes$ = ""
    for i%=1 to NombreCumulees%(j%)
      notes$ = notes$ + NomsCumulees$(j%,i%) + " "
    next i%
    res% = DLL_call3("MIDI_Compile",j%,0,adr(notes$))
  next j%
  res% = DLL_call1("MIDI_Play",10)
  res% = DLL_call0("MIDI_Stop")
 
  dll_off
  return
 
changecanal:
  CanalActuel% = number_click - 100
  set_focus 100+CanalActuel%
  text 40,item_read$(40,InstrumentsCumules%(CanalActuel%,NombreCumulees%(CanalActuel%)))
  position 42,VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))
  return
 
ClickPartition:
  x% = mouse_x_left_down(1)
  y% = mouse_y_left_down(1)
  ClickCanal% = (y%-20+99)/100 
  ClickNote% = (x%-20+19)/20
  if ClickNote%>NombreCumulees%(ClickCanal%) then return
  MarquerClick(ClickCanal%,ClickNote%)
 
  return 
 
Remplacer:
  if SaveCanal%>0
    ModeRemplacement% = 1
    font_bold 13
  else
    message "Aucune note n'est sélectionnée !"
  end_if
  return
 
Supprimer:
  if SaveCanal%>0
    SupprimerNote()
    SaveCanal% = 0
    CanalPlein%(CanalActuel%) = 0
  else
    message "Aucune note n'est sélectionnée !"
  end_if
  return
 
Inserer:
  if SaveCanal%>0
    if NombreCumulees%(CanalActuel%)>=NombreNotesMaxi%
      message "La portée est pleine !"
      return
    end_if
    InsererNote()
    SaveCanal% = 0
    if NombreCumulees%(CanalActuel%)>=NombreNotesMaxi% then CanalPlein%(CanalActuel%) = 1
  else
    message "Aucune note n'est sélectionnée !"
  end_if
  return 
 
sub DessinerPause()
  dim_local a%, hligne%
  a% = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)-1) + 15
  hligne% = 20 + (CanalActuel%-1)*100
  2d_rectangle a%,hligne%+hauteur%,a%+dline%,hligne%+hauteur%+dline%/2
  if adresse%(CanalActuel%,NombreCumulees%(CanalActuel%))>(width_client(1)-25) then CanalPlein%(CanalActuel%) = 1

  print_locate a%,hligne%-15
  print str$(NombreCumulees%(CanalActuel%))
end_sub
 
sub DessinerNote()
  dim_local a%, hligne%
  a% = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)-1) + 20
  hligne% = 20 + (CanalActuel%-1)*100
  if NoteCouleurCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))=2
    print_locate a%-9,hligne%+hauteur%-7
    print "#"
    a% = a% + 5
    adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)) = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)) + 3
  end_if
  2d_circle a%,hligne%+hauteur%,dline%/2
  if Note1Cumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))=1
  2d_line a%-7,hligne%+hauteur%,a%+7,hligne%+hauteur%
  end_if
  print_locate a%-5,hligne%+57
  print mid$(tabOctave$,octave%,1)
  print_locate a%-5,hligne%-15
  print str$(NombreCumulees%(CanalActuel%))
 
  if adresse%(CanalActuel%,NombreCumulees%(CanalActuel%))>(width_client(1)-25) then CanalPlein%(CanalActuel%) = 1

end_sub

sub trame()
  ' v% donne le numéro de la trame dans la page (1=première ligne)
  dim_local hligne%, v%
  v% = 0
  hligne% = 0
  for v%=1 to NombreCanaux%
    hligne% = 20 + (v%-1)*100
    2d_line 0,hligne%,w%,hligne%
    2d_line 0,hligne%+dline%,w%,hligne%+dline%
    2d_line 0,hligne%+2*dline%,w%,hligne%+2*dline%
    2d_line 0,hligne%+3*dline%,w%,hligne%+3*dline%
    2d_line 0,hligne%+4*dline%,w%,hligne%+4*dline%

    ' séparateur de mesure
    2d_line 10,hligne%,10,hligne%+4*dline%
  next v%
end_sub

sub DessinerOctave(id%,x%)
  2d_fill_color 255,255-id%,254
  2d_rectangle x%,0,x%+20,80
  2d_fill_color 255,255-id%,253
  2d_rectangle x%+20,0,x%+40,80
  2d_fill_color 255,255-id%,252
  2d_rectangle x%+40,0,x%+60,80
  2d_fill_color 255,255-id%,251
  2d_rectangle x%+60,0,x%+80,80
  2d_fill_color 255,255-id%,250
  2d_rectangle x%+80,0,x%+100,80
  2d_fill_color 255,255-id%,249
  2d_rectangle x%+100,0,x%+120,80
  2d_fill_color 255,255-id%,248
  2d_rectangle x%+120,0,x%+140,80
'  2d_pen_color 0,id%,1
  2d_fill_color 0,id%,1
  2d_rectangle x%+12,0,x%+28,40
  2d_fill_color 0,id%,2
  2d_rectangle x%+32,0,x%+48,40
  2d_fill_color 0,id%,3
  2d_rectangle x%+72,0,x%+88,40
  2d_fill_color 0,id%,4
  2d_rectangle x%+92,0,x%+108,40
  2d_fill_color 0,id%,5
  2d_rectangle x%+112,0,x%+128,40
end_sub

sub MovePiano()
  dim_local i%, couleur2%
   
  x% = mouse_x_position(2)
  y% = mouse_y_position(2)
  cr% = color_pixel_red(2,x%,y%)
  cv% = color_pixel_green(2,x%,y%)
  cb% = color_pixel_blue(2,x%,y%)
 
  if cb%=0 then exit_sub  : ' ne pas réagir sur une bordure de touche !
 
  if cr%=255            : ' c'est une blanche ?
    note2% = 255 - cb%
    octave2% = 255 - cv%
    note2a% = tabBlanches%(note2%)

    couleur2% = 0
    note2a% = note2a% + DeltaTransposition%
    if note2a%<tabBlanches%(1)
      note2a% = note2a% + 12
      octave2% = octave2% - 1
    end_if
    if note2a%>tabBlanches%(7)
      note2a% = note2a% - 12
      octave2% = octave2% + 1
    end_if
    for i%=1 to 7
      if tabBlanches%(i%)=note2a%
        note2% = i%
        couleur2% = 1
        exit_for
      end_if
    next i%
    for i%=1 to 5
      if tabNoires%(i%)=note2a%
        note2% = i%
        couleur2% = 2
        exit_for
      end_if
    next i%
   
    nomOctave2$ = mid$(tabOctave$,octave2%,1)
    delta2% = (octave2%-5)*12
    if couleur2%=1
      note2a% = tabBlanches%(note2%) + delta2%
      nomNote2$ = "+"+nomOctave2$+nomBlanches$(note2%)
      nomNote2$ = "["+nomNote2$+str$(position(42))+"-]"
      caption 7, "blanche "+str$(note2%)+"  "+str$(note2a%)+" = "+nomNote2$
    else
      note2a% = tabNoires%(note2%) + delta2%
      nomNote2$ = "+"+nomOctave2$+nomNoires$(note2%)
      nomNote2$ = "["+nomNote2$+str$(position(42))+"-]"
      caption 7, "noire "+str$(note2%)+"  "+str$(note2a%)+" = "+nomNote2$
    end_if
  else
    if cr%=0            : ' est-ce une noire ?
      note2% = cb%
      octave2% = cv%
      note2a% = tabNoires%(note2%)
     
      couleur2% = 0
      note2a% = note2a% + DeltaTransposition%
      if note2a%<tabBlanches%(1)
        note2a% = note2a% + 12
        octave2% = octave2% - 1
      end_if
      if note2a%>tabBlanches%(7)
        note2a% = note2a% - 12
        octave2% = octave2% + 1
      end_if
      for i%=1 to 7
        if tabBlanches%(i%)=note2a%
          note2% = i%
          couleur2% = 1
          exit_for
        end_if
      next i%
      for i%=1 to 5
        if tabNoires%(i%)=note2a%
          note2% = i%
          couleur2% = 2
          exit_for
        end_if
      next i%
 
      nomOctave2$ = mid$(tabOctave$,octave2%,1)
      delta2% = (octave2%-5)*12
      if couleur2%=1
        note2a% = tabBlanches%(note2%) + delta2%
        nomNote2$ = "+"+nomOctave2$+nomBlanches$(note2%)
        nomNote2$ = "["+nomNote2$+str$(position(42))+"-]"
        caption 7, "blanche "+str$(note2%)+"  "+str$(note2a%)+" = "+nomNote2$
      else
        note2a% = tabNoires%(note2%) + delta2%
        nomNote2$ = "+"+nomOctave2$+nomNoires$(note2%)
        nomNote2$ = "["+nomNote2$+str$(position(42))+"-]"
        caption 7, "noire "+str$(note2%)+"  "+str$(note2a%)+" = "+nomNote2$
      end_if
    end_if
  end_if

end_sub

sub SupprimerNote()
  dim_local hligne%, x%, nrest%, i%
  hligne% = (ClickCanal%-1)*100
  x% = 20*ClickNote% -7
  if ClickNote%<NombreCumulees%(ClickCanal%)
    nrest% = NombreCumulees%(ClickCanal%) - ClickNote%
    2d_image_copy 201,x%+20,hligne%,x%+nrest%*20+19,hligne%+99
    2d_image_paste 201,x%,hligne%
    x% = 20*NombreCumulees%(ClickCanal%)-7
    for i%=ClickNote% to NombreCumulees%(ClickCanal%)-1
      NotesCumulees%(ClickCanal%,i%)      = NotesCumulees%(ClickCanal%,i%+1)
      NomsCumulees$(ClickCanal%,i%)        = NomsCumulees$(ClickCanal%,i%+1)
      OctavesCumulees%(ClickCanal%,i%)    = OctavesCumulees%(ClickCanal%,i%+1)
      Note1Cumulees%(ClickCanal%,i%)      = Note1Cumulees%(ClickCanal%,i%+1)
      NoteCouleurCumulees%(ClickCanal%,i%) = NoteCouleurCumulees%(ClickCanal%,i%+1)
      InstrumentsCumules%(ClickCanal%,i%)  = InstrumentsCumules%(ClickCanal%,i%+1)
      adresse%(ClickCanal%,i%)            = adresse%(ClickCanal%,i%+1) - 20
      VolumesCumules%(ClickCanal%,i%)      = VolumesCumules%(ClickCanal%,i%+1)
    next i%
  end_if
  2d_pen_color 255,255,255
  2d_rectangle x%,hligne%,x%+19,hligne%+99
  2d_pen_color 0,0,0
  2d_line x%,hligne%+20,x%+19,hligne%+20
  2d_line x%,hligne%+20+dline%,x%+19,hligne%+20+dline%
  2d_line x%,hligne%+20+2*dline%,x%+19,hligne%+20+2*dline%
  2d_line x%,hligne%+20+3*dline%,x%+19,hligne%+20+3*dline%
  2d_line x%,hligne%+20+4*dline%,x%+19,hligne%+20+4*dline%
  NombreCumulees%(ClickCanal%) = NombreCumulees%(ClickCanal%) - 1
 
  x% = 20*ClickNote% -7
  2d_pen_color 255,255,255
  2d_rectangle x%,hligne%-5,20*NotesCumulees%(ClickCanal%,i%),hligne%
  2d_pen_color 0,0,0
  nrest% = NombreCumulees%(ClickCanal%) - ClickNote%
  for i%=1 to nrest%+1
    print_locate x%+(i%-1)*20,hligne%+5
    print str$(ClickNote%+i%-1)
  next i% 
end_sub   

sub InsererNote()
  dim_local hligne%, x%, nrest%, i%
  hligne% = (ClickCanal%-1)*100
  x% = 20*ClickNote% -7
  hligne% = (SaveCanal%-1)*100
  x% = 20*SaveNote% -7
  2d_image_paste 201,x%,hligne%
  nrest% = NombreCumulees%(ClickCanal%) + 1 - ClickNote%
  2d_image_copy 201,x%,hligne%,x%+nrest%*20+19,hligne%+99
  2d_image_paste 201,x%+20,hligne%
  for i%=NombreCumulees%(ClickCanal%) to ClickNote% step -1
    NotesCumulees%(ClickCanal%,i%+1)      = NotesCumulees%(ClickCanal%,i%)
    NomsCumulees$(ClickCanal%,i%+1)        = NomsCumulees$(ClickCanal%,i%)
    OctavesCumulees%(ClickCanal%,i%+1)    = OctavesCumulees%(ClickCanal%,i%)
    Note1Cumulees%(ClickCanal%,i%+1)      = Note1Cumulees%(ClickCanal%,i%)
    NoteCouleurCumulees%(ClickCanal%,i%+1) = NoteCouleurCumulees%(ClickCanal%,i%)
    InstrumentsCumules%(ClickCanal%,i%+1)  = InstrumentsCumules%(ClickCanal%,i%)
    adresse%(ClickCanal%,i%+1)            = adresse%(ClickCanal%,i%) + 20
    VolumesCumules%(ClickCanal%,i%+1)      = VolumesCumules%(ClickCanal%,i%)
  next i%
  NombreCumulees%(ClickCanal%) = NombreCumulees%(ClickCanal%) + 1

  x% = 20*ClickNote% -7
  2d_pen_color 255,255,255
  2d_rectangle x%,hligne%-5,20*NotesCumulees%(ClickCanal%,i%),hligne%
  2d_pen_color 0,0,0
  nrest% = NombreCumulees%(ClickCanal%) - ClickNote%
  for i%=1 to nrest%+1
    print_locate x%+(i%-1)*20,hligne%+5
    print str$(ClickNote%+i%-1)
  next i%
end_sub         

                               
sub MarquerClick()
  dim_local hligne%, x%
  if SaveCanal%>0
    hligne% = (SaveCanal%-1)*100
    x% = 20*SaveNote% -7
    2d_image_paste 201,x%,hligne%
  end_if   
  SaveCanal% = ClickCanal%
  SaveNote% = ClickNote%
  hligne% = (ClickCanal%-1)*100
  x% = 20*ClickNote% -7
  2d_image_copy 201,x%,hligne%,x%+19,hligne%+99
  2d_fill_color 200,200,255
  2d_pen_color 200,200,255
  2d_rectangle x%,hligne%,x%+19,hligne%+99
 
  2d_pen_color 0,0,0
  2d_line x%,hligne%+20,x%+19,hligne%+20
  2d_line x%,hligne%+20+dline%,x%+19,hligne%+20+dline%
  2d_line x%,hligne%+20+2*dline%,x%+19,hligne%+20+2*dline%
  2d_line x%,hligne%+20+3*dline%,x%+19,hligne%+20+3*dline%
  2d_line x%,hligne%+20+4*dline%,x%+19,hligne%+20+4*dline%
 
  if NotesCumulees%(ClickCanal%,ClickNote%)=0
    RedessinerPause()
  else
    RedessinerNote()
  end_if
 
  2d_fill_color 255,255,255
   
end_sub

sub RedessinerPause()
  dim_local a%, hligne%
  a% = adresse%(ClickCanal%,ClickNote%)-5
  hligne% = (ClickCanal%-1)*100
  hauteur% = 2*dline%
  2d_rectangle a%,hligne%+20+hauteur%,a%+dline%,hligne%+20+hauteur%+dline%/2

  print_locate a%,hligne%+5
  print str$(ClickNote%)
end_sub

sub RedessinerNote()   
  dim_local a%, hligne%
 
  a% = adresse%(ClickCanal%,ClickNote%)
  hligne% = 20 + (ClickCanal%-1)*100
  hauteur% = 5*dline% - (Note1Cumulees%(ClickCanal%,ClickNote%)-1)*dline%/2
 
  if NoteCouleurCumulees%(ClickCanal%,ClickNote%)=2
    hauteur% = 5*dline% - (Note1Cumulees%(ClickCanal%,ClickNote%)-1)*dline%/2
    if Note1Cumulees%(ClickCanal%,ClickNote%)>2 then hauteur% = hauteur% - dline%/2
'    print_locate a%-9,hligne%+hauteur%-7
    print_locate a%-6,hligne%+hauteur%-7
    print "#"
    a% = a% + 5
  end_if
  2d_circle a%,hligne%+hauteur%,dline%/2
  if Note1Cumulees%(ClickCanal%,ClickNote%)=1
  2d_line a%-7,hligne%+hauteur%,a%+7,hligne%+hauteur%
  end_if
  print_locate a%-5,hligne%+57
  print mid$(tabOctave$,octave%,1) 

  print_locate a%-5,hligne%-15
  print str$(ClickNote%)

  end_sub

Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

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

MessageSujet: Re: Maquette d'une rédaction de partition de piano   Mer 7 Fév 2018 - 22:34

Nouvelle version, majeure celle-ci. On peut maintenant gérer un grrand nombre de pages de partition (jusqu'à 999...), "feuilleter" les pages, ajouter de nouvelles pages etc. Les exports se font sur la totalité des pages en mémoire, quelque soit la page affichée. Et le bouton "Jouer" joue également la musique intégrale:
Code:
' Composeur_de_Partition.bas                                                

inactive 0
caption 0,"Composeur de Partition"

label clickPiano, exporter, changevolume, jouer, effacer, changecanal
label PianoPause, MovePiano, changetransposition, changeinstrument, ChangeFormat
label ClickPartition, Remplacer, Supprimer, Inserer
label PremierePage, PagePrecedente, PageNouvelle, PageSuivante, DernierePage

dim KGF$ : KGF$ = "KGF.dll"          

dim w%, h%, dline%, x%, y%, cr%, cv%, cb%, note1%, note%, i%, j%, nom$, notes$, s$
dim res%, no%, temp%
dim octave%, delta%, instrument%, instrument1%, canal%
dim couleur%, hauteur%, dhauteur%, hligne%, f$
dim tabBlanches%(7), tabNoires%(5)                            
dim nomBlanches$(7), nomNoires$(5)
dim DeltaTranspositions%(127), DeltaTransposition%
dim tabOctave$, nomOctave$, nomNote$
dim NombreCanaux%, CanalActuel%, VolumeDefaut%, ExportFormat%, NombreNotesMaxi%
dim note2%, octave2%, nomOctave2$, delta2%, note2a%, nomNote2$
dim ClickCanal%, ClickNote%, SaveCanal%, SaveNote%, ModeRemplacement%
dim PageActuelle%, PagesTotal%, ip%, sip%,maxNotes%

data "do",60,"re",62,"mi",64,"fa",65,"sol",67,"la",69,"si",71   : ' notes blanches
data "do#",61,"re#",63,"fa#",66,"sol#",68,"la#",70              : ' notes noires

' ici; décalage de transposition, nom instrument
data 0,"Bright acoustic piano"
data 0,"Electric grand piano"
data 0,"Honky-tonk piano"
data 0,"Rhodes piano"
data 0,"Chorused piano"
data 0,"Harpsichord"
data 0,"Clavinet"
data 0,"Celesta"
data 0,"Glockenspiel"
data 0,"Music box"
data 0,"Vibraphone"
data 0,"Marimba"
data 0,"Xylophone"
data 0,"Tubular bells"
data 0,"Dulcimer"
data 0,"Hammond organ"
data 0,"Percussive organ"
data 0,"Rock organ"
data 0,"Church organ"
data 0,"Reed organ"
data 0,"Accordion"
data 0,"Harmonica"
data 0,"Tango accordion"
data 0,"Acoustic guitar (nylon)"
data 0,"Acoustic guitar (steel)"
data 0,"Electric guitar (jazz)"
data 0,"Electric guitar (clean)"
data 0,"Electric guitar (muted)"
data 0,"Overdriven guitar"
data 0,"Distortion guitar"
data 0,"Guitar harmonics"
data 0,"Acoustic bass"
data 0,"Electric bass (finger)"
data 0,"Electric bass (pick)"
data 0,"Fretless bass"
data 0,"Slap bass 1"
data 0,"Slap bass 2"
data 0,"Synth bass 1"
data 0,"Synth bass 2"
data 0,"Violin"
data 0,"Viola"
data 0,"Cello"
data 0,"Contrabass"
data 0,"Tremolo strings"
data 0,"Pizzicato strings"
data 0,"Orchestral harp"
data 0,"Timpani"
data 0,"String ensemble 1"
data 0,"String ensemble 2"
data 0,"Synth. strings 1"
data 0,"Synth. strings 2"
data 0,"Choir Aahs"
data 0,"Voice Oohs"
data 0,"Synth voice"
data 0,"Orchestra hit"
data 0,"Trumpet"
data 0,"Trombone"
data 0,"Tuba#966"
data 0,"Muted trumpet"
data 0,"French horn"
data 0,"Brass section"
data 0,"Synth. brass 1"
data 0,"Synth. brass 2"
data 0,"Soprano sax"
data 0,"Alto sax"
data 0,"Tenor sax"
data 0,"Baritone sax"
data 0,"Oboe"
data 0,"English horn"
data 0,"Bassoon"
data 0,"Clarinet"
data 0,"Piccolo"
data 0,"Flute"
data 0,"Recorder"
data 0,"Pan flute"
data 0,"Bottle blow"
data 0,"Shakuhachi"
data 0,"Whistle"
data 0,"Ocarina"
data 0,"Lead 1 (square)"
data 0,"Lead 2 (sawtooth)"
data 0,"Lead 3 (calliope lead)"
data 0,"Lead 4 (chiff lead)"
data 0,"Lead 5 (charang)"
data 0,"Lead 6 (voice)"
data 0,"Lead 7 (fifths)"
data 0,"Lead 8 (brass + lead)"
data 0,"Pad 1 (new age)"
data 0,"Pad 2 (warm)"
data 0,"Pad 3 (polysynth)"
data 0,"Pad 4 (choir)"
data 0,"Pad 5 (bowed)"
data 0,"Pad 6 (metallic)"
data 0,"Pad 7 (halo)"
data 0,"Pad 8 (sweep)"
data 0,"Synth SFX 1 Ice Rain"
data 0,"Synth SFX 2 Sound Track"
data 0,"Synth SFX 3 Crystal"
data 0,"Synth SFX 4 Atmosphere"
data 0,"Synth SFX 5 Brightness"
data 0,"Synth SFX 6 Goblin"
data 0,"Synth SFX 7 Echo Drops"
data 0,"Synth SFX 8 Star Theme"
data 0,"Sitar"
data 0,"Banjo"
data 0,"Shamisen"
data 0,"Koto"
data 0,"Kalimba"
data 0,"Bagpipe"
data 0,"Fiddle"
data 0,"Shanai"
data 0,"Tinkle Bells"
data 0,"Agogo"
data 0,"Steel Drums"
data 0,"Woodblock"
data 0,"Taiko Drum"
data 0,"Melodic Drum"
data 0,"Synth Drum"
data 0,"Reverse Cymbal"
data 0,"Guitar fret noise"
data 0,"Breath noise"
data 0,"Seashore"
data 0,"Bird tweet"
data 0,"Telephone ring"
data 0,"Helicopter"
data 0,"Applause"
data 0,"Gunshot"


tabOctave$ = "dcba0123"
VolumeDefaut% = 80

for i%=1 to 7
  read nomBlanches$(i%)
  read tabBlanches%(i%)
next i%
for i%=1 to 5
  read nomNoires$(i%)
  read tabNoires%(i%)
next i%
for i%=1 to 127
  DeltaTranspositions%(i%) = 0
next i%

octave% = 5
delta% = 0
hauteur% = 5*dline%
hligne% = 20
ModeRemplacement% = 0
PageActuelle% = 1
PagesTotal% = 1
dlist 1001           : ' pour la page 1
image 2001           : ' pour page actuelle

full_space 0


picture 1 : top 1,140 : left 1,30 : on_click 1,ClickPartition
  width 1,width_client(0)-50 : height 1,height_client(0)-140
w% = width_client(1)
dline% = 10
NombreNotesMaxi% = (width_client(1)-20)/20

picture 2 : width 2,1020 : height 2,80
2d_target_is 2
2d_pen_color 1,0,0
DessinerOctave(1,-100)
DessinerOctave(2,40)
DessinerOctave(3,180)
DessinerOctave(4,320)
DessinerOctave(5,460)
DessinerOctave(6,600)
DessinerOctave(7,740)
DessinerOctave(8,880)
on_mouse_move 2,MovePiano

container_option 100 : top 100,135 : left 100,0 : width 100,35 : height 100,height(1)+5
  i% = 40
  no% = 100
  while i%<height_client(1)
    no% = no% + 1
    option no% : parent no%,100 : top no%,i% : left no%,10 : width no%,20 : on_click no%,changecanal
    i% = i% + 100
  end_while
  NombreCanaux% = no% - 100
dim NotesCumulees%(NombreCanaux%,100), NomsCumulees$(NombreCanaux%,100)
dim OctavesCumulees%(NombreCanaux%,100), Note1Cumulees%(NombreCanaux%,100)
dim NoteCouleurCumulees%(NombreCanaux%,100), NombreCumulees%(NombreCanaux%)
dim InstrumentsCumules%(NombreCanaux%,100), adresse%(NombreCanaux%,100)
dim CanalPlein%(NombreCanaux%), VolumesCumules%(NombreCanaux%,100)
for i%=1 to NombreCanaux%
  NombreCumulees%(i%) = 0
  CanalPlein%(i%) = 0
  Adresse%(i%,0) = 0
  InstrumentsCumules%(i%,0) = 1
  VolumesCumules%(i%,0) = VolumeDefaut%
next i%

on_click 2,clickPiano

container_option 3 : top 3,10 : width 3,130 : height 3,40 : left 3,width(2)+10
  caption 3,"Octaves"
option 31 : parent 31,3 : top 31,15 : left 31,5 :  width 31,20
option 32 : parent 32,3 : top 32,15 : left 32,20 : width 32,20
option 33 : parent 33,3 : top 33,15 : left 33,35 : width 33,20
option 34 : parent 34,3 : top 34,15 : left 34,50 : width 34,20
option 35 : parent 35,3 : top 35,15 : left 35,65 : width 35,20
option 36 : parent 36,3 : top 36,15 : left 36,80 : width 36,20
option 37 : parent 37,3 : top 37,15 : left 37,95 : width 37,20
option 38 : parent 38,3 : top 38,15 : left 38,110 : width 38,15
mark_on 30+octave%
set_focus 30+octave%

alpha 70 : top 70,top(3) : left 70,left(3)+width(3)+15
  caption 70,"Pages: "+str$(PageActuelle%)+"/"+str$(PagesTotal%)
button 71 : top 71,top(70)+15 : left 71,left(70) : width 71,30 : caption 71,"|<" : on_click 71,PremierePage
button 72 : top 72,top(70)+15 : left 72,left(71)+width(71) : width 72,30 : caption 72,"<" : on_click 72,PagePrecedente
button 73 : top 73,top(70)+15 : left 73,left(72)+width(72) : width 73,30 : caption 73,"+" : on_click 73,PageNouvelle
button 74 : top 74,top(70)+15 : left 74,left(73)+width(73) : width 74,30 : caption 74,">" : on_click 74,PageSuivante
button 75 : top 75,top(70)+15 : left 75,left(74)+width(74) : width 75,30 : caption 75,">|" : on_click 75,DernierePage

2d_target_is 1
2d_fill_off
print_target_is 1
font_size 1,8

button 15 : top 15,100 : left 15,320 : caption 15,"X" : width 15,30 : on_click 15,Supprimer
button 14 : top 14,100 : left 14,left(15)+width(15) : caption 14,"+" : width 14,30 : on_click 14,Inserer
button 13 : top 13,100 : left 13,left(14)+width(14) : caption 13,"Remplacer" : on_click 13,Remplacer
button 11 : top 11,100 : left 11,left(13)+width(13) : caption 11,"Effacer tout" : on_click 11,Effacer
dlist 5
save_dialog 6
alpha 8 : top 8,110 : left 8,10 : caption 8,"Note jouée:"
alpha 7 : top 7,110 : left 7,80 : font_bold 7
button 9 : top 9,100 : left 9,left(11)+width(11) : caption 9,"Jouer" : on_click 9,jouer

alpha 60 : top 60,110 : left 60,left(9)+width(9)+20 : caption 60,"Format:"
combo 61 : top 61,105 : left 61,left(60)+50 : width 61,90 : on_change 61,ChangeFormat
  item_add 61,"Composeur"
  item_add 61,"MIDI_Import"
  text 61,item_read$(61,2)
ExportFormat% = 2
button 4 : top 4,100 : left 4,left(61)+width(61) : caption 4,"Exporter" : on_click 4,exporter

button 12 : top 12,top(2)+height(2) : left 12,0 : width 12,width(2) : height 12,15 : caption 12,"Pause" : on_click 12,PianoPause

combo 40 : top 40,60 : left 40,width(2)+10 : width 40,150
for i%=1 to 127
  read DeltaTranspositions%(i%)
  read s$
  item_add 40,s$
next i%
text 40,item_read$(40,1)
on_click 40,changeinstrument
instrument1% = 0
instrument% = 1

alpha 41 : top 41,90 : left 41,left(40) : caption 41,"Volume:"
scroll_bar 42 : top 42,90 : left 42,left(41)+50 : width 42,150
  min 42,0 : max 42,127 : position 42,VolumeDefaut% : on_change 42,changevolume
alpha 43: top 43,90 : left 43,left(42)+width(42)+10 : caption 43,"80"

alpha 51 : top 51,120 : left 51,left(40) : caption 51,"Transpo:"
scroll_bar 52 : top 52,120 : left 52,left(51)+50 : width 52,150
  min 52,-11 : max 52,11 : position 52,0 : on_change 52,changetransposition
alpha 53: top 53,120 : left 53,left(52)+width(52)+10 : caption 53,"0"

CanalActuel% = 1
mark_on 100+CanalActuel%

image 201              : ' image de travail interne
SaveCanal% = 0
SaveNote%  = 0

trame()
SauverPage()
active 0

end

changevolume:
  caption 43,str$(position(42))
  VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%)) = position(42)
  return

changetransposition:
  caption 53,str$(position(52))
  DeltaTranspositions%(instrument%) = position(52)
  DeltaTransposition% = position(52)
  return

PianoPause:
  if CanalPlein%(CanalActuel%)=1 then return
  nomNote$ = "[]"
  caption 7, "pause 0 = "+nomNote$
  hauteur% = 2*dline%
  note% = 0
  note1% = 0
  couleur% = 1
  
  if ModeRemplacement%=0
    NombreCumulees%(CanalActuel%) = NombreCumulees%(CanalActuel%) + 1
    NotesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))       = note%
    NomsCumulees$(CanalActuel%,NombreCumulees%(CanalActuel%))        = nomNote$
    OctavesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))     = octave%
    Note1Cumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))       = note1%
    NoteCouleurCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%)) = couleur%
    InstrumentsCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))  = instrument%
    VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))      = position(42)
  
    DessinerPause()
    adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)) = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)-1) + 20
  else
    ClickCanal% = SaveCanal%
    ClickNote% = SaveNote%
    NotesCumulees%(ClickCanal%,ClickNote%)       = note%
    NomsCumulees$(ClickCanal%,ClickNote%)        = nomNote$
    OctavesCumulees%(ClickCanal%,ClickNote%)     = octave%
    Note1Cumulees%(ClickCanal%,ClickNote%)       = note1%
    NoteCouleurCumulees%(ClickCanal%,ClickNote%) = couleur%
    InstrumentsCumules%(ClickCanal%,ClickNote%)  = instrument%
    VolumesCumules%(ClickCanal%,ClickNote%)      = position(42)

    hligne% = (ClickCanal%-1)*100
    x% = 20*ClickNote% -7
    2d_fill_color 255,255,255
    2d_pen_color 255,255,255
    2d_rectangle x%,hligne%,x%+19,hligne%+99
  
    2d_pen_color 0,0,0
    2d_line x%,hligne%+20,x%+19,hligne%+20
    2d_line x%,hligne%+20+dline%,x%+19,hligne%+20+dline%
    2d_line x%,hligne%+20+2*dline%,x%+19,hligne%+20+2*dline%
    2d_line x%,hligne%+20+3*dline%,x%+19,hligne%+20+3*dline%
    2d_line x%,hligne%+20+4*dline%,x%+19,hligne%+20+4*dline%
    RedessinerPause()
    SaveCanal% = 0
    ModeRemplacement% = 0
    font_bold_off 13
  end_if
  return
  
changeinstrument:
  instrument% = item_index(40)
  position 52,DeltaTranspositions%(instrument%)
  DeltaTransposition% = DeltaTranspositions%(instrument%)
  return
  
ChangeFormat:
  ExportFormat% = item_index(61)
  return
    
MovePiano:
  off_mouse_move 2
  MovePiano()
  on_mouse_move 2,MovePiano
  return
  
clickPiano:
  if CanalPlein%(CanalActuel%)=1 then return
  
  x% = mouse_x_left_down(2)
  y% = mouse_y_left_down(2)
  cr% = color_pixel_red(2,x%,y%)
  cv% = color_pixel_green(2,x%,y%)
  cb% = color_pixel_blue(2,x%,y%)

  if cr%=255             : ' c'est une blanche ?
    note1% = 255 - cb%
    octave% = 255 - cv%
    note% = tabBlanches%(note1%) + DeltaTransposition%
    
    if note%<tabBlanches%(1)
      note% = note% + 12
      octave% = octave% - 1
    end_if
    if note%>tabBlanches%(7)
      note% = note% - 12
      octave% = octave% + 1
    end_if
    for i%=1 to 7
      if tabBlanches%(i%)=note%
        note1% = i%
        couleur% = 1
        exit_for
      end_if
    next i%
    for i%=1 to 5
      if tabNoires%(i%)=note%
        note1% = i%
        couleur% = 2
        exit_for
      end_if
    next i%
    
    nomOctave$ = mid$(tabOctave$,octave%,1)
    delta% = (octave%-5)*12
    if instrument%<>instrument1%
      nomNote$ = "i"+right$("00"+str$(instrument%),3)+"+"+nomOctave$+nomBlanches$(note1%)
    else
      nomNote$ = "+"+nomOctave$+nomBlanches$(note1%)
    end_if
    
    if couleur%=1
      note% = tabBlanches%(note1%) + delta%
      nomNote$ = "+"+nomOctave$+nomBlanches$(note1%)
      nomNote$ = "["+nomNote$+str$(position(42))+"-]"
      caption 7, "blanche "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
    else
      note% = tabNoires%(note1%) + delta%
      nomNote$ = "+"+nomOctave$+nomNoires$(note1%)
      nomNote$ = "["+nomNote$+str$(position(42))+"-]"
      caption 7, "noire "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
    end_if
    
    hauteur% = 5*dline% - (note1%-1)*dline%/2
  else
    if cr%=0             : ' est-ce une noire ?
      note1% = cb%
      octave% = cv%
      note% = tabNoires%(note1%)
      
      couleur% = 0
      note% = note% + DeltaTransposition%
      if note%<tabBlanches%(1)
        note% = note% + 12
        octave% = octave% - 1
      end_if
      if note%>tabBlanches%(7)
        note% = note% - 12
        octave% = octave% + 1
      end_if
      for i%=1 to 7
        if tabBlanches%(i%)=note%
          note1% = i%
          couleur% = 1
          exit_for
        end_if
      next i%
      for i%=1 to 5
        if tabNoires%(i%)=note%
          note1% = i%
          couleur% = 2
          exit_for
        end_if
      next i%
      
      nomOctave$ = mid$(tabOctave$,octave%,1)
      delta% = (octave%-5)*12
      if instrument%<>instrument1%
        nomNote$ = "i"+right$("00"+str$(instrument%),3)+"+"+nomOctave$+nomNoires$(note1%)
      else
        nomNote$ = "+"+nomOctave$+nomNoires$(note1%)
      end_if
      if couleur%=1
        note% = tabBlanches%(note1%) + delta%
        nomNote$ = "+"+nomOctave$+nomBlanches$(note1%)
        nomNote$ = "["+nomNote$+str$(position(42))+"-]"
        caption 7, "blanche "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
      else
        note% = tabNoires%(note1%) + delta%
        nomNote$ = "+"+nomOctave$+nomNoires$(note1%)
        nomNote$ = "["+nomNote$+str$(position(42))+"-]"
        caption 7, "noire "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
      end_if
      hauteur% = 5*dline% - (note1%-1)*dline%/2
      if note1%>2 then hauteur% = hauteur% - dline%/2
    end_if
  end_if
  instrument1% = instrument%
  mark_on 30+octave%
  set_focus 30+octave%
  display
  
  if ModeRemplacement%=0
    NombreCumulees%(CanalActuel%) = NombreCumulees%(CanalActuel%) + 1
    NotesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))       = note%
    NomsCumulees$(CanalActuel%,NombreCumulees%(CanalActuel%))        = nomNote$
    OctavesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))     = octave%
    Note1Cumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))       = note1%
    NoteCouleurCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%)) = couleur%
    InstrumentsCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))  = instrument%
    VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))      = position(42)
  
    DessinerNote()
    adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)) = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)-1) + 20
  else
    ClickCanal% = SaveCanal%
    ClickNote% = SaveNote%
    
    NotesCumulees%(ClickCanal%,ClickNote%)       = note%
    NomsCumulees$(ClickCanal%,ClickNote%)        = nomNote$
    OctavesCumulees%(ClickCanal%,ClickNote%)     = octave%
    Note1Cumulees%(ClickCanal%,ClickNote%)       = note1%
    NoteCouleurCumulees%(ClickCanal%,ClickNote%) = couleur%
    InstrumentsCumules%(ClickCanal%,ClickNote%)  = instrument%
    VolumesCumules%(ClickCanal%,ClickNote%)      = position(42)  
    
    hligne% = (ClickCanal%-1)*100
    x% = 20*ClickNote% -7
    2d_fill_color 255,255,255
    2d_pen_color 255,255,255
    2d_rectangle x%,hligne%,x%+19,hligne%+99
    
    2d_pen_color 0,0,0  
    2d_line x%,hligne%+20,x%+19,hligne%+20
    2d_line x%,hligne%+20+dline%,x%+19,hligne%+20+dline%
    2d_line x%,hligne%+20+2*dline%,x%+19,hligne%+20+2*dline%
    2d_line x%,hligne%+20+3*dline%,x%+19,hligne%+20+3*dline%
    2d_line x%,hligne%+20+4*dline%,x%+19,hligne%+20+4*dline%
    RedessinerNote()
    SaveCanal% = 0
    ModeRemplacement% = 0
    font_bold_off 13
  end_if
  return
  
exporter:
  temp% = 0
  for i%=1 to NombreCanaux%
    if NombreCumulees%(i%)>0 then temp% = 1
  next i%
  if temp%=0
    message "Il n'y a rien à exporter !"
    return
  end_if
  select ExportFormat%
    case 1
     filter 6,"Fichiers texte (*.TXT)|*.txt"
    case 2
     filter 6,"Fichiers MIDI (*.MID)|*.mid"
  end_select
  f$ = file_name$(6)
  if f$="_" then return
  if file_exists(f$)=1
    if message_confirmation_yes_no("Ce fichier existe déjà. Remplacer ?")<>1 then return
  end_if  
  select ExportFormat%
    case 1: ' format Composeur  
      clear 5
      sip% = PageActuelle%
      for ip%=1 to PagesTotal%
        ChargerPage(ip%)
          item_add 5,"Page "+str$(ip%)
          for j%=1 to NombreCanaux%
            item_add 5,"Canal "+str$(j%)
            if NombreCumulees%(j%)>0
              for i%=1 to NombreCumulees%(j%)
                item_add 5,NomsCumulees$(j%,i%)+"="+str$(NotesCumulees%(j%,i%))
              next i%
            end_if
          next j%
      next ip%
      ChargerPage(sip%)
      file_save 5,f$
    case 2: ' format MIDI_LOAD
      clear 5
      item_add 5,"#MIDI_EXPORT"
      item_add 5,str$(NombreCanaux%)
      sip% = PageActuelle%
      for ip%=1 to PagesTotal%
        ChargerPage(ip%)
          temp% = 0
          for i%=1 to NombreCanaux%
            if NombreCumulees%(i%)>temp% then temp% = NombreCumulees%(i%)
          next i%
          for i%=1 to temp%
            for j%=1 to NombreCanaux%
              if i%<=NombreCumulees%(j%)
                item_add 5,str$(InstrumentsCumules%(j%,i%))+","+str$(NotesCumulees%(j%,i%))+","+str$(VolumesCumules%(j%,i%))+",1,1"
              else
                item_add 5,"0,0,0,0,0"
              end_if
            next j%
          next i%
      next ip%
      ChargerPage(sip%)
      file_save 5,f$
  end_select
  return
  
effacer:
  color 1,255,255,255
  CanalActuel% = 1
  mark_on 100+CanalActuel%
  set_focus 100+CanalActuel%
  for i%=1 to NombreCanaux%
    NombreCumulees%(i%)        = 0
    CanalPlein%(i%)            = 0
    Adresse%(i%,0)             = 0
    InstrumentsCumules%(i%,0)  = 1
    VolumesCumules%(i%,0)      = VolumeDefaut%
    NotesCumulees%(i%,0)       = 0
    NomsCumulees$(i%,0)        = ""
    OctavesCumulees%(i%,0)     = 0
    Note1Cumulees%(i%,0)       = 0
    NoteCouleurCumulees%(i%,0) = 0
  next i%
  position 42,VolumeDefaut%
  ModeRemplacement% = 0
  font_bold_off 13
  trame()                
  return
  
jouer:
  temp% = 0
  for i%=1 to NombreCanaux%
    if NombreCumulees%(i%)>0 then temp% = 1
  next i%
  if temp%=0
    message "Il n'y a rien à exporter !"
    return
  end_if
  dll_on KGF$
  
  res% = DLL_call0("MIDI_Initialize")
  res% = DLL_call1("MIDI_Reset",NombreCanaux%)
  sip% = PageActuelle%
  temp% = 0
  for ip%=1 to PagesTotal%
    ChargerPage(ip%)
    maxNotes% = 0
    for j%=1 to NombreCanaux%
      if NombreCumulees%(j%)>maxNotes% then maxNotes% = NombreCumulees%(j%)
    next j%
    for j%=1 to NombreCanaux%
      notes$ = ""
      for i%=1 to maxNotes%
        s$ = NomsCumulees$(j%,i%)
        if s$="" then s$ = "[]" : '  "[+0do0-]"
        notes$ = notes$ + s$ + " "
      next i%
' message str$(ip%)+"/"+str$(j%)+"="+notes$+"   "+NomsCumulees$(j%,1)      
      res% = DLL_call3("MIDI_Compile",j%,temp%,adr(notes$))
      temp% = 1
    next j%
  next ip%
  ChargerPage(sip%)
  res% = DLL_call1("MIDI_Play",10)
  res% = DLL_call0("MIDI_Stop")
  
  dll_off
  return
  
changecanal:
  CanalActuel% = number_click - 100
  set_focus 100+CanalActuel%
  text 40,item_read$(40,InstrumentsCumules%(CanalActuel%,NombreCumulees%(CanalActuel%)))
  position 42,VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))
  return
  
ClickPartition:
  x% = mouse_x_left_down(1)
  y% = mouse_y_left_down(1)
  ClickCanal% = (y%-20+99)/100  
  ClickNote% = (x%-20+19)/20
  if ClickNote%>NombreCumulees%(ClickCanal%) then return
  MarquerClick(ClickCanal%,ClickNote%)
  
  return  
  
Remplacer:
  if SaveCanal%>0
    ModeRemplacement% = 1
    font_bold 13
  else
    message "Aucune note n'est sélectionnée !"
  end_if
  return
  
Supprimer:
  if SaveCanal%>0
    SupprimerNote()
    SaveCanal% = 0
    CanalPlein%(CanalActuel%) = 0
  else
    message "Aucune note n'est sélectionnée !"
  end_if
  return
  
Inserer:
  if SaveCanal%>0
    if NombreCumulees%(CanalActuel%)>=NombreNotesMaxi%
      message "La portée est pleine !"
      return
    end_if
    InsererNote()
    SaveCanal% = 0
    if NombreCumulees%(CanalActuel%)>=NombreNotesMaxi% then CanalPlein%(CanalActuel%) = 1
  else
    message "Aucune note n'est sélectionnée !"
  end_if
  return  
  
PremierePage:
  ChargerPage(1)
  return

PagePrecedente:
  ChargerPage(PageActuelle%-1)
  return
  
PageNouvelle:
  CreerPage()
  return

PageSuivante:
  ChargerPage(PageActuelle%+1)
  return

DernierePage:
  ChargerPage(PagesTotal%)
  return
  
  
  
  
  
  
sub DessinerPause()
  dim_local a%, hligne%
  a% = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)-1) + 15
  hligne% = 20 + (CanalActuel%-1)*100
  2d_rectangle a%,hligne%+hauteur%,a%+dline%,hligne%+hauteur%+dline%/2
  if adresse%(CanalActuel%,NombreCumulees%(CanalActuel%))>(width_client(1)-25) then CanalPlein%(CanalActuel%) = 1

  print_locate a%,hligne%-15
  print str$(NombreCumulees%(CanalActuel%))
end_sub
  
sub DessinerNote()
  dim_local a%, hligne%
  a% = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)-1) + 20
  hligne% = 20 + (CanalActuel%-1)*100
  if NoteCouleurCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))=2
    print_locate a%-9,hligne%+hauteur%-7
    print "#"
    a% = a% + 5
    adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)) = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)) + 3
  end_if
  2d_circle a%,hligne%+hauteur%,dline%/2
  if Note1Cumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))=1
  2d_line a%-7,hligne%+hauteur%,a%+7,hligne%+hauteur%
  end_if
  print_locate a%-5,hligne%+57
  print mid$(tabOctave$,octave%,1)
  print_locate a%-5,hligne%-15
  print str$(NombreCumulees%(CanalActuel%))
  
  if adresse%(CanalActuel%,NombreCumulees%(CanalActuel%))>(width_client(1)-25) then CanalPlein%(CanalActuel%) = 1

end_sub

sub trame()
  ' v% donne le numéro de la trame dans la page (1=première ligne)
  dim_local hligne%, v%
  v% = 0
  hligne% = 0
  for v%=1 to NombreCanaux%
    hligne% = 20 + (v%-1)*100
    2d_line 0,hligne%,w%,hligne%
    2d_line 0,hligne%+dline%,w%,hligne%+dline%
    2d_line 0,hligne%+2*dline%,w%,hligne%+2*dline%
    2d_line 0,hligne%+3*dline%,w%,hligne%+3*dline%
    2d_line 0,hligne%+4*dline%,w%,hligne%+4*dline%

    ' séparateur de mesure
    2d_line 10,hligne%,10,hligne%+4*dline%
  next v%
end_sub

sub DessinerOctave(id%,x%)
  2d_fill_color 255,255-id%,254
  2d_rectangle x%,0,x%+20,80
  2d_fill_color 255,255-id%,253
  2d_rectangle x%+20,0,x%+40,80
  2d_fill_color 255,255-id%,252
  2d_rectangle x%+40,0,x%+60,80
  2d_fill_color 255,255-id%,251
  2d_rectangle x%+60,0,x%+80,80
  2d_fill_color 255,255-id%,250
  2d_rectangle x%+80,0,x%+100,80
  2d_fill_color 255,255-id%,249
  2d_rectangle x%+100,0,x%+120,80
  2d_fill_color 255,255-id%,248
  2d_rectangle x%+120,0,x%+140,80
'  2d_pen_color 0,id%,1
  2d_fill_color 0,id%,1
  2d_rectangle x%+12,0,x%+28,40
  2d_fill_color 0,id%,2
  2d_rectangle x%+32,0,x%+48,40
  2d_fill_color 0,id%,3
  2d_rectangle x%+72,0,x%+88,40
  2d_fill_color 0,id%,4
  2d_rectangle x%+92,0,x%+108,40
  2d_fill_color 0,id%,5
  2d_rectangle x%+112,0,x%+128,40
end_sub

sub MovePiano()
  dim_local i%, couleur2%
    
  x% = mouse_x_position(2)
  y% = mouse_y_position(2)
  cr% = color_pixel_red(2,x%,y%)
  cv% = color_pixel_green(2,x%,y%)
  cb% = color_pixel_blue(2,x%,y%)
  
  if cb%=0 then exit_sub   : ' ne pas réagir sur une bordure de touche !
  
  if cr%=255             : ' c'est une blanche ?
    note2% = 255 - cb%
    octave2% = 255 - cv%
    note2a% = tabBlanches%(note2%)

    couleur2% = 0
    note2a% = note2a% + DeltaTransposition%
    if note2a%<tabBlanches%(1)
      note2a% = note2a% + 12
      octave2% = octave2% - 1
    end_if
    if note2a%>tabBlanches%(7)
      note2a% = note2a% - 12
      octave2% = octave2% + 1
    end_if
    for i%=1 to 7
      if tabBlanches%(i%)=note2a%
        note2% = i%
        couleur2% = 1
        exit_for
      end_if
    next i%
    for i%=1 to 5
      if tabNoires%(i%)=note2a%
        note2% = i%
        couleur2% = 2
        exit_for
      end_if
    next i%
    
    nomOctave2$ = mid$(tabOctave$,octave2%,1)
    delta2% = (octave2%-5)*12
    if couleur2%=1
      note2a% = tabBlanches%(note2%) + delta2%
      nomNote2$ = "+"+nomOctave2$+nomBlanches$(note2%)
      nomNote2$ = "["+nomNote2$+str$(position(42))+"-]"
      caption 7, "blanche "+str$(note2%)+"  "+str$(note2a%)+" = "+nomNote2$
    else
      note2a% = tabNoires%(note2%) + delta2%
      nomNote2$ = "+"+nomOctave2$+nomNoires$(note2%)
      nomNote2$ = "["+nomNote2$+str$(position(42))+"-]"
      caption 7, "noire "+str$(note2%)+"  "+str$(note2a%)+" = "+nomNote2$
    end_if
  else
    if cr%=0             : ' est-ce une noire ?
      note2% = cb%
      octave2% = cv%
      note2a% = tabNoires%(note2%)
      
      couleur2% = 0
      note2a% = note2a% + DeltaTransposition%
      if note2a%<tabBlanches%(1)
        note2a% = note2a% + 12
        octave2% = octave2% - 1
      end_if
      if note2a%>tabBlanches%(7)
        note2a% = note2a% - 12
        octave2% = octave2% + 1
      end_if
      for i%=1 to 7
        if tabBlanches%(i%)=note2a%
          note2% = i%
          couleur2% = 1
          exit_for
        end_if
      next i%
      for i%=1 to 5
        if tabNoires%(i%)=note2a%
          note2% = i%
          couleur2% = 2
          exit_for
        end_if
      next i%
  
      nomOctave2$ = mid$(tabOctave$,octave2%,1)
      delta2% = (octave2%-5)*12
      if couleur2%=1
        note2a% = tabBlanches%(note2%) + delta2%
        nomNote2$ = "+"+nomOctave2$+nomBlanches$(note2%)
        nomNote2$ = "["+nomNote2$+str$(position(42))+"-]"
        caption 7, "blanche "+str$(note2%)+"  "+str$(note2a%)+" = "+nomNote2$
      else
        note2a% = tabNoires%(note2%) + delta2%
        nomNote2$ = "+"+nomOctave2$+nomNoires$(note2%)
        nomNote2$ = "["+nomNote2$+str$(position(42))+"-]"
        caption 7, "noire "+str$(note2%)+"  "+str$(note2a%)+" = "+nomNote2$
      end_if
    end_if
  end_if

end_sub

sub SupprimerNote()
  dim_local hligne%, x%, nrest%, i%
  hligne% = (ClickCanal%-1)*100
  x% = 20*ClickNote% -7
  if ClickNote%<NombreCumulees%(ClickCanal%)
    nrest% = NombreCumulees%(ClickCanal%) - ClickNote%
    2d_image_copy 201,x%+20,hligne%,x%+nrest%*20+19,hligne%+99
    2d_image_paste 201,x%,hligne%
    x% = 20*NombreCumulees%(ClickCanal%)-7
    for i%=ClickNote% to NombreCumulees%(ClickCanal%)-1
      NotesCumulees%(ClickCanal%,i%)       = NotesCumulees%(ClickCanal%,i%+1)
      NomsCumulees$(ClickCanal%,i%)        = NomsCumulees$(ClickCanal%,i%+1)
      OctavesCumulees%(ClickCanal%,i%)     = OctavesCumulees%(ClickCanal%,i%+1)
      Note1Cumulees%(ClickCanal%,i%)       = Note1Cumulees%(ClickCanal%,i%+1)
      NoteCouleurCumulees%(ClickCanal%,i%) = NoteCouleurCumulees%(ClickCanal%,i%+1)
      InstrumentsCumules%(ClickCanal%,i%)  = InstrumentsCumules%(ClickCanal%,i%+1)
      adresse%(ClickCanal%,i%)             = adresse%(ClickCanal%,i%+1) - 20
      VolumesCumules%(ClickCanal%,i%)      = VolumesCumules%(ClickCanal%,i%+1)
    next i%
  end_if
  2d_pen_color 255,255,255
  2d_rectangle x%,hligne%,x%+19,hligne%+99
  2d_pen_color 0,0,0
  2d_line x%,hligne%+20,x%+19,hligne%+20
  2d_line x%,hligne%+20+dline%,x%+19,hligne%+20+dline%
  2d_line x%,hligne%+20+2*dline%,x%+19,hligne%+20+2*dline%
  2d_line x%,hligne%+20+3*dline%,x%+19,hligne%+20+3*dline%
  2d_line x%,hligne%+20+4*dline%,x%+19,hligne%+20+4*dline%
  NombreCumulees%(ClickCanal%) = NombreCumulees%(ClickCanal%) - 1
  
  x% = 20*ClickNote% -7
  2d_pen_color 255,255,255
  2d_rectangle x%,hligne%-5,20*NotesCumulees%(ClickCanal%,i%),hligne%
  2d_pen_color 0,0,0
  nrest% = NombreCumulees%(ClickCanal%) - ClickNote%
  for i%=1 to nrest%+1
    print_locate x%+(i%-1)*20,hligne%+5
    print str$(ClickNote%+i%-1)
  next i%  
end_sub    

sub InsererNote()
  dim_local hligne%, x%, nrest%, i%
  hligne% = (ClickCanal%-1)*100
  x% = 20*ClickNote% -7
  hligne% = (SaveCanal%-1)*100
  x% = 20*SaveNote% -7
  2d_image_paste 201,x%,hligne%
  nrest% = NombreCumulees%(ClickCanal%) + 1 - ClickNote%
  2d_image_copy 201,x%,hligne%,x%+nrest%*20+19,hligne%+99
  2d_image_paste 201,x%+20,hligne%
  for i%=NombreCumulees%(ClickCanal%) to ClickNote% step -1
    NotesCumulees%(ClickCanal%,i%+1)       = NotesCumulees%(ClickCanal%,i%)
    NomsCumulees$(ClickCanal%,i%+1)        = NomsCumulees$(ClickCanal%,i%)
    OctavesCumulees%(ClickCanal%,i%+1)     = OctavesCumulees%(ClickCanal%,i%)
    Note1Cumulees%(ClickCanal%,i%+1)       = Note1Cumulees%(ClickCanal%,i%)
    NoteCouleurCumulees%(ClickCanal%,i%+1) = NoteCouleurCumulees%(ClickCanal%,i%)
    InstrumentsCumules%(ClickCanal%,i%+1)  = InstrumentsCumules%(ClickCanal%,i%)
    adresse%(ClickCanal%,i%+1)             = adresse%(ClickCanal%,i%) + 20
    VolumesCumules%(ClickCanal%,i%+1)      = VolumesCumules%(ClickCanal%,i%)
  next i%
  NombreCumulees%(ClickCanal%) = NombreCumulees%(ClickCanal%) + 1

  x% = 20*ClickNote% -7
  2d_pen_color 255,255,255
  2d_rectangle x%,hligne%-5,20*NotesCumulees%(ClickCanal%,i%),hligne%
  2d_pen_color 0,0,0
  nrest% = NombreCumulees%(ClickCanal%) - ClickNote%
  for i%=1 to nrest%+1
    print_locate x%+(i%-1)*20,hligne%+5
    print str$(ClickNote%+i%-1)
  next i%
end_sub          

                                
sub MarquerClick()
  dim_local hligne%, x%
  if SaveCanal%>0
    hligne% = (SaveCanal%-1)*100
    x% = 20*SaveNote% -7
    2d_image_paste 201,x%,hligne%
  end_if    
  SaveCanal% = ClickCanal%
  SaveNote% = ClickNote%
  hligne% = (ClickCanal%-1)*100
  x% = 20*ClickNote% -7
  2d_image_copy 201,x%,hligne%,x%+19,hligne%+99
  2d_fill_color 200,200,255
  2d_pen_color 200,200,255
  2d_rectangle x%,hligne%,x%+19,hligne%+99
  
  2d_pen_color 0,0,0
  2d_line x%,hligne%+20,x%+19,hligne%+20
  2d_line x%,hligne%+20+dline%,x%+19,hligne%+20+dline%
  2d_line x%,hligne%+20+2*dline%,x%+19,hligne%+20+2*dline%
  2d_line x%,hligne%+20+3*dline%,x%+19,hligne%+20+3*dline%
  2d_line x%,hligne%+20+4*dline%,x%+19,hligne%+20+4*dline%
  
  if NotesCumulees%(ClickCanal%,ClickNote%)=0
    RedessinerPause()
  else
    RedessinerNote()
  end_if
  
  2d_fill_color 255,255,255
    
end_sub

sub RedessinerPause()
  dim_local a%, hligne%
  a% = adresse%(ClickCanal%,ClickNote%)-5
  hligne% = (ClickCanal%-1)*100
  hauteur% = 2*dline%
  2d_rectangle a%,hligne%+20+hauteur%,a%+dline%,hligne%+20+hauteur%+dline%/2

  print_locate a%,hligne%+5
  print str$(ClickNote%)
end_sub

sub RedessinerNote()    
  dim_local a%, hligne%
  
  a% = adresse%(ClickCanal%,ClickNote%)
  hligne% = 20 + (ClickCanal%-1)*100
  hauteur% = 5*dline% - (Note1Cumulees%(ClickCanal%,ClickNote%)-1)*dline%/2
  
  if NoteCouleurCumulees%(ClickCanal%,ClickNote%)=2
    hauteur% = 5*dline% - (Note1Cumulees%(ClickCanal%,ClickNote%)-1)*dline%/2
    if Note1Cumulees%(ClickCanal%,ClickNote%)>2 then hauteur% = hauteur% - dline%/2
'    print_locate a%-9,hligne%+hauteur%-7
    print_locate a%-6,hligne%+hauteur%-7
    print "#"
    a% = a% + 5
  end_if
  2d_circle a%,hligne%+hauteur%,dline%/2
  if Note1Cumulees%(ClickCanal%,ClickNote%)=1
  2d_line a%-7,hligne%+hauteur%,a%+7,hligne%+hauteur%
  end_if
  print_locate a%-5,hligne%+57
  print mid$(tabOctave$,octave%,1)  

  print_locate a%-5,hligne%-15
  print str$(ClickNote%)

end_sub
  
sub ChargerPage(page%)
  dim_local image%, dlist%, c%, i%, s$, n%
  if page%=PageActuelle% then exit_sub
  if page%<1 then exit_sub
  if page%>PagesTotal% then exit_sub
  
  ' sauvegarder la page actuelle
  SauverPage()
  
  ' récupérer l'image de la page
  PageActuelle% = page%
  dlist% = 1000 + PageActuelle%
  image% = 2000 + PageActuelle%
  2d_image_paste image%,0,0
  
  ' récupérer les variables de la page
  n% = 0
  ViderVariables()
' for i%=1 to NombreCanaux%
'   message "a - ChargerPage: Canal "+str$(i%)+": "+str$(NombreCumulees%(i%))+"   "+NomsCumulees$(i%,1)
' next i%
  for c%=1 to NombreCanaux%
    n% = n% + 1
    s$ = item_read$(dlist%,n%)
    n% = n% + 1
    NombreCumulees%(c%) = val(s$)
    s$ = item_read$(dlist%,n%)
    CanalPlein%(c%) = val(s$)
    for i%=0 to NombreCumulees%(c%)
      n% = n% + 1
      s$ = item_read$(dlist%,n%)
      NotesCumulees%(c%,i%) = val(s$)
      n% = n% + 1
      s$ = item_read$(dlist%,n%)
      NomsCumulees$(c%,i%) = s$
      n% = n% + 1
      s$ = item_read$(dlist%,n%)
      OctavesCumulees%(c%,i%) = val(s$)
      n% = n% + 1
      s$ = item_read$(dlist%,n%)
      Note1Cumulees%(c%,i%) = val(s$)
      n% = n% + 1
      s$ = item_read$(dlist%,n%)
      NoteCouleurCumulees%(c%,i%) = val(s$)
      n% = n% + 1
      s$ = item_read$(dlist%,n%)
      InstrumentsCumules%(c%,i%) = val(s$)
      n% = n% + 1
      s$ = item_read$(dlist%,n%)
      adresse%(c%,i%) = val(s$)
      n% = n% + 1
      s$ = item_read$(dlist%,n%)
      VolumesCumules%(c%,i%) = val(s$)  
    next i%
  next c%
  
  if PageActuelle%=PagesTotal%
    active 73
  else
    inactive 73
  end_if
  caption 70,"Pages: "+str$(PageActuelle%)+"/"+str$(PagesTotal%)
' for i%=1 to NombreCanaux%
'   message "b - ChargerPage: Canal "+str$(i%)+": "+str$(NombreCumulees%(i%))+"   "+NomsCumulees$(i%,1)
' next i%
end_sub

sub CreerPage()
  dim_local c%, i%
' for i%=1 to NombreCanaux%
'   message "a: Canal "+str$(i%)+": "+str$(NombreCumulees%(i%))
' next i%
  SauverPage()
  PageActuelle% = PageActuelle% + 1
  PagesTotal% = PagesTotal% + 1
  dlist 1000 + PageActuelle%
  image 2000 + PageActuelle%
  color 1,255,255,255
  ViderVariables()
  Trame()
  SauverPage()
  caption 70,"Pages: "+str$(PageActuelle%)+"/"+str$(PagesTotal%)
' for i%=1 to NombreCanaux%
'   message "b: Canal "+str$(i%)+": "+str$(NombreCumulees%(i%))
' next i%
end_sub
                                  
sub ViderVariables()
  dim_local c%, i%
  for c%=1 to NombreCanaux%
    for i%=0 to NombreCumulees%(c%)
      NotesCumulees%(c%,i%)       = 0
      NomsCumulees$(c%,i%)        = ""
      OctavesCumulees%(c%,i%)     = 0
      Note1Cumulees%(c%,i%)       = 0
      NoteCouleurCumulees%(c%,i%) = 0
      InstrumentsCumules%(c%,i%)  = 1
      adresse%(c%,i%)             = 0
      VolumesCumules%(c%,i%)      = VolumeDefaut%  
    next i%
    NombreCumulees%(c%)           = 0
    CanalPlein%(c%)               = 0
  next c%
end_sub

sub SauverPage()
  dim_local dlist%, image%, c%, i%, nmax%
  dlist% = 1000 + PageActuelle%
  image% = 2000 + PageActuelle%
  
  ' sauvegarder l'image sans un éventuel marquage de note
  if SaveCanal%>0
    hligne% = (SaveCanal%-1)*100
    x% = 20*SaveNote% -7
    2d_image_paste 201,x%,hligne%
    SaveCanal% = 0    
  end_if
  2d_image_copy image%,0,0,width(1),height(1)
  
' for i%=1 to NombreCanaux%
'   message "SauverPage: Canal "+str$(i%)+": "+str$(NombreCumulees%(i%))
' next i%
  ' sauvegarder les variables
  clear dlist%
  for c%=1 to NombreCanaux%
    item_add dlist%,str$(NombreCumulees%(c%))
    item_add dlist%,str$(CanalPlein%(c%))
    for i%=0 to NombreCumulees%(c%)
      item_add dlist%,str$(NotesCumulees%(c%,i%))
      item_add dlist%,NomsCumulees$(c%,i%)
      item_add dlist%,str$(OctavesCumulees%(c%,i%))
      item_add dlist%,str$(Note1Cumulees%(c%,i%))
      item_add dlist%,str$(NoteCouleurCumulees%(c%,i%))
      item_add dlist%,str$(InstrumentsCumules%(c%,i%))
      item_add dlist%,str$(adresse%(c%,i%))
      item_add dlist%,str$(VolumesCumules%(c%,i%))  
    next i%
' message "SauverPage: "+str$(c%)+"/"+NomsCumulees$(c%,1)    
  next c%
'  file_save dlist%,"dlist_"+str$(dlist%)+".txt"     : ' <================== supprimer !
end_sub

Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

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

MessageSujet: Re: Maquette d'une rédaction de partition de piano   Ven 9 Fév 2018 - 10:23

Nouvelle version.

J'ai redéfini le format d'export "Composeur" et j'ai ajouté un bouton "Import". Ceci permet d'exporter la composition en cours, même s'il y a plusieurs pages, et de la réimporter plus tard. Tout sera rechargé correctement, et la partition de toutes les pages sera regénérée.
Code:
' Composeur_de_Partition.bas                                               

inactive 0                                   
caption 0,"Composeur de Partition"

label clickPiano, exporter, changevolume, jouer, effacer, changecanal
label PianoPause, MovePiano, changetransposition, changeinstrument, ChangeFormat
label ClickPartition, Remplacer, Supprimer, Inserer, importer, ImportError
label PremierePage, PagePrecedente, PageNouvelle, PageSuivante, DernierePage

dim KGF$ : KGF$ = "KGF.dll"         

dim w%, h%, dline%, x%, y%, cr%, cv%, cb%, note1%, note%, i%, j%, nom$, notes$, s$
dim res%, no%, temp%
dim octave%, delta%, instrument%, instrument1%, canal%
dim couleur%, hauteur%, dhauteur%, hligne%, f$
dim tabBlanches%(7), tabNoires%(5)                           
dim nomBlanches$(7), nomNoires$(5)
dim DeltaTranspositions%(127), DeltaTransposition%
dim tabOctave$, nomOctave$, nomNote$
dim NombreCanaux%, CanalActuel%, VolumeDefaut%, ExportFormat%, NombreNotesMaxi%
dim note2%, octave2%, nomOctave2$, delta2%, note2a%, nomNote2$
dim ClickCanal%, ClickNote%, SaveCanal%, SaveNote%, ModeRemplacement%
dim PageActuelle%, PagesTotal%, ip%, sip%,maxNotes%

data "do",60,"re",62,"mi",64,"fa",65,"sol",67,"la",69,"si",71  : ' notes blanches
data "do#",61,"re#",63,"fa#",66,"sol#",68,"la#",70              : ' notes noires

' ici; décalage de transposition, nom instrument
data 0,"Bright acoustic piano"
data 0,"Electric grand piano"
data 0,"Honky-tonk piano"
data 0,"Rhodes piano"
data 0,"Chorused piano"
data 0,"Harpsichord"
data 0,"Clavinet"
data 0,"Celesta"
data 0,"Glockenspiel"
data 0,"Music box"
data 0,"Vibraphone"
data 0,"Marimba"
data 0,"Xylophone"
data 0,"Tubular bells"
data 0,"Dulcimer"
data 0,"Hammond organ"
data 0,"Percussive organ"
data 0,"Rock organ"
data 0,"Church organ"
data 0,"Reed organ"
data 0,"Accordion"
data 0,"Harmonica"
data 0,"Tango accordion"
data 0,"Acoustic guitar (nylon)"
data 0,"Acoustic guitar (steel)"
data 0,"Electric guitar (jazz)"
data 0,"Electric guitar (clean)"
data 0,"Electric guitar (muted)"
data 0,"Overdriven guitar"
data 0,"Distortion guitar"
data 0,"Guitar harmonics"
data 0,"Acoustic bass"
data 0,"Electric bass (finger)"
data 0,"Electric bass (pick)"
data 0,"Fretless bass"
data 0,"Slap bass 1"
data 0,"Slap bass 2"
data 0,"Synth bass 1"
data 0,"Synth bass 2"
data 0,"Violin"
data 0,"Viola"
data 0,"Cello"
data 0,"Contrabass"
data 0,"Tremolo strings"
data 0,"Pizzicato strings"
data 0,"Orchestral harp"
data 0,"Timpani"
data 0,"String ensemble 1"
data 0,"String ensemble 2"
data 0,"Synth. strings 1"
data 0,"Synth. strings 2"
data 0,"Choir Aahs"
data 0,"Voice Oohs"
data 0,"Synth voice"
data 0,"Orchestra hit"
data 0,"Trumpet"
data 0,"Trombone"
data 0,"Tuba#966"
data 0,"Muted trumpet"
data 0,"French horn"
data 0,"Brass section"
data 0,"Synth. brass 1"
data 0,"Synth. brass 2"
data 0,"Soprano sax"
data 0,"Alto sax"
data 0,"Tenor sax"
data 0,"Baritone sax"
data 0,"Oboe"
data 0,"English horn"
data 0,"Bassoon"
data 0,"Clarinet"
data 0,"Piccolo"
data 0,"Flute"
data 0,"Recorder"
data 0,"Pan flute"
data 0,"Bottle blow"
data 0,"Shakuhachi"
data 0,"Whistle"
data 0,"Ocarina"
data 0,"Lead 1 (square)"
data 0,"Lead 2 (sawtooth)"
data 0,"Lead 3 (calliope lead)"
data 0,"Lead 4 (chiff lead)"
data 0,"Lead 5 (charang)"
data 0,"Lead 6 (voice)"
data 0,"Lead 7 (fifths)"
data 0,"Lead 8 (brass + lead)"
data 0,"Pad 1 (new age)"
data 0,"Pad 2 (warm)"
data 0,"Pad 3 (polysynth)"
data 0,"Pad 4 (choir)"
data 0,"Pad 5 (bowed)"
data 0,"Pad 6 (metallic)"
data 0,"Pad 7 (halo)"
data 0,"Pad 8 (sweep)"
data 0,"Synth SFX 1 Ice Rain"
data 0,"Synth SFX 2 Sound Track"
data 0,"Synth SFX 3 Crystal"
data 0,"Synth SFX 4 Atmosphere"
data 0,"Synth SFX 5 Brightness"
data 0,"Synth SFX 6 Goblin"
data 0,"Synth SFX 7 Echo Drops"
data 0,"Synth SFX 8 Star Theme"
data 0,"Sitar"
data 0,"Banjo"
data 0,"Shamisen"
data 0,"Koto"
data 0,"Kalimba"
data 0,"Bagpipe"
data 0,"Fiddle"
data 0,"Shanai"
data 0,"Tinkle Bells"
data 0,"Agogo"
data 0,"Steel Drums"
data 0,"Woodblock"
data 0,"Taiko Drum"
data 0,"Melodic Drum"
data 0,"Synth Drum"
data 0,"Reverse Cymbal"
data 0,"Guitar fret noise"
data 0,"Breath noise"
data 0,"Seashore"
data 0,"Bird tweet"
data 0,"Telephone ring"
data 0,"Helicopter"
data 0,"Applause"
data 0,"Gunshot"


tabOctave$ = "dcba0123"
VolumeDefaut% = 80

for i%=1 to 7
  read nomBlanches$(i%)
  read tabBlanches%(i%)
next i%
for i%=1 to 5
  read nomNoires$(i%)
  read tabNoires%(i%)
next i%
for i%=1 to 127
  DeltaTranspositions%(i%) = 0
next i%

octave% = 5
delta% = 0
hauteur% = 5*dline%
hligne% = 20
ModeRemplacement% = 0
PageActuelle% = 1
PagesTotal% = 1
dlist 1001          : ' pour la page 1
image 2001          : ' pour page actuelle

full_space 0


picture 1 : top 1,140 : left 1,30 : on_click 1,ClickPartition
  width 1,width_client(0)-50 : height 1,height_client(0)-140
w% = width_client(1)
dline% = 10
NombreNotesMaxi% = (width_client(1)-20)/20

picture 2 : width 2,1020 : height 2,80
2d_target_is 2
2d_pen_color 1,0,0
DessinerOctave(1,-100)
DessinerOctave(2,40)
DessinerOctave(3,180)
DessinerOctave(4,320)
DessinerOctave(5,460)
DessinerOctave(6,600)
DessinerOctave(7,740)
DessinerOctave(8,880)
on_mouse_move 2,MovePiano

container_option 100 : top 100,135 : left 100,0 : width 100,35 : height 100,height(1)+5
  i% = 40
  no% = 100
  while i%<height_client(1)
    no% = no% + 1
    option no% : parent no%,100 : top no%,i% : left no%,10 : width no%,20 : on_click no%,changecanal
    i% = i% + 100
  end_while
  NombreCanaux% = no% - 100
dim NotesCumulees%(NombreCanaux%,100), NomsCumulees$(NombreCanaux%,100)
dim OctavesCumulees%(NombreCanaux%,100), Note1Cumulees%(NombreCanaux%,100)
dim NoteCouleurCumulees%(NombreCanaux%,100), NombreCumulees%(NombreCanaux%)
dim InstrumentsCumules%(NombreCanaux%,100), adresse%(NombreCanaux%,100)
dim CanalPlein%(NombreCanaux%), VolumesCumules%(NombreCanaux%,100)
for i%=1 to NombreCanaux%
  NombreCumulees%(i%) = 0
  CanalPlein%(i%) = 0
  Adresse%(i%,0) = 0
  InstrumentsCumules%(i%,0) = 1
  VolumesCumules%(i%,0) = VolumeDefaut%
next i%

on_click 2,clickPiano

container_option 3 : top 3,10 : width 3,130 : height 3,40 : left 3,width(2)+10
  caption 3,"Octaves"
option 31 : parent 31,3 : top 31,15 : left 31,5 :  width 31,20
option 32 : parent 32,3 : top 32,15 : left 32,20 : width 32,20
option 33 : parent 33,3 : top 33,15 : left 33,35 : width 33,20
option 34 : parent 34,3 : top 34,15 : left 34,50 : width 34,20
option 35 : parent 35,3 : top 35,15 : left 35,65 : width 35,20
option 36 : parent 36,3 : top 36,15 : left 36,80 : width 36,20
option 37 : parent 37,3 : top 37,15 : left 37,95 : width 37,20
option 38 : parent 38,3 : top 38,15 : left 38,110 : width 38,15
mark_on 30+octave%
set_focus 30+octave%

alpha 70 : top 70,top(3) : left 70,left(3)+width(3)+15
  caption 70,"Pages: "+str$(PageActuelle%)+"/"+str$(PagesTotal%)
button 71 : top 71,top(70)+15 : left 71,left(70) : width 71,30 : caption 71,"|<" : on_click 71,PremierePage
button 72 : top 72,top(70)+15 : left 72,left(71)+width(71) : width 72,30 : caption 72,"<" : on_click 72,PagePrecedente
button 73 : top 73,top(70)+15 : left 73,left(72)+width(72) : width 73,30 : caption 73,"+" : on_click 73,PageNouvelle
button 74 : top 74,top(70)+15 : left 74,left(73)+width(73) : width 74,30 : caption 74,">" : on_click 74,PageSuivante
button 75 : top 75,top(70)+15 : left 75,left(74)+width(74) : width 75,30 : caption 75,">|" : on_click 75,DernierePage

2d_target_is 1
2d_fill_off
print_target_is 1
font_size 1,8

button 15 : top 15,100 : left 15,320 : caption 15,"X" : width 15,30 : on_click 15,Supprimer
button 14 : top 14,100 : left 14,left(15)+width(15) : caption 14,"+" : width 14,30 : on_click 14,Inserer
button 13 : top 13,100 : left 13,left(14)+width(14) : caption 13,"Remplacer" : on_click 13,Remplacer
button 11 : top 11,100 : left 11,left(13)+width(13) : caption 11,"Effacer tout" : on_click 11,Effacer
dlist 5
save_dialog 6
open_dialog 17
alpha 8 : top 8,110 : left 8,10 : caption 8,"Note jouée:"
alpha 7 : top 7,110 : left 7,80 : font_bold 7
button 9 : top 9,100 : left 9,left(11)+width(11) : caption 9,"Jouer" : on_click 9,jouer

alpha 60 : top 60,110 : left 60,left(9)+width(9)+20 : caption 60,"Format:"
combo 61 : top 61,105 : left 61,left(60)+50 : width 61,90 : on_change 61,ChangeFormat
  item_add 61,"Composeur"
  item_add 61,"MIDI_Import"
  text 61,item_read$(61,2)
ExportFormat% = 2
button 4 : top 4,100 : left 4,left(61)+width(61) : caption 4,"Exporter" : on_click 4,exporter
button 16 : top 16,100 : left 16,left(4)+width(4) : caption 16,"Importer" : on_click 16,importer

button 12 : top 12,top(2)+height(2) : left 12,0 : width 12,width(2) : height 12,15 : caption 12,"Pause" : on_click 12,PianoPause

combo 40 : top 40,60 : left 40,width(2)+10 : width 40,150
for i%=1 to 127
  read DeltaTranspositions%(i%)
  read s$
  item_add 40,s$
next i%
text 40,item_read$(40,1)
on_click 40,changeinstrument
instrument1% = 0
instrument% = 1

alpha 41 : top 41,90 : left 41,left(40) : caption 41,"Volume:"
scroll_bar 42 : top 42,90 : left 42,left(41)+50 : width 42,150
  min 42,0 : max 42,127 : position 42,VolumeDefaut% : on_change 42,changevolume
alpha 43: top 43,90 : left 43,left(42)+width(42)+10 : caption 43,"80"

alpha 51 : top 51,120 : left 51,left(40) : caption 51,"Transpo:"
scroll_bar 52 : top 52,120 : left 52,left(51)+50 : width 52,150
  min 52,-11 : max 52,11 : position 52,0 : on_change 52,changetransposition
alpha 53: top 53,120 : left 53,left(52)+width(52)+10 : caption 53,"0"

CanalActuel% = 1
mark_on 100+CanalActuel%

image 201              : ' image de travail interne
SaveCanal% = 0
SaveNote%  = 0

trame()
SauverPage()

form 3000 : hide 3000 : border_hide 3000 : height 3000,110 : top 3000,(screen_y-height(3000))/2 : left 3000,(screen_x-width(3000))/2
alpha 3001 : parent 3001,3000 : top 3001,20 : left 3001,20 :caption 3001,"Pages:"
alpha 3002 : parent 3002,3000 : top 3002,50 : left 3002,20 :caption 3002,"Chargement:"
alpha 3003 : parent 3003,3000 : top 3003,80 : left 3003,20 :caption 3003,"Construction:"
progress_bar 3011 : parent 3011,3000 : top 3011,20 : left 3011,100 : width 3011,200
  min 3011,0 : position 3011,0
progress_bar 3012 : parent 3012,3000 : top 3012,50 : left 3012,100 : width 3012,200
  min 3012,0 : position 3012,0
progress_bar 3013 : parent 3013,3000 : top 3013,80 : left 3013,100 : width 3013,200
  min 3013,0 : position 3013,0

to_foreground 0
active 0
set_focus 61

end

changevolume:
  caption 43,str$(position(42))
  VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%)) = position(42)
  return

changetransposition:
  caption 53,str$(position(52))
  DeltaTranspositions%(instrument%) = position(52)
  DeltaTransposition% = position(52)
  return

PianoPause:
  if CanalPlein%(CanalActuel%)=1 then return
  nomNote$ = "[]"
  caption 7, "pause 0 = "+nomNote$
  hauteur% = 2*dline%
  note% = 0
  note1% = 0
  couleur% = 1
 
  if ModeRemplacement%=0
    NombreCumulees%(CanalActuel%) = NombreCumulees%(CanalActuel%) + 1
    NotesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))      = note%
    NomsCumulees$(CanalActuel%,NombreCumulees%(CanalActuel%))        = nomNote$
    OctavesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))    = octave%
    Note1Cumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))      = note1%
    NoteCouleurCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%)) = couleur%
    InstrumentsCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))  = instrument%
    VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))      = position(42)
 
    DessinerPause()
    adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)) = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)-1) + 20
  else
    ClickCanal% = SaveCanal%
    ClickNote% = SaveNote%
    NotesCumulees%(ClickCanal%,ClickNote%)      = note%
    NomsCumulees$(ClickCanal%,ClickNote%)        = nomNote$
    OctavesCumulees%(ClickCanal%,ClickNote%)    = octave%
    Note1Cumulees%(ClickCanal%,ClickNote%)      = note1%
    NoteCouleurCumulees%(ClickCanal%,ClickNote%) = couleur%
    InstrumentsCumules%(ClickCanal%,ClickNote%)  = instrument%
    VolumesCumules%(ClickCanal%,ClickNote%)      = position(42)

    hligne% = (ClickCanal%-1)*100
    x% = 20*ClickNote% -7
    2d_fill_color 255,255,255
    2d_pen_color 255,255,255
    2d_rectangle x%,hligne%,x%+19,hligne%+99
 
    2d_pen_color 0,0,0
    2d_line x%,hligne%+20,x%+19,hligne%+20
    2d_line x%,hligne%+20+dline%,x%+19,hligne%+20+dline%
    2d_line x%,hligne%+20+2*dline%,x%+19,hligne%+20+2*dline%
    2d_line x%,hligne%+20+3*dline%,x%+19,hligne%+20+3*dline%
    2d_line x%,hligne%+20+4*dline%,x%+19,hligne%+20+4*dline%
    RedessinerPause()
    SaveCanal% = 0
    ModeRemplacement% = 0
    font_bold_off 13
  end_if
  return
 
changeinstrument:
  instrument% = item_index(40)
  position 52,DeltaTranspositions%(instrument%)
  DeltaTransposition% = DeltaTranspositions%(instrument%)
  return
 
ChangeFormat:
  ExportFormat% = item_index(61)
  return
   
MovePiano:
  off_mouse_move 2
  MovePiano()
  on_mouse_move 2,MovePiano
  return
 
clickPiano:
  if CanalPlein%(CanalActuel%)=1 then return
 
  x% = mouse_x_left_down(2)
  y% = mouse_y_left_down(2)
  cr% = color_pixel_red(2,x%,y%)
  cv% = color_pixel_green(2,x%,y%)
  cb% = color_pixel_blue(2,x%,y%)

  if cr%=255            : ' c'est une blanche ?
    note1% = 255 - cb%
    octave% = 255 - cv%
    note% = tabBlanches%(note1%) + DeltaTransposition%
   
    if note%<tabBlanches%(1)
      note% = note% + 12
      octave% = octave% - 1
    end_if
    if note%>tabBlanches%(7)
      note% = note% - 12
      octave% = octave% + 1
    end_if
    for i%=1 to 7
      if tabBlanches%(i%)=note%
        note1% = i%
        couleur% = 1
        exit_for
      end_if
    next i%
    for i%=1 to 5
      if tabNoires%(i%)=note%
        note1% = i%
        couleur% = 2
        exit_for
      end_if
    next i%
   
    nomOctave$ = mid$(tabOctave$,octave%,1)
    delta% = (octave%-5)*12
    if instrument%<>instrument1%
      nomNote$ = "i"+right$("00"+str$(instrument%),3)+"+"+nomOctave$+nomBlanches$(note1%)
    else
      nomNote$ = "+"+nomOctave$+nomBlanches$(note1%)
    end_if
   
    if couleur%=1
      note% = tabBlanches%(note1%) + delta%
      nomNote$ = "+"+nomOctave$+nomBlanches$(note1%)
      nomNote$ = "["+nomNote$+str$(position(42))+"-]"
      caption 7, "blanche "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
    else
      note% = tabNoires%(note1%) + delta%
      nomNote$ = "+"+nomOctave$+nomNoires$(note1%)
      nomNote$ = "["+nomNote$+str$(position(42))+"-]"
      caption 7, "noire "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
    end_if
   
    hauteur% = 5*dline% - (note1%-1)*dline%/2
  else
    if cr%=0            : ' est-ce une noire ?
      note1% = cb%
      octave% = cv%
      note% = tabNoires%(note1%)
     
      couleur% = 0
      note% = note% + DeltaTransposition%
      if note%<tabBlanches%(1)
        note% = note% + 12
        octave% = octave% - 1
      end_if
      if note%>tabBlanches%(7)
        note% = note% - 12
        octave% = octave% + 1
      end_if
      for i%=1 to 7
        if tabBlanches%(i%)=note%
          note1% = i%
          couleur% = 1
          exit_for
        end_if
      next i%
      for i%=1 to 5
        if tabNoires%(i%)=note%
          note1% = i%
          couleur% = 2
          exit_for
        end_if
      next i%
     
      nomOctave$ = mid$(tabOctave$,octave%,1)
      delta% = (octave%-5)*12
      if instrument%<>instrument1%
        nomNote$ = "i"+right$("00"+str$(instrument%),3)+"+"+nomOctave$+nomNoires$(note1%)
      else
        nomNote$ = "+"+nomOctave$+nomNoires$(note1%)
      end_if
      if couleur%=1
        note% = tabBlanches%(note1%) + delta%
        nomNote$ = "+"+nomOctave$+nomBlanches$(note1%)
        nomNote$ = "["+nomNote$+str$(position(42))+"-]"
        caption 7, "blanche "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
      else
        note% = tabNoires%(note1%) + delta%
        nomNote$ = "+"+nomOctave$+nomNoires$(note1%)
        nomNote$ = "["+nomNote$+str$(position(42))+"-]"
        caption 7, "noire "+str$(note1%)+"  "+str$(note%)+" = "+nomNote$
      end_if
      hauteur% = 5*dline% - (note1%-1)*dline%/2
      if note1%>2 then hauteur% = hauteur% - dline%/2
    end_if
  end_if
  instrument1% = instrument%
  mark_on 30+octave%
  set_focus 30+octave%
  display
 
  if ModeRemplacement%=0
    NombreCumulees%(CanalActuel%) = NombreCumulees%(CanalActuel%) + 1
    NotesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))      = note%
    NomsCumulees$(CanalActuel%,NombreCumulees%(CanalActuel%))        = nomNote$
    OctavesCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))    = octave%
    Note1Cumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))      = note1%
    NoteCouleurCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%)) = couleur%
    InstrumentsCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))  = instrument%
    VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))      = position(42)
 
    DessinerNote()
    adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)) = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)-1) + 20
  else
    ClickCanal% = SaveCanal%
    ClickNote% = SaveNote%
   
    NotesCumulees%(ClickCanal%,ClickNote%)      = note%
    NomsCumulees$(ClickCanal%,ClickNote%)        = nomNote$
    OctavesCumulees%(ClickCanal%,ClickNote%)    = octave%
    Note1Cumulees%(ClickCanal%,ClickNote%)      = note1%
    NoteCouleurCumulees%(ClickCanal%,ClickNote%) = couleur%
    InstrumentsCumules%(ClickCanal%,ClickNote%)  = instrument%
    VolumesCumules%(ClickCanal%,ClickNote%)      = position(42) 
   
    hligne% = (ClickCanal%-1)*100
    x% = 20*ClickNote% -7
    2d_fill_color 255,255,255
    2d_pen_color 255,255,255
    2d_rectangle x%,hligne%,x%+19,hligne%+99
   
    2d_pen_color 0,0,0 
    2d_line x%,hligne%+20,x%+19,hligne%+20
    2d_line x%,hligne%+20+dline%,x%+19,hligne%+20+dline%
    2d_line x%,hligne%+20+2*dline%,x%+19,hligne%+20+2*dline%
    2d_line x%,hligne%+20+3*dline%,x%+19,hligne%+20+3*dline%
    2d_line x%,hligne%+20+4*dline%,x%+19,hligne%+20+4*dline%
    RedessinerNote()
    SaveCanal% = 0
    ModeRemplacement% = 0
    font_bold_off 13
  end_if
  return
 
exporter:
  temp% = 0
  for i%=1 to NombreCanaux%
    if NombreCumulees%(i%)>0 then temp% = 1
  next i%
  if temp%=0
    message "Il n'y a rien à exporter !"
    return
  end_if
  select ExportFormat%
    case 1
    filter 6,"Fichiers texte (*.TXT)|*.txt"
    case 2
    filter 6,"Fichiers MIDI (*.MID)|*.mid"
  end_select
  f$ = file_name$(6)
  if f$="_" then return
  if file_exists(f$)=1
    if message_confirmation_yes_no("Ce fichier existe déjà. Remplacer ?")<>1 then return
  end_if 
  select ExportFormat%
    case 1: ' format Composeur 
      clear 5
      sip% = PageActuelle%
      item_add 5,"#COMPOSER"
      item_add 5,str$(PagesTotal%)
      for ip%=1 to PagesTotal%
        ChargerPage(ip%)
        CopyDLIST(5,0)
       
if 1=2 : ' ancienne version     
        item_add 5,"Page "+str$(ip%)
        for j%=1 to NombreCanaux%
          item_add 5,"Canal "+str$(j%)
          if NombreCumulees%(j%)>0
            for i%=1 to NombreCumulees%(j%)
              item_add 5,NomsCumulees$(j%,i%)+"="+str$(NotesCumulees%(j%,i%))
            next i%
          end_if
        next j%
end_if
      next ip%
      ChargerPage(sip%)
      file_save 5,f$
    case 2: ' format MIDI_LOAD
      clear 5
      item_add 5,"#MIDI_EXPORT"
      item_add 5,str$(NombreCanaux%)
      sip% = PageActuelle%
      for ip%=1 to PagesTotal%
        ChargerPage(ip%)
          temp% = 0
          for i%=1 to NombreCanaux%
            if NombreCumulees%(i%)>temp% then temp% = NombreCumulees%(i%)
          next i%
          for i%=1 to temp%
            for j%=1 to NombreCanaux%
              if i%<=NombreCumulees%(j%)
                item_add 5,str$(InstrumentsCumules%(j%,i%))+","+str$(NotesCumulees%(j%,i%))+","+str$(VolumesCumules%(j%,i%))+",1,1"
              else
                item_add 5,"0,0,0,0,0"
              end_if
            next j%
          next i%
      next ip%
      ChargerPage(sip%)
      file_save 5,f$
  end_select
  return
 
importer:
  select ExportFormat%
    case 1
    filter 17,"Fichiers texte (*.TXT)|*.txt"
    case 2
      message "Il faut choisir le format <Composeur> pour importer !"
      return
  end_select
  f$ = file_name$(17)
  if f$="_" then return
  if lower$(right$(f$,4))<>".txt" then f$ = f$ + ".txt"
  if file_exists(f$)=0
    message "Fichier non trouvé !"
    return
  end_if
  clear 5
  file_load 5,f$
  s$ = item_read$(5,1)
  if s$<>"#COMPOSER"
    message "Ce fichier n'est pas au format <Composeur> !"
    return
  end_if
'  on_error_goto ImportError
  s$ = item_read$(5,2)
  PagesTotal% = val(s$)
  caption 70,"Pages: "+str$(0)+"/"+str$(PagesTotal%)
  inactive 0
  show 3000
  max 3011,PagesTotal%
  res% = 2
  for i%=1 to PagesTotal%
    position 3011,i%
    position 3012,0
    position 3013,0
    display
    res% = res% + 1
    s$ = item_read$(5,res%)
    if left$(s$,5)<>"Page " then goto ImportError
    PageActuelle% = val(mid$(s$,6,len(s$)))
    caption 70,"Pages: "+str$(PageActuelle%)+"/"+str$(PagesTotal%)
    CopyDLIST(5,1)
    ConstruirePage()
    SauverPage()
  next i% 
  off_error_goto
  ChargerPage(1)
  hide 3000
  active 0
  set_focus 61
  return
ImportError:
  off_error_goto
  hide 3000
  to_foreground 0
  message "Ce fichier n'est pas au format <Composeur> ! "+str$(res%)+"  "+s$
  gosub effacer
  active 0
  return
   
effacer:
  color 1,255,255,255
  CanalActuel% = 1
  mark_on 100+CanalActuel%
  set_focus 100+CanalActuel%
  for i%=1 to NombreCanaux%
    NombreCumulees%(i%)        = 0
    CanalPlein%(i%)            = 0
    Adresse%(i%,0)            = 0
    InstrumentsCumules%(i%,0)  = 1
    VolumesCumules%(i%,0)      = VolumeDefaut%
    NotesCumulees%(i%,0)      = 0
    NomsCumulees$(i%,0)        = ""
    OctavesCumulees%(i%,0)    = 0
    Note1Cumulees%(i%,0)      = 0
    NoteCouleurCumulees%(i%,0) = 0
  next i%
  position 42,VolumeDefaut%
  ModeRemplacement% = 0
  font_bold_off 13
  trame()               
  return
 
jouer:
  temp% = 0
  for i%=1 to NombreCanaux%
    if NombreCumulees%(i%)>0 then temp% = 1
  next i%
  if temp%=0
    message "Il n'y a rien à exporter !"
    return
  end_if
  dll_on KGF$
 
  res% = DLL_call0("MIDI_Initialize")
  res% = DLL_call1("MIDI_Reset",NombreCanaux%)
  sip% = PageActuelle%
  temp% = 0
  for ip%=1 to PagesTotal%
    ChargerPage(ip%)
    maxNotes% = 0
    for j%=1 to NombreCanaux%
      if NombreCumulees%(j%)>maxNotes% then maxNotes% = NombreCumulees%(j%)
    next j%
    for j%=1 to NombreCanaux%
      notes$ = ""
      for i%=1 to maxNotes%
        s$ = NomsCumulees$(j%,i%)
        if s$="" then s$ = "[]" : '  "[+0do0-]"
        notes$ = notes$ + s$ + " "
      next i%
' message str$(ip%)+"/"+str$(j%)+"="+notes$+"  "+NomsCumulees$(j%,1)     
      res% = DLL_call3("MIDI_Compile",j%,temp%,adr(notes$))
      temp% = 1
    next j%
  next ip%
  ChargerPage(sip%)
  res% = DLL_call1("MIDI_Play",10)
  res% = DLL_call0("MIDI_Stop")
 
  dll_off
  return
 
changecanal:
  CanalActuel% = number_click - 100
  set_focus 100+CanalActuel%
  text 40,item_read$(40,InstrumentsCumules%(CanalActuel%,NombreCumulees%(CanalActuel%)))
  position 42,VolumesCumules%(CanalActuel%,NombreCumulees%(CanalActuel%))
  return
 
ClickPartition:
  x% = mouse_x_left_down(1)
  y% = mouse_y_left_down(1)
  ClickCanal% = (y%-20+99)/100 
  ClickNote% = (x%-20+19)/20
  if ClickNote%>NombreCumulees%(ClickCanal%) then return
  MarquerClick(ClickCanal%,ClickNote%)
 
  return 
 
Remplacer:
  if SaveCanal%>0
    ModeRemplacement% = 1
    font_bold 13
  else
    message "Aucune note n'est sélectionnée !"
  end_if
  return
 
Supprimer:
  if SaveCanal%>0
    SupprimerNote()
    SaveCanal% = 0
    CanalPlein%(CanalActuel%) = 0
  else
    message "Aucune note n'est sélectionnée !"
  end_if
  return
 
Inserer:
  if SaveCanal%>0
    if NombreCumulees%(CanalActuel%)>=NombreNotesMaxi%
      message "La portée est pleine !"
      return
    end_if
    InsererNote()
    SaveCanal% = 0
    if NombreCumulees%(CanalActuel%)>=NombreNotesMaxi% then CanalPlein%(CanalActuel%) = 1
  else
    message "Aucune note n'est sélectionnée !"
  end_if
  return 
 
PremierePage:
  ChargerPage(1)
  return

PagePrecedente:
  ChargerPage(PageActuelle%-1)
  return
 
PageNouvelle:
  CreerPage()
  return

PageSuivante:
  ChargerPage(PageActuelle%+1)
  return

DernierePage:
  ChargerPage(PagesTotal%)
  return
 
 
 
 
 
 
sub DessinerPause()
  dim_local a%, hligne%
  a% = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)-1) + 15
  hligne% = 20 + (CanalActuel%-1)*100
  2d_rectangle a%,hligne%+hauteur%,a%+dline%,hligne%+hauteur%+dline%/2
  if adresse%(CanalActuel%,NombreCumulees%(CanalActuel%))>(width_client(1)-25) then CanalPlein%(CanalActuel%) = 1

  print_locate a%,hligne%-15
  print str$(NombreCumulees%(CanalActuel%))
end_sub
 
sub DessinerNote()
  dim_local a%, hligne%
  a% = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)-1) + 20
  hligne% = 20 + (CanalActuel%-1)*100
  if NoteCouleurCumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))=2
    print_locate a%-9,hligne%+hauteur%-7
    print "#"
    a% = a% + 5
    adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)) = adresse%(CanalActuel%,NombreCumulees%(CanalActuel%)) + 3
  end_if
  2d_circle a%,hligne%+hauteur%,dline%/2
  if Note1Cumulees%(CanalActuel%,NombreCumulees%(CanalActuel%))=1
  2d_line a%-7,hligne%+hauteur%,a%+7,hligne%+hauteur%
  end_if
  print_locate a%-5,hligne%+57
  print mid$(tabOctave$,octave%,1)
  print_locate a%-5,hligne%-15
  print str$(NombreCumulees%(CanalActuel%))
 
  if adresse%(CanalActuel%,NombreCumulees%(CanalActuel%))>(width_client(1)-25) then CanalPlein%(CanalActuel%) = 1

end_sub

sub trame()
  ' v% donne le numéro de la trame dans la page (1=première ligne)
  dim_local hligne%, v%
  v% = 0
  hligne% = 0
  for v%=1 to NombreCanaux%
    hligne% = 20 + (v%-1)*100
    2d_line 0,hligne%,w%,hligne%
    2d_line 0,hligne%+dline%,w%,hligne%+dline%
    2d_line 0,hligne%+2*dline%,w%,hligne%+2*dline%
    2d_line 0,hligne%+3*dline%,w%,hligne%+3*dline%
    2d_line 0,hligne%+4*dline%,w%,hligne%+4*dline%

    ' séparateur de mesure
    2d_line 10,hligne%,10,hligne%+4*dline%
  next v%
end_sub

sub DessinerOctave(id%,x%)
  2d_fill_color 255,255-id%,254
  2d_rectangle x%,0,x%+20,80
  2d_fill_color 255,255-id%,253
  2d_rectangle x%+20,0,x%+40,80
  2d_fill_color 255,255-id%,252
  2d_rectangle x%+40,0,x%+60,80
  2d_fill_color 255,255-id%,251
  2d_rectangle x%+60,0,x%+80,80
  2d_fill_color 255,255-id%,250
  2d_rectangle x%+80,0,x%+100,80
  2d_fill_color 255,255-id%,249
  2d_rectangle x%+100,0,x%+120,80
  2d_fill_color 255,255-id%,248
  2d_rectangle x%+120,0,x%+140,80
'  2d_pen_color 0,id%,1
  2d_fill_color 0,id%,1
  2d_rectangle x%+12,0,x%+28,40
  2d_fill_color 0,id%,2
  2d_rectangle x%+32,0,x%+48,40
  2d_fill_color 0,id%,3
  2d_rectangle x%+72,0,x%+88,40
  2d_fill_color 0,id%,4
  2d_rectangle x%+92,0,x%+108,40
  2d_fill_color 0,id%,5
  2d_rectangle x%+112,0,x%+128,40
end_sub

sub MovePiano()
  dim_local i%, couleur2%
   
  x% = mouse_x_position(2)
  y% = mouse_y_position(2)
  cr% = color_pixel_red(2,x%,y%)
  cv% = color_pixel_green(2,x%,y%)
  cb% = color_pixel_blue(2,x%,y%)
 
  if cb%=0 then exit_sub  : ' ne pas réagir sur une bordure de touche !
 
  if cr%=255            : ' c'est une blanche ?
    note2% = 255 - cb%
    octave2% = 255 - cv%
    note2a% = tabBlanches%(note2%)

    couleur2% = 0
    note2a% = note2a% + DeltaTransposition%
    if note2a%<tabBlanches%(1)
      note2a% = note2a% + 12
      octave2% = octave2% - 1
    end_if
    if note2a%>tabBlanches%(7)
      note2a% = note2a% - 12
      octave2% = octave2% + 1
    end_if
    for i%=1 to 7
      if tabBlanches%(i%)=note2a%
        note2% = i%
        couleur2% = 1
        exit_for
      end_if
    next i%
    for i%=1 to 5
      if tabNoires%(i%)=note2a%
        note2% = i%
        couleur2% = 2
        exit_for
      end_if
    next i%
   
    nomOctave2$ = mid$(tabOctave$,octave2%,1)
    delta2% = (octave2%-5)*12
    if couleur2%=1
      note2a% = tabBlanches%(note2%) + delta2%
      nomNote2$ = "+"+nomOctave2$+nomBlanches$(note2%)
      nomNote2$ = "["+nomNote2$+str$(position(42))+"-]"
      caption 7, "blanche "+str$(note2%)+"  "+str$(note2a%)+" = "+nomNote2$
    else
      note2a% = tabNoires%(note2%) + delta2%
      nomNote2$ = "+"+nomOctave2$+nomNoires$(note2%)
      nomNote2$ = "["+nomNote2$+str$(position(42))+"-]"
      caption 7, "noire "+str$(note2%)+"  "+str$(note2a%)+" = "+nomNote2$
    end_if
  else
    if cr%=0            : ' est-ce une noire ?
      note2% = cb%
      octave2% = cv%
      note2a% = tabNoires%(note2%)
     
      couleur2% = 0
      note2a% = note2a% + DeltaTransposition%
      if note2a%<tabBlanches%(1)
        note2a% = note2a% + 12
        octave2% = octave2% - 1
      end_if
      if note2a%>tabBlanches%(7)
        note2a% = note2a% - 12
        octave2% = octave2% + 1
      end_if
      for i%=1 to 7
        if tabBlanches%(i%)=note2a%
          note2% = i%
          couleur2% = 1
          exit_for
        end_if
      next i%
      for i%=1 to 5
        if tabNoires%(i%)=note2a%
          note2% = i%
          couleur2% = 2
          exit_for
        end_if
      next i%
 
      nomOctave2$ = mid$(tabOctave$,octave2%,1)
      delta2% = (octave2%-5)*12
      if couleur2%=1
        note2a% = tabBlanches%(note2%) + delta2%
        nomNote2$ = "+"+nomOctave2$+nomBlanches$(note2%)
        nomNote2$ = "["+nomNote2$+str$(position(42))+"-]"
        caption 7, "blanche "+str$(note2%)+"  "+str$(note2a%)+" = "+nomNote2$
      else
        note2a% = tabNoires%(note2%) + delta2%
        nomNote2$ = "+"+nomOctave2$+nomNoires$(note2%)
        nomNote2$ = "["+nomNote2$+str$(position(42))+"-]"
        caption 7, "noire "+str$(note2%)+"  "+str$(note2a%)+" = "+nomNote2$
      end_if
    end_if
  end_if

end_sub

sub SupprimerNote()
  dim_local hligne%, x%, nrest%, i%
  hligne% = (ClickCanal%-1)*100
  x% = 20*ClickNote% -7
  if ClickNote%<NombreCumulees%(ClickCanal%)
    nrest% = NombreCumulees%(ClickCanal%) - ClickNote%
    2d_image_copy 201,x%+20,hligne%,x%+nrest%*20+19,hligne%+99
    2d_image_paste 201,x%,hligne%
    x% = 20*NombreCumulees%(ClickCanal%)-7
    for i%=ClickNote% to NombreCumulees%(ClickCanal%)-1
      NotesCumulees%(ClickCanal%,i%)      = NotesCumulees%(ClickCanal%,i%+1)
      NomsCumulees$(ClickCanal%,i%)        = NomsCumulees$(ClickCanal%,i%+1)
      OctavesCumulees%(ClickCanal%,i%)    = OctavesCumulees%(ClickCanal%,i%+1)
      Note1Cumulees%(ClickCanal%,i%)      = Note1Cumulees%(ClickCanal%,i%+1)
      NoteCouleurCumulees%(ClickCanal%,i%) = NoteCouleurCumulees%(ClickCanal%,i%+1)
      InstrumentsCumules%(ClickCanal%,i%)  = InstrumentsCumules%(ClickCanal%,i%+1)
      adresse%(ClickCanal%,i%)            = adresse%(ClickCanal%,i%+1) - 20
      VolumesCumules%(ClickCanal%,i%)      = VolumesCumules%(ClickCanal%,i%+1)
    next i%
  end_if
  2d_pen_color 255,255,255
  2d_rectangle x%,hligne%,x%+19,hligne%+99
  2d_pen_color 0,0,0
  2d_line x%,hligne%+20,x%+19,hligne%+20
  2d_line x%,hligne%+20+dline%,x%+19,hligne%+20+dline%
  2d_line x%,hligne%+20+2*dline%,x%+19,hligne%+20+2*dline%
  2d_line x%,hligne%+20+3*dline%,x%+19,hligne%+20+3*dline%
  2d_line x%,hligne%+20+4*dline%,x%+19,hligne%+20+4*dline%
  NombreCumulees%(ClickCanal%) = NombreCumulees%(ClickCanal%) - 1
 
  x% = 20*ClickNote% -7
  2d_pen_color 255,255,255
  2d_rectangle x%,hligne%-5,20*NotesCumulees%(ClickCanal%,i%),hligne%
  2d_pen_color 0,0,0
  nrest% = NombreCumulees%(ClickCanal%) - ClickNote%
  for i%=1 to nrest%+1
    print_locate x%+(i%-1)*20,hligne%+5
    print str$(ClickNote%+i%-1)
  next i% 
end_sub   

sub InsererNote()
  dim_local hligne%, x%, nrest%, i%
  hligne% = (ClickCanal%-1)*100
  x% = 20*ClickNote% -7
  hligne% = (SaveCanal%-1)*100
  x% = 20*SaveNote% -7
  2d_image_paste 201,x%,hligne%
  nrest% = NombreCumulees%(ClickCanal%) + 1 - ClickNote%
  2d_image_copy 201,x%,hligne%,x%+nrest%*20+19,hligne%+99
  2d_image_paste 201,x%+20,hligne%
  for i%=NombreCumulees%(ClickCanal%) to ClickNote% step -1
    NotesCumulees%(ClickCanal%,i%+1)      = NotesCumulees%(ClickCanal%,i%)
    NomsCumulees$(ClickCanal%,i%+1)        = NomsCumulees$(ClickCanal%,i%)
    OctavesCumulees%(ClickCanal%,i%+1)    = OctavesCumulees%(ClickCanal%,i%)
    Note1Cumulees%(ClickCanal%,i%+1)      = Note1Cumulees%(ClickCanal%,i%)
    NoteCouleurCumulees%(ClickCanal%,i%+1) = NoteCouleurCumulees%(ClickCanal%,i%)
    InstrumentsCumules%(ClickCanal%,i%+1)  = InstrumentsCumules%(ClickCanal%,i%)
    adresse%(ClickCanal%,i%+1)            = adresse%(ClickCanal%,i%) + 20
    VolumesCumules%(ClickCanal%,i%+1)      = VolumesCumules%(ClickCanal%,i%)
  next i%
  NombreCumulees%(ClickCanal%) = NombreCumulees%(ClickCanal%) + 1

  x% = 20*ClickNote% -7
  2d_pen_color 255,255,255
  2d_rectangle x%,hligne%-5,20*NotesCumulees%(ClickCanal%,i%),hligne%
  2d_pen_color 0,0,0
  nrest% = NombreCumulees%(ClickCanal%) - ClickNote%
  for i%=1 to nrest%+1
    print_locate x%+(i%-1)*20,hligne%+5
    print str$(ClickNote%+i%-1)
  next i%
end_sub         

                               
sub MarquerClick()
  dim_local hligne%, x%
  if SaveCanal%>0
    hligne% = (SaveCanal%-1)*100
    x% = 20*SaveNote% -7
    2d_image_paste 201,x%,hligne%
  end_if   
  SaveCanal% = ClickCanal%
  SaveNote% = ClickNote%
  hligne% = (ClickCanal%-1)*100
  x% = 20*ClickNote% -7
  2d_image_copy 201,x%,hligne%,x%+19,hligne%+99
  2d_fill_color 200,200,255
  2d_pen_color 200,200,255
  2d_rectangle x%,hligne%,x%+19,hligne%+99
 
  2d_pen_color 0,0,0
  2d_line x%,hligne%+20,x%+19,hligne%+20
  2d_line x%,hligne%+20+dline%,x%+19,hligne%+20+dline%
  2d_line x%,hligne%+20+2*dline%,x%+19,hligne%+20+2*dline%
  2d_line x%,hligne%+20+3*dline%,x%+19,hligne%+20+3*dline%
  2d_line x%,hligne%+20+4*dline%,x%+19,hligne%+20+4*dline%
 
  if NotesCumulees%(ClickCanal%,ClickNote%)=0
    RedessinerPause()
  else
    RedessinerNote()
  end_if
 
  2d_fill_color 255,255,255
   
end_sub

sub RedessinerPause()
  dim_local a%, hligne%
  a% = adresse%(ClickCanal%,ClickNote%)-5
  hligne% = (ClickCanal%-1)*100
  hauteur% = 2*dline%
  2d_rectangle a%,hligne%+20+hauteur%,a%+dline%,hligne%+20+hauteur%+dline%/2

  print_locate a%,hligne%+5
  print str$(ClickNote%)
end_sub

sub RedessinerNote()   
  dim_local a%, hligne%
 
  a% = adresse%(ClickCanal%,ClickNote%)
  hligne% = 20 + (ClickCanal%-1)*100
  hauteur% = 5*dline% - (Note1Cumulees%(ClickCanal%,ClickNote%)-1)*dline%/2
 
  if NoteCouleurCumulees%(ClickCanal%,ClickNote%)=2
    hauteur% = 5*dline% - (Note1Cumulees%(ClickCanal%,ClickNote%)-1)*dline%/2
    if Note1Cumulees%(ClickCanal%,ClickNote%)>2 then hauteur% = hauteur% - dline%/2
'    print_locate a%-9,hligne%+hauteur%-7
    print_locate a%-6,hligne%+hauteur%-7
    print "#"
    a% = a% + 5
  end_if
  2d_circle a%,hligne%+hauteur%,dline%/2
  if Note1Cumulees%(ClickCanal%,ClickNote%)=1
  2d_line a%-7,hligne%+hauteur%,a%+7,hligne%+hauteur%
  end_if
  print_locate a%-5,hligne%+57
  print mid$(tabOctave$,octave%,1) 

  print_locate a%-5,hligne%-15
  print str$(ClickNote%)

end_sub
 
sub ChargerPage(page%)
  dim_local image%, dlist%, c%, i%, s$, n%
  if page%=PageActuelle% then exit_sub
  if page%<1 then exit_sub
  if page%>PagesTotal% then exit_sub
 
  ' sauvegarder la page actuelle
  SauverPage()
 
  ' récupérer l'image de la page
  PageActuelle% = page%
  dlist% = 1000 + PageActuelle%
  image% = 2000 + PageActuelle%
  2d_image_paste image%,0,0
 
  ' récupérer les variables de la page
  n% = 0
  ViderVariables()
' for i%=1 to NombreCanaux%
'  message "a - ChargerPage: Canal "+str$(i%)+": "+str$(NombreCumulees%(i%))+"  "+NomsCumulees$(i%,1)
' next i%
  for c%=1 to NombreCanaux%
    n% = n% + 1
    s$ = item_read$(dlist%,n%)
    n% = n% + 1
    NombreCumulees%(c%) = val(s$)
    s$ = item_read$(dlist%,n%)
    CanalPlein%(c%) = val(s$)
    for i%=0 to NombreCumulees%(c%)
      n% = n% + 1
      s$ = item_read$(dlist%,n%)
      NotesCumulees%(c%,i%) = val(s$)
      n% = n% + 1
      s$ = item_read$(dlist%,n%)
      NomsCumulees$(c%,i%) = s$
      n% = n% + 1
      s$ = item_read$(dlist%,n%)
      OctavesCumulees%(c%,i%) = val(s$)
      n% = n% + 1
      s$ = item_read$(dlist%,n%)
      Note1Cumulees%(c%,i%) = val(s$)
      n% = n% + 1
      s$ = item_read$(dlist%,n%)
      NoteCouleurCumulees%(c%,i%) = val(s$)
      n% = n% + 1
      s$ = item_read$(dlist%,n%)
      InstrumentsCumules%(c%,i%) = val(s$)
      n% = n% + 1
      s$ = item_read$(dlist%,n%)
      adresse%(c%,i%) = val(s$)
      n% = n% + 1
      s$ = item_read$(dlist%,n%)
      VolumesCumules%(c%,i%) = val(s$) 
    next i%
  next c%
 
  if PageActuelle%=PagesTotal%
    active 73
  else
    inactive 73
  end_if
  caption 70,"Pages: "+str$(PageActuelle%)+"/"+str$(PagesTotal%)
' for i%=1 to NombreCanaux%
'  message "b - ChargerPage: Canal "+str$(i%)+": "+str$(NombreCumulees%(i%))+"  "+NomsCumulees$(i%,1)
' next i%
end_sub

sub CreerPage()
  dim_local c%, i%
' for i%=1 to NombreCanaux%
'  message "a: Canal "+str$(i%)+": "+str$(NombreCumulees%(i%))
' next i%
  SauverPage()
  PageActuelle% = PageActuelle% + 1
  PagesTotal% = PagesTotal% + 1
  dlist 1000 + PageActuelle%
  image 2000 + PageActuelle%
  color 1,255,255,255
  ViderVariables()
  Trame()
  SauverPage()
  caption 70,"Pages: "+str$(PageActuelle%)+"/"+str$(PagesTotal%)
' for i%=1 to NombreCanaux%
'  message "b: Canal "+str$(i%)+": "+str$(NombreCumulees%(i%))
' next i%
end_sub
                                 
sub ViderVariables()
  dim_local c%, i%
  for c%=1 to NombreCanaux%
    for i%=0 to NombreCumulees%(c%)
      NotesCumulees%(c%,i%)      = 0
      NomsCumulees$(c%,i%)        = ""
      OctavesCumulees%(c%,i%)    = 0
      Note1Cumulees%(c%,i%)      = 0
      NoteCouleurCumulees%(c%,i%) = 0
      InstrumentsCumules%(c%,i%)  = 1
      adresse%(c%,i%)            = 0
      VolumesCumules%(c%,i%)      = VolumeDefaut% 
    next i%
    NombreCumulees%(c%)          = 0
    CanalPlein%(c%)              = 0
  next c%
end_sub

sub SauverPage()
  dim_local dlist%, image%, c%, i%, nmax%
  dlist% = 1000 + PageActuelle%
  image% = 2000 + PageActuelle%
 
  ' sauvegarder l'image sans un éventuel marquage de note
  if SaveCanal%>0
    hligne% = (SaveCanal%-1)*100
    x% = 20*SaveNote% -7
    2d_image_paste 201,x%,hligne%
    SaveCanal% = 0   
  end_if
  2d_image_copy image%,0,0,width(1),height(1)
 
' for i%=1 to NombreCanaux%
'  message "SauverPage: Canal "+str$(i%)+": "+str$(NombreCumulees%(i%))
' next i%
  ' sauvegarder les variables
  clear dlist%
  for c%=1 to NombreCanaux%
    item_add dlist%,str$(NombreCumulees%(c%))
    item_add dlist%,str$(CanalPlein%(c%))
    for i%=0 to NombreCumulees%(c%)
      item_add dlist%,str$(NotesCumulees%(c%,i%))
      item_add dlist%,NomsCumulees$(c%,i%)
      item_add dlist%,str$(OctavesCumulees%(c%,i%))
      item_add dlist%,str$(Note1Cumulees%(c%,i%))
      item_add dlist%,str$(NoteCouleurCumulees%(c%,i%))
      item_add dlist%,str$(InstrumentsCumules%(c%,i%))
      item_add dlist%,str$(adresse%(c%,i%))
      item_add dlist%,str$(VolumesCumules%(c%,i%)) 
    next i%
' message "SauverPage: "+str$(c%)+"/"+NomsCumulees$(c%,1)   
  next c%
'  file_save dlist%,"dlist_"+str$(dlist%)+".txt"    : ' <================== supprimer !
end_sub

sub CopyDLIST(out%,opt%)
  dim_local dlist%, i%, n%
  dlist% = 1000 + PageActuelle%
  if opt%=0
    item_add out%,"Page "+str$(PageActuelle%)
    n% = count(dlist%)
    item_add out%,str$(n%)
    for i%=1 to n%
      item_add out%,item_read$(dlist%,i%)
    next i%
  else
    if object_exists(dlist%)=0
      dlist dlist%
      image 2000 + PageActuelle%
    end_if
    color 1,255,255,255
    Trame()
    clear dlist%
    res% = res% + 1
    s$ = item_read$(out%,res%)
    n% = val(s$)
    max 3012,n%
    for i%=1 to n%
      position 3012,i%
      display
      res% = res% + 1
      s$ = item_read$(out%,res%)
      item_add dlist%,s$
    next i%
  end_if
end_sub

sub ConstruirePage()
  dim_local dlist%, i%, n%, c%, savNombre%
  dlist% = 1000 + PageActuelle%

  ' récupérer les variables de la page
  n% = 0
  ViderVariables()
' for i%=1 to NombreCanaux%
'  message "a - ChargerPage: Canal "+str$(i%)+": "+str$(NombreCumulees%(i%))+"  "+NomsCumulees$(i%,1)
' next i%
  for c%=1 to NombreCanaux%
    n% = n% + 1
    s$ = item_read$(dlist%,n%)
    n% = n% + 1
    NombreCumulees%(c%) = val(s$)
    s$ = item_read$(dlist%,n%)
    CanalPlein%(c%) = val(s$)
    for i%=0 to NombreCumulees%(c%)
      n% = n% + 1
      s$ = item_read$(dlist%,n%)
      NotesCumulees%(c%,i%) = val(s$)
      n% = n% + 1
      s$ = item_read$(dlist%,n%)
      NomsCumulees$(c%,i%) = s$
      n% = n% + 1
      s$ = item_read$(dlist%,n%)
      OctavesCumulees%(c%,i%) = val(s$)
      n% = n% + 1
      s$ = item_read$(dlist%,n%)
      Note1Cumulees%(c%,i%) = val(s$)
      n% = n% + 1
      s$ = item_read$(dlist%,n%)
      NoteCouleurCumulees%(c%,i%) = val(s$)
      n% = n% + 1
      s$ = item_read$(dlist%,n%)
      InstrumentsCumules%(c%,i%) = val(s$)
      n% = n% + 1
      s$ = item_read$(dlist%,n%)
      adresse%(c%,i%) = val(s$)
      n% = n% + 1
      s$ = item_read$(dlist%,n%)
      VolumesCumules%(c%,i%) = val(s$) 
    next i%
  next c%
 
  if PageActuelle%=PagesTotal%
    active 73
  else
    inactive 73
  end_if
  caption 70,"Pages: "+str$(PageActuelle%)+"/"+str$(PagesTotal%)
 
  for CanalActuel%=1 to NombreCanaux%
    max 3013,NombreCumulees%(CanalActuel%)
    position 3013,0
    display
    if NombreCumulees%(CanalActuel%)>0
      savNombre% = NombreCumulees%(CanalActuel%)
      for i%=1 to savNombre%
        NombreCumulees%(CanalActuel%) = i%
        position 3013,i%
        display
        if NotesCumulees%(CanalActuel%,i%)<>0
          hauteur% = 5*dline% - (Note1Cumulees%(CanalActuel%,i%)-1)*dline%/2
          if NoteCouleurCumulees%(CanalActuel%,i%)=2
            if Note1Cumulees%(CanalActuel%,i%)>2 then hauteur% = hauteur% - dline%/2
          end_if
          DessinerNote()
        else
          hauteur% = 2*dline%
          DessinerPause()
        end_if   
      next i%
      NombreCumulees%(CanalActuel%) = savNombre%
    end_if
  next CanalActuel%
end_sub
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

Nombre de messages : 5929
Age : 46
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: Maquette d'une rédaction de partition de piano   Ven 9 Fév 2018 - 13:43

Hum, je ne sais pas si ça vous intéresse mais je vous mets le lien sur une série d'article pour transformer un vieux clavier en clavier midi via une interface Arduino
en sachant qu'un petit clavier midi (32 touches) coûte une cinquantaine d'euros, mais bon si vous avez un clavier, si vous avez une Arduino, si vous voulez comprendre comment ça marche etc ... ça peut être intéressant mais merci de ne pas répondre sur ce sujet puisqu'il est déjà un peu hors sujet ... (et je m'en excuse par avance)

Article 1: http://electroniqueamateur.blogspot.fr/2011/07/clavier-dorgue-electronique-et-sa.html
Article 2: http://electroniqueamateur.blogspot.fr/2012/05/decodage-dun-clavier-dorgue-par-un.html
Article 3: http://electroniqueamateur.blogspot.fr/2012/05/clavier-midi-base-darduino.html

Comment créer une interface midi à partir d'une Arduino: http://electroniqueamateur.blogspot.fr/2012/08/fabrication-dun-module-midi-in-et-out.html


Je sais que notre ami bignono sait programmer un arpégiateur sur un PC mais voilà la version 'hard' sur Arduino:
http://electroniqueamateur.blogspot.fr/2014/01/fabrication-dun-arpegiateur-midi-base.html

et tant qu'à faire hors sujet, autant mettre tous les outils de base voici le lien vers le séquenceur:
http://electroniqueamateur.blogspot.fr/2014/01/sequenceur-midi-base-darduino.html

Encore pardon pour ce hors sujet, je m'autoflagèle pour ne pas créer un discussion à part sur ce forum Panoramic mais bon c'est par rapport à nos amis musiciens, j'espère que cela pourra les intéresser.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: Maquette d'une rédaction de partition de piano   

Revenir en haut Aller en bas
 
Maquette d'une rédaction de partition de piano
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» plus de lettre et plus d acces a une partition de disque
» Disque dur usb reconnu mais pas sa partition
» Changer le fond de sa maquette sur v1.
» Super 8: matte painting ou maquette+trompe l'oeil
» Répartition anuelle de la 4AP

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: