;-> AmySequencer2 by Stefano Maria Regattin
;d> 19 gennaio 2002 da AmySequencer
;m> 20,21,22,23,24,26,30,31 gennaio 2002
;m> 1,2,3,4,5,6,7,9,10,11,13,15,16,17,18,19,20,22,23,24,27,28 febbraio 2002
;m> 1,2,3,4,5,6,7,8,10,11,13,14,15,16,18,19,20,21,22,23,24,25,26,27,28,31 marzo 2002
;m> 1,2,4,5,6,8 Aprile 2002
;---------------------------

;------------------------------------------
;dati per i colori originali dello schermo
;original screen colours data
;-----------------------------
Data.b 0,0,0
Data.b 4,4,4
Data.b 8,8,8
Data.b 12,12,12
Data.b 12,0,0
Data.b 12,6,0
Data.b 12,12,0
Data.b 6,12,0
Data.b 0,12,0
Data.b 0,12,6
Data.b 0,12,12
Data.b 0,6,12
Data.b 0,0,12
Data.b 6,0,12
Data.b 12,0,12
Data.b 12,0,6

;------------------------------------------------------------------------
;il seguemte comando indica dove si trovano sul vostro computer i codici
; sorgenti di Blitz2 da includere in questo programma
;the following command states the place on your computer where are the Blitz2
; source codes to be included into this program
;-----------------------------------------------
INCDIR "Blitz2:Sorgenti/"

;-------------------------------------------------------------------------
;questo comando inserisce una sola volta in questo punto del programma il
; codice sorgente specificato
;-----------------------------
XINCLUDE "MIDIConstants.bb2"

;------------------------------------------------------------------------------
;le seguenti costanti servono per ricavare il periodo di un canale audio AMIGA
; dalla frequenza di campionamento; ce ne e' una per gli AMIGA PAL e una per
; quelli NTSC
;the following constants are used to obtain an AMIGA audio channel period from the
; sampling frequency; there is one for PAL AMIGAs and one for NTSC AMIGAs
;-------------------------------------------------------------------------

;PAL timing
#TemporizzazionePAL=3546895

;NTSC timing
#TemporizzazioneNTSC=3579545

;-------------------------------------------------------------------------
;questa costante indica il numero di riferimento della fonte di caratteri
; Topaz8
;this constant states the characters font Topaz8 referring number
;-----------------------------------------------------------------
#FonteDiCaratteriTopaz8=0

;-------------------------------------------------------------------------
;questa variabile imposta il periodo minimo per i canali audio; il limite
; per i vecchi AMIGA e' 123, ma io ho scelto un periodo minimo di 125, che
; corrisponde ad un La nella nona ottava
;this variable sets the audio channels minimum period for the audio channels;
; on the oldest AMIGA the lowerst usable period is 123, but I have choosen a
; minimum period of 125, that is the A note in the ninth octave
;---------------------------------------------------------------
#PeriodoMinimo=125

;---------------------------------------------------------------------------
;questa costante indica il numero di riferimento della tavolozza dei colori
; disponibili
;this constant states the colour palette referring number
;---------------------------------------------------------
#TavolozzaDeiColori=0

;--------------------------------------------------
;le seguenti costanti indicano il tipo di finestra
;the following constants state the window's kind
;------------------------------------------------

;window sizing gadget
#GadgetRidimensionaFinestra=1

;draggable window
#FinestraMovibile=2

;window depth gadget
#GadgetNascondiFinestra=4

;close gadget
#GadgetChiudiFinestra=8

;sizing window right border (you must set gimme-zero-zero to use it)
#BordoDestraFinestraRidimensionabile=16

;sizing window bottom border (you must set gimme-zero-zero to use it)
#BordoBassoFinestraRidimensionabile=32

;backdrop window
#FinestraDiSfondo=256

;gimme-zero-zero window
#FinestraConMemoriaSfondo=1024

;borderless window
#FinestraSenzaBordi=2048

;window active
#FinestraAttivata=4096

;------------------------------------------------
;le seguenti costanti indicano il tipo di gadget
;the following constants state the gadgets' kind
;------------------------------------------------

;invert
#InvertiGadget=1

;related to window's right side
#PosizioneRelativaAllaDestraDellaFinestra=2

;related to window'w bottom side
#PosizioneRelativaAlBassoDellaFinestra=4

;size as window's inner width
#ComeLarghezzaInternaFinestra=8

;size as window's inner height
#ComeAltezzaInternaFinestra=16

;box select
#ScatolaDaSelezionare=32

;horiziontal movement
#MovimentoOrizzontale=64

;vertical movement
#MovimentoVerticale=128

;no border
#NessunBordo=256

;exclude each other
#SiEscludonoLUnLAltro=512

;attach to window's right side
#AttaccaADestraDellaFinestra=1024

;attach to window's left side
#AttaccaASinistraDellaFinestra=2048

;attach to window's top
#AttaccaAllaFinestraInAlto=4096

;attach to window's bottom
#AttaccaAllaFinestraInBasso=8192

;gimme-zero-zero border gadget
#GadgetConMemoriaBordo=16384

;--------------------------------------------------------
;le seguenti costanti indicano gli eventi delle finestre
;tht following constants state window events
;--------------------------------------------
;you have pressed a mouse button
#HaiPremutoUnTastoDelTopo=8

;you have moved the mouse
#HaiMossoIlTopo=16

;you have pressed a gadget
#HaiPremutoUnGadget=32

;you have released a gadget
#HaiRilasciatoUnGadget=64

;you have activated a menu
#HaiAttivatoIlMenu=256

;you have closed the window
#HaiChiusoLaFinestra=512

;you have pressed a key
#HaiPremutoUnTasto=1024

;--------------------------------------------------------
;le seguenti costanti indicano i tasti cliccati del topo
;the following constants state the clicked mouse buttons
;--------------------------------------------------------

;left mouse button pressed
#TastoSinistroDelTopoPremuto=1

;right mouse button pressed
#TastoDestroDelTopoPremuto=2

;left mouse button released
#TastoSinistroDelTopoRilasciato=5

;right mouse button released
#TastoDestroDelTopoRilasciato=6

;-----------------------------------------------------------------------------
;le seguenti costanti indicano il valore ascii del tasti Backspace, Esc e dei
; tasti freccia
;the following constants state the ascii value for the Backspace, Esc and
; arrow keys
;------------
#Backspace=8
#Escape=27
#CursorUp=28
#CursorDown=29
#CursorRight=30
#CursorLeft=31

;Backspace key
TastoBackspace$=Chr$(#Backspace)

;Esc key
TastoEsc$=Chr$(#Escape)

;Cursor up key
TastoCursoreSu$=Chr$(#CursorUp)

;Cursor down key
TastoCursoreGiu$=Chr$(#CursorDown)

;Cursor right key
TastoCursoreDestra$=Chr$(#CursorRight)

;Cursor left key
TastoCursoreSinistra$=Chr$(#CursorLeft)

;-----------------------------------------------------------
;le seguenti costanti indicano i bottoni del joypad premuti
;the following constants state the joypad pressed buttons
;---------------------------------------------------------
#_PlayB=1
#_ReverseB=2
#_ForwardB=4
#_GreenB=8
#_YellowB=16
#_RedB=32
#_BlueB=64

;-------------------------------------------------------------------------
;le seguenti costanti indicano la direzione scelta con il joystick/joypad
;the following constants state the choosen direction by joystick/joypad
;-----------------------------------------------------------------------
#JoyMovedUp=0
#JoyMovedRight=2
#JoyMovedDown=4
#JoyMovedLeft=6
#JoyNotMoved=8

;screen
#Schermo=0

;main window
#FinestraPrincipale=0

;main window's gadget list
#ListaGadgetPrincipale=0

;main window's menu list
#ListaMenuPrincipale=0

;sounds editor window
#FinestraEditoreSuoni=1

;sounds editor window's gadget list
#ListaGadgetEditoreSuoni=1

;sound editor window's menu list
#ListaMenuEditoreSuoni=1

;notes editor window
#FinestraEditoreSequenza=2

;notes editor window's gadget list
#ListaGadgetEditoreSequenza=2

;notes editor window's menu list
#ListaMenuEditoreSequenza=2

;note editor window's zonetable
#TabellaZoneEditoreSequenza=0

;window to change basic note length
#FinestraCambioEventoBase=3

;basic note length change window's gadget list
#ListaGadgetCambioEventoBase=3

;basic note change window's zonetable
#TabellaZoneCambioEventoBase=1

;background pic's bitmap
#BitmapImmagineDiSfondo=0

;------------------------------------------------------------------------------
;queste costanti indicano i cambiamenti che possono essere applicati alle note
;these constants states different changes that can be applied to notes
;----------------------------------------------------------------------

;select an event
#SelezionaUnEvento=0

;change the channel of the selected events
#CambiaIlCanaleDegliEventiSelezionati=1

;increase by one the selected events
#AlzaDiUnoGliEventiSelezionati=2

;decrease one the selected events
#AbbassaDiUnoGliEventiSelezionati=3

;move forward the selected events
#SpostaAvantiNelTempoGliEventiSelezionati=4

;move backward the selected events
#SpostaIndietroNelTempoGliEventiSelezionati=5

;delete the selected events
#EliminaGliEventiSelezionati=6

;select all the events
#SelezionaTuttiGliEventi=7

;deselect all the events
#DeselezionaTuttiGliEventi=8

;toggle selection of all events
#InvertiLaSelezioneDiTuttiGliEventi=9

;select same kind's events with the same height and of the same channel
#SelezionaGliEventiUguali=10

;add 10 to the to the event value of the selected events that aren't notes
#AggiungiDieciAgliEventiSelezionati=11

;sub 10 to the event value of the selected events that aren't notes
#SottraiDieciAgliEventiSelezionati=12

;put up of one octave the selected notes
#AlzaDiUnOttavaLeNoteSelezionate=13

;put down of one octave the selected notes
#AbbassaDiUnOttavaLeNoteSelezionate=14

;change the value of the selected events, that is velocity for notes
#CambiaIlValoreDegliEventiSelezionati=15

;increase the selected notes length
#AllungaLaDurataDelleNoteSelezionate=16

;decrease the selected notes length
#RiduciLaDurataDelleNoteSelezionate=17

;add a beat to selected time signature events
#AggiungiUnBattitoAlTempoSelezionato=18

;sub a beat to selected time signature events
#TogliUnBattitoAlTempoSelezionato=19

;add a measure to selected time signature events
#AggiungiUnaMisuraAlTempoSelezionato=20

;sub a measure to selected time signature events
#TogliUnaMisuraAlTempoSelezionato=21

;------------------------------------------------------------------------------
;le seguenti costanti indicano il modo di disegno delle sequenze  visualizzate
;the following constants state the displayed sequences drawing mode
;-------------------------------------------------------------------

;unselected sequence
#SequenzaNonSelezionata=0

;selected sequence
#SequenzaSelezionata=1

;highlighted sequence
#SequenzaEvidenziata=2

;-------------------------------------------------------------------------
;le seguenti costanti indicano il modo di disegno delle note visualizzate
;the following constants state the displayed notes drawing mode
;---------------------------------------------------------------

;unselected event
#EventoNonSelezionato=0

;selected event
#EventoSelezionato=1

;highlighted event
#EventoEvidenziato=2

;----------------------------------------------
;queste costanti indicano come suonare le note
;these constants state how to play notes
;----------------------------------------

;execute events from the main window
#EseguiGliEventiDallaFinestraPrincipale=0

;execute events from the sequence editor
#EseguiGliEventiDallEditoreSequenza=1

;---------------------------------------------------------------------------
;le seguenti costanti sono usate dal comando WJam per la selezione del modo
; grafico
;the following constants are used by WJam command for the graphic mode selection
;--------------------------------------------------------------------------------

;one colour with transparent background
#UnColoreConSfondoTrasparente=0

;two colours with full background
#DueColoriConSfondoPieno=1

;second time same colour
#SecondaVoltaStessoColore=2

;--------------------------------------------------------------
;le seguenti costanti indicano il tempo base che e' 4/4, cioe'
; #BattitiDiBase/#MisureDiBase
;the following constants states the basic time that is 4/4, that is
; #BattitiDiBase/#MisureDiBase
;------------------------------

;basic beats
#BattitiDiBase=4

;basic measures
#MisureDiBase=4

;sequences maximum
#MassimoSequenze=1024

;          font height, notes invisible area,   selected channel, note Incremento y,musical event moved by mouse
DEFTYPE .b AltezzaFonte,AreaInvisibileDelleNote,CanaleSelezionato,IncrementoYNota,  EventoMusicaleSpostatoConIlTopo

;          mouse pressed key,   AMIGA voice off,visible area start y,note position y,visible sequences
DEFTYPE .b TastoPremutoDelTopo, VoceSpenta,     YInizioAreaVisibile, YPosizioneNota, SequenzeVisibili

;          editor window inner height,           editor window inner width
DEFTYPE .w AltezzaInternaFinestraEditoreSequenza,LarghezzaInternaFinestraEditoreSequenza

;          main window inner height,        main window inner width
DEFTYPE .w AltezzaInternaFinestraPrincipale,LarghezzaInternaFinestraPrincipale

;          screen height, note Incremento y,values visible area,  screen height,   selected sequence
DEFTYPE .w AltezzaSchermo,IncrementoYNota,  AreaVisibileDeiValori,LarghezzaSchermo,SequenzaSelezionata

;          slider length, tempo background x,mouse x,slider height,tempo background y,mouse y
DEFTYPE .w XLunSlider,    XPosSfondoTempo,   XTopo,  YLunSlider,   YPosSfondoTempo,   YTopo

;          time invisible area,   note Incremento x,Sequence duration,Events,Selected events,  MIDI enabled
DEFTYPE .l AreaInvisibileDelTempo,IncrementoXNota,  DurataSequenza,   Eventi,EventiSelezionati,MIDIAttivato

;          visible area start x,note position x
DEFTYPE .l XInizioAreaVisibile, XPosizioneNota

;----------------------------------------------------------
;questa variabile riporta la parte non visibile del motivo
;this variable reports the non visible motive area
;--------------------------------------------------
AreaInvisibileDelMotivo.l=0

;-----------------------------------------------------------------------------
;questa variabile indica la velocita' di esecuzione delle note, indicata come
; battute al minuto
;this variable states the notes execution velocity, stated as bars for minute
;-----------------------------------------------------------------------------
BattuteAlMinuto.w=120

;-----------------------------------------------------
;questa variabile indica i battiti correnti del tempo
;this variable states the time's current beats
;----------------------------------------------
Battiti.b=#BattitiDiBase

;----------------------------------------------------------------------------
;la seguente variabile permette la selezione delle due diverse tavolozze dei
; colori; se vera (true), i colori saranno quelli originali, se falsa (false)
; saranno quelli dell'immagine di sfondo
;the following variable permits the selection of the two different colour
; palettes; if true the colours will be as original, if false they will be
; the ones from the pic
;-----------------------
ColoriOriginali.b=False

;-----------------------------------------------------
;questa variabile indica le misure correnti del tempo
;this variable states the time's current measures
;-------------------------------------------------
Misure.b=#MisureDiBase

;----------------------------------------------------------------------------
;questa costante indica il valore per cui bisogna moltiplicare o dividere la
; frequenza della nota per ricavare rispettivamente la nota successiva o la
; nota precedente e corrisponde a 2^(1/12)
;this constant states the value witch it must moltiply or divide the note
; frequency to obtain respectiveli the following note or the previous note and
; corresponds to 2^(1/12)
;-------------------------
DistanzaSemitono.f=1.05946309

;--------------------------------------------------------------
;questa variabile, diventando Vera, vi fa uscire dal programma
;this variable, becaming True, let you quit the program
;-------------------------------------------------------
EsciDalProgramma.b=False

;------------------------------------------
;questa variabile indica la fine del brano
;this variable states music end
;-------------------------------
FineMotivo.l=0

;------------------------------------------------------------------
;questa variabile indica se e' stata aperta la finestra principale
;this flag states if the main window is opened
;----------------------------------------------
FinestraPrincipaleAperta.b=False

;------------------------------------------------------------------------------
;Questa variabile indica la larghezza di base delle note; puo' essere cambiata
; secondo i bisogni del momento
;This variable states the basic notes width; it can be changed depending of
; the needs of the moment
;-------------------------
LarghezzaEventoDiBase.w=192

;----------------------------------------------------------------------------
;questa variabile indica se deve essere mostrato il nuovo valore dell'evento
; selezionato mosso con il mouse
;this variable states if the new value of the event dragged by mouse must be
; showed or not
;---------------
MostraNuovoValore.b=False

;----------------------------------------------------------------------
;questa variabile sara' vera (True) se una nota non e' stata terminata
;this variable will be true is a note will not be terminated
;------------------------------------------------------------
NoteSuonate.l=False

;-------------------------------------------------------------------
;questa variabile indica l'ottava selezionata nell'editore sequenza
;this variable states the selected octave in the sequence editor
;----------------------------------------------------------------
OttavaSelezionata.b=#_MiddleC/12

;---------------------------------------------------------------
;questa variabile indica la scala di visualizzazione delle note
;this variable states the notes visualiziation scale
;----------------------------------------------------
ScalaNote.b=1

;--------------------------------------------------------
;questa variabile indica il numero di sequenze esistenti
;this variable states the number of existing sequences
;------------------------------------------------------
Sequenze.w=0

;-----------------------------------------------------------------------------
;questa variabile indica se la lista degli ultimi 5 progetti e' stata scritta
;this flag states if the last 5 loaded projects list has been written
;---------------------------------------------------------------------
StoriaDeiProgettiAperti.b=False

;------------------------------------------------------------------------
;La nota base, il quarto, corrisponde a 192 tick; questa costante indica
; quanti tick passano in un 50mo di secondo per un tempo di 120 battute al
; minuto
;The basic note, the quarter, correspond to 192 ticks; this constant signs how
; many tick takes place in a 50th of a second
;---------------------------------------------
TicPerCinquantesimoDiSecondo.f=30.72

;--------------------------------------------------------------------------
;la seguente variabile stringa indica il tipo di evento musicale corrente;
; all'inizio e' impostata sull'evento nota
;the following string variable states the current event; at the beginning is
; set on the note event
;-----------------------
TipoDiEvento$="Note"

;------------------------------------------------------------------------------
;questa variabile indica per le note la velocita' di base e per i controlli il
; valore di base; valore utile da zero a 127
;this variable states for the notes the basic velocity and for the controls
; the basic value; useful value from zero to 127
;------------------------------------------------
ValoreEventoDiBase.b=64

;-----------------------------------------------------------------------
;questa variabile indica la posizione della voce Quit del menu' Project
;this variable marks the position of voice Quit in the Project menu
;-------------------------------------------------------------------
VoceMenuEsci.b=4

;------------------------------------------------------------------------------
;questa variabile indica la posizione d'inizio per la  visualizzazione delle
; sequenze
;this variables states the start position for the sequences displaying
;----------------------------------------------------------------------
XSequenzeVisibili.l=0

;-------------------------------------------------------------
;questa variabile memorizza la prima sequenza da visualizzare
;this variable stores the first sequence to be displayed
;--------------------------------------------------------
YSequenzeVisibili.w=0

;-----------------------------------------------------------------------
;queste 5 variabili conterranno i nomi degli ultimi 5 progetti caricati
;this 5 variables will keep names of last 5 projects loaded
;-----------------------------------------------------------
Dim ProgettoAperto$(4)

;-----------------------------------------------------------------------------
;questa struttura di variabili e' una tabella di riferimento per il periodo e
; la frequenza associati ad ognuna delle 128 note possibili
;this variables structure is a refferring table for the periode and frequency
; paired to every one of the 128 given notes
;--------------------------------------------
NEWTYPE .PeriFreq

;--------
;periode
;--------
 Periodo.l

;----------
;frequency
;----------
 Frequenza.f
End NEWTYPE
Dim PeriFreq.PeriFreq(127)

;--------------------------------------------------------------------------
;la seguente struttura di variabili serve per identificare il tipo di note
;the following variables structure is used to states the notes kind
;-------------------------------------------------------------------
NEWTYPE .TipoDiNota

;note italian name
 NomeItaliano$

;note english name
 NomeInglese$

;diesis flag
 Diesis.b

;note octave
 Ottava.b
End NEWTYPE
Dim TipoDiNota.TipoDiNota(127)

;----------------------------------------------------------------
;la seguente struttura di variabili e' per la gestione dei suoni
;the following variables structure is for sounds management
;-----------------------------------------------------------
NEWTYPE .Suono

;---------------------------------------------------
;questa variabile indica il nome del suono caricato
;this variable states the name of the loaded sound
;--------------------------------------------------
 Nome$

;----------------------------------------------------------------------------
;questa variabile indica il canale associato al suono caricato; valore utile
; da 1 a 16
;this variable states the channel linked to the loaded sound; useful value
; from 1 to 16
;--------------
 Canale.b

End NEWTYPE
Dim Suono.Suono(31)

NEWTYPE .Sequenza

;--------------------------------------------------
;questa variabile memorizza il nome della sequenza
;this variable stores the sequence name
;---------------------------------------
Nome$

;----------------------------------------------------------
;questa variabile indica l'inizio temporale della sequenza
;this variable states the sequence time start
;---------------------------------------------
Inizio.l

;---------------------------------------------------------
;questa variabile indica la fine temporale della sequenza
;this variable states the sequence time end
;-------------------------------------------
Durata.l

;------------------------------------------------------------------
;questa variabile indica gli eventi musicali totali della sequenza
;this variable states the sequence's total musical events
;---------------------------------------------------------
Eventi.l

;-----------------------------------------------------------------------
;questa variabile indica gli eventi musicali selezionati della sequenza
;this variable states the sequence's selected musical events
;------------------------------------------------------------
EventiSelezionati.l

End NEWTYPE
Dim Sequenza.Sequenza(#MassimoSequenze-1)

;----------------------------------------------------------------------------
;la seguente struttura di variabili e' per la gestione degli eventi musicali
;the following vars structure is for the musical events management
;------------------------------------------------------------------
NEWTYPE .EventoMusicale

;----------------------------------------------------------------------------
;questa variabile stringa indica il tipo di evento musicale, che puo' essere
; una nota od un parametro MIDI
;This string variable states the musical event kind, that can be a note or a
; MIDI parameter
;----------------
 Tipo$

;-----------------------------------------------------------------------
;se l'evento musicale e' una nota, questa variabile ne indica l'altezza;
; valore utile da zero a 127
;if the event is a note, this variable states its height; useful value from
;zero to 127
;------------
 Evento.b

;----------------------------------------------------------------------------
;questa variabile indica la posizione dell'evento musicale nel tempo in tic;
; valore utile da zero a 2 miliardi e rotti
;this variable states musical event position in time by ticks; useful value
;from zero to over 2 billions
;-----------------------------
 Inizio.l

;------------------------------------------------------------------------------
;questa varibile indica il canale dell'evento musicale; valore utile da 1 a 16
;this variable states musical event's channel; useful value from 1 to 16
;------------------------------------------------------------------------
 Canale.b

;-----------------------------------------------------------------------------
;questa variabile identifica la sequenza di appartenenza dell'evento musicale
; valore utile da 1 a 500
;this variable states the sequence witch the musical event belong to: useful
; value from 1 to 500
;---------------------
 Sequenza.w

;------------------------------------------------------------------
;questa variabile indica se l'evento musicale e' stato selezionato
;this variable states if the musical event has been selected
;------------------------------------------------------------
 Selezionato.b

;----------------------------------------------------------------------
;se l'evento musicale e' una nota, questa variabile indica se e' stata
; suonata: se il valore e' zero, la nota non e' stata ancora EseguiGliEventita; se il
; valore e' 1, il programma sta do la nota; se il valore e' 2, il
; programma ha smesso di suonare la nota
;if the musical event is a note, this variable states if it has been played:
; if the value is zero, the note has not been played yet; if the value is 1,
; the program is playing the note; if the value is 2, the program has finished
; to play the note
;------------------
 Eseguito.b

;------------------------------------------------------------------------------
;se l'evento musicale e' una nota, questa variabile ne indica in tic la durata
; nel tempo; valore utile da 0 a 2 miliardi e rotti (192 tic=nota di un quarto)
;if the event is a note, this variable states its duration in time by ticks;
;useful value from zero to over 2 billions (192 ticks=a quarter note)
;---------------------------------------------------------------------
 Durata.l

;--------------------------------------------------------------------------
;se l'evento musicale e'una nota, questa variabile ne indica l'intensita',
;cioe' il suo volume; se invece l'evento e' un controllo ne indica il valore
;if the musical event is a note, this variable states its intensity, that is
; its volume; if instead is a control it states its value
;---------------------------------------------------------
 Valore.b

;------------------------------------------------------------------------------
;se l'evento musicale e' una nota, questa variabile indica quale voce AMIGA e'
; stata usata per suonarla
;if the musical event si a note, this variable states witch AMIGA voice has
; been used to play it
;----------------------
 VoceUsata.b

End NEWTYPE

DEFTYPE .EventoMusicale NotaSuonata

;-----------------------------------------------------
;imposta il numero massimo di eventi musicali usabili
;sets the maximun musical events handling
;-----------------------------------------
MassimoEventiMusicali.l=Min((FastFree-65536)/SizeOf .EventoMusicale,32768)

;---------------------------------------------------------------------------
;crea le variabili array lista con la struttura del NEWTYPE .EventoMusicale
;creates the list array variables with the NEWTYPE .EventoMusicale structure
;----------------------------------------------------------------------------
Dim List EventoMusicale.EventoMusicale(MassimoEventiMusicali-1)

;-----------------------------------------------------------------
;questa variabile indica se e' stato attivato un dispoditivo MIDI
;this variable states if a MIDI device has been activated
;---------------------------------------------------------
MIDIAttivato.l=0

;--------------------------------------------------------------------------------
;questa variabile permette di mostrare i tasti da usare nell'editore sequenza la
; prima volta che vi ci si entra
;this variable permits to show the keys to use in the sequence editor the first
; time you enter it
;-------------------
PrimaVoltaNellEditoreSequenza.b=True

;--------------------------------------------------------------------------
;questa procedura imposta la fonte di caratteri Topaz8 per schermo, menu e
; requester, ma non per le finestre
;this procedure sets the characters font Topaz8 for screen, menus and
; requester, but not for windows
;--------------------------------
Statement CaricaLaFonteDiCaratteriTopaz8{}
SHARED AltezzaFonte
 AltezzaFonte=8:LoadFont #FonteDiCaratteriTopaz8,"topaz.font",AltezzaFonte
End Statement

;-----------------------------------------------
;questa procedura imposta il parlato dell'AMIGA
;this procedure sets the AMIGA speech
;-------------------------------------
Statement ImpostaIlParlatoDellAmiga{}
 SetVoice 130,250,0,1,64,22200
End Statement

;-----------------------------------------------
;questa procedura carica le immagini delle note
;this procedure loads the note images
;-------------------------------------
Statement CaricaLeImmaginiDelleNote{}
 BitMap 0,126,16,1
 LoadBitMap 0,"Notes.2Cols"
 GetaShape 0,0,0,22,16
 GetaShape 1,23,0,12,16
 GetaShape 2,36,0,12,16
 GetaShape 3,49,0,17,16
 GetaShape 4,67,0,17,16
 GetaShape 5,85,0,17,16
 GetaShape 6,103,0,17,16
 GetaShape 7,121,0,5,16
 Free BitMap 0
End Statement

n;---------------------------------------------
;questa procedura attiva la trasmissione MIDI
;this procedure activates the MIDI transmission
;-----------------------------------------------
Statement AttivaMIDI{}
SHARED MIDIAttivato
 Use Window #FinestraPrincipale
 WJam #DueColoriConSfondoPieno
 Repeat
  If MIDIAttivato=True Then CloseSerial 0
  WLocate 0,0:WColour 0,0:Print SPACE$(80)
  WLocate 0,0:WColour 3:Print "Please type your MIDI device name>"
  DispositivoMIDI$=StripLead$(StripTrail$(Edit$("serial.device",35),Asc(" ")),Asc(" "))
  WLocate 0,0:Print SPACE$(80)
  If DispositivoMIDI$<>""
   MIDIAttivato=OpenSerial(DispositivoMIDI$,0,31250,16)
   If MIDIAttivato=0
    EZRequest "AmySequencer message","Unable to open MIDI|on "+DispositivoMIDI$,"OK"
   Else
    MIDIAttivato=True
   EndIf
  EndIf
 Until MIDIAttivato=True
 EZRequest "AmySequencer message","MIDI has been activated|on "+DispositivoMIDI$,"OK"
 WJam #UnColoreConSfondoTrasparente
End Statement

;-------------------------------------------------
;questa procedura cambia la misurazione del tempo
;this procedure change the time misuration
;------------------------------------------
Statement CambiaLaMisuraDelTempo{}
SHARED Battiti
SHARED Misure
 Use Window #FinestraPrincipale
 WJam #DueColoriConSfondoPieno
 WLocate 0,0:WColour 0,0:Print SPACE$(80)
 WLocate 0,0:WColour 3:Print "Please type the basic time beat>"
 Battiti=Val(StripLead$(StripTrail$(Edit$("4",35),Asc(" ")),Asc(" ")))
 Battiti=Min(Max(Battiti,1),16)
 WLocate 0,0:Print SPACE$(80)
 WLocate 0,0:WColour 0,0:Print SPACE$(80)
 WLocate 0,0:WColour 3:Print "Please type the basic time measures>"
 Misure=Val(StripLead$(StripTrail$(Edit$("4",35),Asc(" ")),Asc(" ")))
 Misure=Min(Max(Misure,1),8)
 WJam #UnColoreConSfondoTrasparente
End Statement

;--------------------------------------------------------
;questa procedura mostra gli eventi musicali disponibili
;this procedure shows the available musical events
;--------------------------------------------------
Statement MostraGliEventiMusicaliDisponibili{}
SHARED MassimoEventiMusicali
SHARED Sequenza()
SHARED Sequenze
SHARED TotaleEventiMusicali
 TotaleEventiMusicali=0
 For Sequenza.w=0 To #MassimoSequenze-1
  TotaleEventiMusicali+Sequenza(Sequenza)\Eventi
 Next Sequenza
 Use Window #FinestraPrincipale
 WLocate 0,0:WColour 3:Print MassimoEventiMusicali," events allocated, ",TotaleEventiMusicali," event"
 If TotaleEventiMusicali<>1 Then Print "s"
 Print " used, "
 If Sequenze>0
  Print Str$(Sequenze)," sequence":If Sequenze>1 Then Print "s"
 Else
  Print "no sequences"
 EndIf
End Statement

;----------------------------------------------
;questa procedura mostra il tempo delle misure
;this procedure shows the measures' tempo
;-----------------------------------------
Statement MostraIlTempo{Tempo.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AltezzaInternaFinestraPrincipale
SHARED LarghezzaInternaFinestraPrincipale
SHARED XPosSfondoTempo
SHARED YPosSfondoTempo
 If Modo=#EseguiGliEventiDallEditoreSequenza
  XMessaggio.w=16*16+8*3+8*4+8*6
  YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
  WJam #DueColoriConSfondoPieno
  WLocate XMessaggio,YMessaggio
  WColour 1,0
  Print SPACE$(80-XMessaggio/8)
  WLocate XMessaggio,YMessaggio
 EndIf
 If Modo=#EseguiGliEventiDallaFinestraPrincipale
  WBlit 8,XPosSfondoTempo,YPosSfondoTempo
  WJam #UnColoreConSfondoTrasparente
  WLocate (80-Len("Tempo=00/00"))*8,AltezzaInternaFinestraPrincipale-8-8
  WColour 3,0
 EndIf
 Format "00":Print "Tempo=",Str$(Tempo MOD 16+1),"/",Str$(Tempo/16+1):Format ""
End Statement

;----------------------------------------------------------------------------
;questa procedura crea una tabella di riconoscimento delle note, memorizzata
; nell'array TipoDiNota()
;this procedure crates a referring note recognition table, stored in the
; TipoDiNota() array (that means Note Kind)
;-------------------------------------------
Statement ImpostaIlTipoDiNota{Nota.b}
SHARED TipoDiNota()

;--------------------------------------------
;questa variabile indica l'ottava della nota
;this variable state the note octave
;------------------------------------
 OttavaDellaNota.b=Nota/12

 TipoDiNota(Nota)\Ottava=OttavaDellaNota

;-----------------------------------------------------------------------
;questa variabile indica a quali delle 12 note dodici note fondamentali
; corrisponde la nota corrente
;this variable marks which of 12 fundamental notes corresponds the current
; note
;------
 NotaNellOttava.b=Nota MOD 12

 Select NotaNellOttava

;------------------
;la nota e' un Do?
;is the given note a C?
;-----------------------
 Case 0
  TipoDiNota(Nota)\NomeItaliano="Do"
  TipoDiNota(Nota)\NomeInglese="C"
  TipoDiNota(Nota)\Diesis=False

;-------------------------------
;la nota e' un Do diesis (Do#)?
;is the given note a C diesis (C#)?
;-----------------------------------
 Case 1
  TipoDiNota(Nota)\NomeItaliano="Do#"
  TipoDiNota(Nota)\NomeInglese="C#"
  TipoDiNota(Nota)\Diesis=True

;------------------
;la nota e' un Re?
;is the given note a D?
;-----------------------
 Case 2
  TipoDiNota(Nota)\NomeItaliano="Re"
  TipoDiNota(Nota)\NomeInglese="D"
  TipoDiNota(Nota)\Diesis=False

;-------------------------------
;la nota e' un Re diesis (Re#)?
;is the given note a D diesis (D#)?
;-----------------------------------
 Case 3
  TipoDiNota(Nota)\NomeItaliano="Re#"
  TipoDiNota(Nota)\NomeInglese="D#"
  TipoDiNota(Nota)\Diesis=True

;------------------
;la nota e' un Mi?
;is the given note a E?
;-----------------------
 Case 4
  TipoDiNota(Nota)\NomeItaliano="Mi"
  TipoDiNota(Nota)\NomeInglese="E"
  TipoDiNota(Nota)\Diesis=False

;------------------
;la nota e' un Fa?
;is the given note a F?
;-----------------------
 Case 5
  TipoDiNota(Nota)\NomeItaliano="Fa"
  TipoDiNota(Nota)\NomeInglese="F"
  TipoDiNota(Nota)\Diesis=False

;-------------------------------
;la nota e' un Fa diesis (Fa#)?
;is the given note a F diesis (F#)?
;-----------------------------------
 Case 6
  TipoDiNota(Nota)\NomeItaliano="Fa#"
  TipoDiNota(Nota)\NomeInglese="F#"
  TipoDiNota(Nota)\Diesis=True

;-------------------
;la nota e' un Sol?
;is the given note a G?
;-----------------------
 Case 7
  TipoDiNota(Nota)\NomeItaliano="Sol"
  TipoDiNota(Nota)\NomeInglese="G"
  TipoDiNota(Nota)\Diesis=False

;---------------------------------
;la nota e' un Sol diesis (Sol#)?
;is the given note a G diesis (G#)?
;-----------------------------------
 Case 8
  TipoDiNota(Nota)\NomeItaliano="Sol#"
  TipoDiNota(Nota)\NomeInglese="G#"
  TipoDiNota(Nota)\Diesis=True

;------------------
;la nota e' un La?
;is the given note an A?
;------------------------
 Case 9
  TipoDiNota(Nota)\NomeItaliano="La"
  TipoDiNota(Nota)\NomeInglese="A"
  TipoDiNota(Nota)\Diesis=False

;-------------------------------
;la nota e' un La diesis (La#)?
;is the given note an A diesis (A#)?
;------------------------------------
 Case 10
  TipoDiNota(Nota)\NomeItaliano="La#"
  TipoDiNota(Nota)\NomeInglese="A#"
  TipoDiNota(Nota)\Diesis=True

;------------------
;la nota e' un Si?
;is the given note a B?
;-----------------------
 Case 11
  TipoDiNota(Nota)\NomeItaliano="Si"
  TipoDiNota(Nota)\NomeInglese="B"
  TipoDiNota(Nota)\Diesis=False

 End Select
End Statement

Statement CalcolaLaFrequenzaEdIlPeriodoDelleNote{}
SHARED PeriFreq()
SHARED DistanzaSemitono
;--------------------------------------------------------------------------------
;per ottenere la frequenza di tutte le 128 note, si parte dal La della 2a ottava
; (la prima e' l'ottava zero), la cui frequenza e' nota e la si moltiplica o
; divide per la distanza minima tra due note che e' il semitono; per ottenere il
; periodo si divide una delle costanti di temporizzazione, a seconda che il
; il proprio AMIGA usi uno schermo PAL o NTSC, per la frequenza della nota; queste
; costanti sono riportate sul MANUALE DI RIFERIMENTO PER L'HARDWARE AMIGA.
;to obtain all 128 notes it starts from the A from the 3rd octave (the 1st is the
; zero octave) that has a known frequency, and it multiply or divide this for the
; minimum distance between two notes that is the semitone; to obtain the period it
; divides one of the timing constants, depending on your AMIGA uses a PAL or NTSC
; screen, for the note frequency; these constants are reported the AMIGA HARDWARE
; REFERENCE MANUAL
;------------------
PeriFreq(45)\Frequenza=440
If NTSC=True
 PeriFreq(45)\Periodo=#TemporizzazioneNTSC/PeriFreq(45)\Frequenza
Else
 PeriFreq(45)\Periodo=#TemporizzazionePAL/PeriFreq(45)\Frequenza
EndIf
ImpostaIlTipoDiNota{45}

For Nota.w=46 To 127
 PeriFreq(Nota)\Frequenza=PeriFreq(Nota-1)\Frequenza*DistanzaSemitono
 If NTSC=True
  PeriFreq(Nota)\Periodo=#TemporizzazioneNTSC/PeriFreq(Nota)\Frequenza
 Else
  PeriFreq(Nota)\Periodo=#TemporizzazionePAL/PeriFreq(Nota)\Frequenza
 EndIf
 ImpostaIlTipoDiNota{Nota}
Next Nota

For Nota=44 To 0 Step -1
 PeriFreq(Nota)\Frequenza=PeriFreq(Nota+1)\Frequenza/DistanzaSemitono
 If NTSC=True
  PeriFreq(Nota)\Periodo=#TemporizzazioneNTSC/PeriFreq(Nota)\Frequenza
 Else
  PeriFreq(Nota)\Periodo=#TemporizzazionePAL/PeriFreq(Nota)\Frequenza
 EndIf
 ImpostaIlTipoDiNota{Nota}
Next Nota
End Statement

;-----------------------------------------------------------------------------
;la seguente procedura converte un valore temporale da tic in battute, quarti
; e tic; la variabile OrigineZero serve per la differente visualizzazione
; della durata delle note che parte da zero
;the following procedure converts a time value from tcksin bars, quarters and
; ticks; the OrigineZero variable is used for the different note length
; displaying that starts from zero
;----------------------------------
Statement ConvertiIlTempoInBattute{Tempo.l,Battiti.b,Misure.b,OrigineZero.b}
 If OrigineZero=True
  Battute.b=Tempo/(192*4.0/Misure*Battiti)
  Battiti.b=(Tempo/(192/(Misure/4.0))) MOD Battiti
 Else
  Battute=Tempo/(192*4.0/Misure*Battiti)+1
  Battiti=(Tempo/(192/(Misure/4.0))) MOD Battiti+1
 EndIf
 Print Battute,".",Battiti
 Tic.w=Tempo MOD (192/(Misure/4.0))
 If Tic>0 Then Print ".",Tic
End Statement

;-------------------------------------------------
;questa procedura imposta le barre di scorrimento
;this procedure sets sliders
;----------------------------
Statement ImpostaSlider{Slider.l,XPos.w,YPos.w,Orientamento$,Parametri.l,ListaGadgetSlider.l}
SHARED XLunSlider
SHARED YLunSlider
 Orientamento$=UCase$(Orientamento$)
 If Orientamento$="HORIZONTAL" Then Parametri+#MovimentoOrizzontale
 If Orientamento$="VERTICAL" Then Parametri+#MovimentoVerticale
 PropGadget ListaGadgetSlider,XPos,YPos,Parametri,Slider,XLunSlider,YLunSlider
End Statement

;--------------------------------------------------
;questa procedura gestisce le barre di scorrimento
;this procedure manages the sliders
;-----------------------------------
Statement MostraSlider{Slider.l,ValoreDato.l,ValoreMassimo.l,Orientamento$,ListaGadgetSlider.l,FinestraSlider.l}
 Orientamento$=UCase$(Orientamento$)
 If Orientamento$="HORIZONTAL"
  SetHProp ListaGadgetSlider,Slider,ValoreDato/ValoreMassimo,1/ValoreMassimo
 EndIf
 If Orientamento$="VERTICAL"
  SetVProp ListaGadgetSlider,Slider,ValoreDato/ValoreMassimo,1/ValoreMassimo
 EndIf
 Redraw FinestraSlider,Slider
End Statement

;--------------------------------------------------
;questa procedura gestisce le barre di scorrimento
;this procedure manage the sliders
;----------------------------------
Function .l ValoreSlider{Slider.l,ValoreMassimo.l,LunghezzaSlider.l,Orientamento$,ListaGadgetSlider.l}
 Orientamento$=UCase$(Orientamento$)
 If Orientamento$="HORIZONTAL"
  ValoreSlider.f=HPropPot(ListaGadgetSlider,Slider)*ValoreMassimo
  ValoreIndicatoDalTopo.w=EMouseX*ValoreMassimo/LunghezzaSlider
 EndIf
 If Orientamento$="VERTICAL"
  ValoreSlider=VPropPot(ListaGadgetSlider,Slider)*ValoreMassimo
  ValoreIndicatoDalTopo=EMouseY*ValoreMassimo/LunghezzaSlider
 EndIf
 ValoreIndicatoDalloSlider.l=Int(ValoreSlider)
 If ValoreIndicatoDalTopo>ValoreIndicatoDalloSlider Then ValoreIndicatoDalloSlider+1
 If ValoreIndicatoDalTopo<ValoreIndicatoDalloSlider Then ValoreIndicatoDalloSlider-1
 ValoreIndicatoDalloSlider=Min(Max(ValoreIndicatoDalloSlider,0),ValoreMassimo)
 Function Return ValoreIndicatoDalloSlider
End Function

;--------------------------------------------------------------
;questa procedura cancella il file storico dei progetti aperti
;this procedure clears the loaded projects history file
;-------------------------------------------------------
Statement CancellaLaStoriaDeiProgettiAperti{}
SHARED ProgettoAperto$()
SHARED StoriaDeiProgettiAperti
SHARED VoceMenuEsci
 KillFile "ProjectsHistory"
 VoceMenuEsci=4
 StoriaDeiProgettiAperti=False
 For ProgettoAperto.b=0 To 4
  ProgettoAperto$(ProgettoAperto)=""
 Next ProgettoAperto
End Statement

;------------------------------------------------------------
;questa procedura carica il file storico dei progetti aperti
;this procedure loads the loaded projects history file
;------------------------------------------------------
Statement CaricaLaStoriaDeiProgettiAperti{}
SHARED ProgettoAperto$()
SHARED StoriaDeiProgettiAperti
SHARED VoceMenuEsci
 StoriaDeiProgettiAperti=ReadFile(0,"ProjectsHistory")
 If StoriaDeiProgettiAperti=True
  FileInput 0
  ProgettoAperto=0
  Repeat
   Dato$=Inkey$
   If Dato$=Chr$(10)
    ProgettoAperto+1
    VoceMenuEsci+1
   Else
    ProgettoAperto$(ProgettoAperto)+Dato$
   EndIf
  Until Dato$=""
  CloseFile 0
  PopInput
 EndIf
End Statement

;------------------------------------------------------------------
;crea la bitmap per l'immagine di sfondo della finestra principale
;creates the bitmap for the background pic of the main window
;-------------------------------------------------------------
Statement CreaLaBitmapPerLImmagineDiSfondo{}

;----------------------------------------
;crea la bitmap per l'immagine di sfondo
;creates the bitmap for the background pic
;------------------------------------------
 BitMap #BitmapImmagineDiSfondo,640,240,4

End Statement

;-------------------------------------------------------------------
;carica l'immagine di sfondo della finestra principale nella bitmap
;loads the background pic of the main window into the bitmap
;------------------------------------------------------------
Statement CaricaLImmagineDiSfondoNellaBitmap{}
SHARED ColoriOriginali

If ColoriOriginali=True
 ImmagineDiSfondo$="BackPicOC.16Cols"
Else
 ImmagineDiSfondo$="BackPic.16Cols"
EndIf

;----------------------------------------------------------------------------
;carica l'immagine di sfondo per la finestra principale nella bitmap creata
; per questa
;loads the main window background image into the bitmap creted for it
;---------------------------------------------------------------------
 LoadBitMap #BitmapImmagineDiSfondo,ImmagineDiSfondo$,#TavolozzaDeiColori

;---------------------------------------------------
;usa la tavolozza dei colori dell'immagine caricata
;use loaded image colours palette
;---------------------------------
 Use Palette #TavolozzaDeiColori

End Statement

;------------------------------------
;questa procedura imposta lo schermo
;this procedure sets the screen
;-------------------------------
Statement ImpostaLoSchermo{}
SHARED AltezzaFonte
SHARED AltezzaSchermo
SHARED LarghezzaSchermo
SHARED SequenzeVisibili

;--------------------------------------
;imposta la fonte di caratteri globale
;sets the global characters font
;--------------------------------
 Use IntuiFont #FonteDiCaratteriTopaz8

;------------------------------------
;inizializza la tavolozza dei colori
;initializes the colours palette
;--------------------------------
 InitPalette #TavolozzaDeiColori,16

;-------------------------------
;carica i colori per lo schermo
;loads colours for screen
;-------------------------
; For Colore.b=0 To 15
;  Read Rosso.b
;  Read Verde.b
;  Read Blu.b
;  PalRGB #TavolozzaDeiColori,Colore,Rosso,Verde,Blu
; Next Colore

;----------------------------------------------------------------
;imposta le penne dello schermo con i migliori colori (ROM 2.0+)
;sets screen pens with best colours (ROM 2.0+)
;----------------------------------------------
 ScreenPens 3,2,0,1,3,1,2

;------------------------------------------------
;apre lo schermo in alta risoluzione a 16 colori
;opens high resolution screen with 16 colours
;---------------------------------------------
 Screen #Schermo,4+8,"AmySequencer by Stefano Maria Regattin"

;-----------------------------
;usa la tavolozza dei colori
;use colours palette
;--------------------
 Use Palette #TavolozzaDeiColori

;-------------------------------------------------------------------------------
;questa variabile contiene l'indirizzo di memoria della struttura dello schermo
;this variable retains the screen structure memory address
;----------------------------------------------------------
 IndirizzoSchermo.l=Peek.l(Addr Screen(0))

;----------------------------------------------------------
;questa variabile contiene la vera larghezza Dello schermo
;this variable retains the true screen width
;--------------------------------------------
 LarghezzaSchermo=Peek.w(IndirizzoSchermo+12)

;--------------------------------------------------------
;questa variabile contiene la vera altezza dello schermo
;this variable retains the true screen height
;---------------------------------------------
 AltezzaSchermo=Peek.w(IndirizzoSchermo+14)

;---------------------------------------------------------------------
;questa variabile indica il massimo numero di sequenze visualizzabili
;this variable states the displayed sequences maximum number
;------------------------------------------------------------
 SequenzeVisibili.b=(AltezzaSchermo-(AltezzaFonte+3)-8-8-8)/8

End Statement

;-----------------------------------------------------------------------
;questa procedura mostra l'immagine di sfondo nella finestra principale
;this procedure shows the  background pic into the main window
;--------------------------------------------------------------
Statement MettiLImmagineDiSfondoNellaFinestraPrincipale{}

;---------------------------------------------------------
;copia l'immamgine dalla bitmap nella finestra principale
;copies the pic from the bitmap into the main window
;----------------------------------------------------
 BitMaptoWindow #BitmapImmagineDiSfondo,#FinestraPrincipale,0,0,0,0,640,240

End Statement

Statement CopiaLoSfondoSottoAlTempo{}
SHARED AltezzaInternaFinestraPrincipale
SHARED LarghezzaInternaFinestraPrincipale
SHARED XPosSfondoTempo
SHARED YPosSfondoTempo
 XPosSfondoTempo.w=LarghezzaInternaFinestraPrincipale-1-Len("Tempo=00/00")*8
 YPosSfondoTempo.w=AltezzaInternaFinestraPrincipale-8-8
 XLunSfondoTempo.b=Len("Tempo=00/00")*8
 YLunSfondoTempo.b=8
 GetaShape 8,XPosSfondoTempo,YPosSfondoTempo,XLunSfondoTempo,YLunSfondoTempo
End Statement

;-------------------------------------------------------------------------------
;Questa procedura imposta la finestra principale invisibile e reimposta il menu
; principale
;this procedure sets the main invisible window and resets the main menu
;-----------------------------------------------------------------------
Statement ImpostaLaFinestraPrincipale{}
SHARED AltezzaFonte
SHARED AltezzaInternaFinestraPrincipale
SHARED AltezzaSchermo
SHARED AreaInvisibileDelMotivo
SHARED BattuteAlMinuto
SHARED FineMotivo
SHARED FinestraPrincipaleAperta
SHARED LarghezzaInternaFinestraPrincipale
SHARED LarghezzaSchermo
SHARED ProgettoAperto$()
SHARED Sequenze
SHARED SequenzeVisibili
SHARED StoriaDeiProgettiAperti
SHARED TicPerCinquantesimoDiSecondo
SHARED VoceMenuEsci
SHARED XLunSlider
SHARED XSequenzeVisibili
SHARED YLunSlider
SHARED YSequenzeVisibili

;-----------------------------------------------
;se la finestra era gia' stato aperto la chiude
;if window was opened it close it
;---------------------------------
 If FinestraPrincipaleAperta=True
  BeepScreen #Schermo
  Free GadgetList #ListaGadgetPrincipale
  Free MenuList #ListaMenuPrincipale
  CloseWindow #FinestraPrincipale
 EndIf

;-----------------------------------------------------------------------
;imposta il colore del testo nei menu' a quello piu' chiaro disponibile
;sets text menu colour to the brightest available
;-------------------------------------------------
 MenuColour 3

;-------------------------
;imposta il menu' Project
;sets Project menu
;------------------
 MenuTitle #ListaMenuPrincipale,0,"Project"
 MenuItem #ListaMenuPrincipale,0,0,0,"New"
 MenuItem #ListaMenuPrincipale,0,0,1,"Load"
 MenuItem #ListaMenuPrincipale,0,0,2,"Save"
 MenuItem #ListaMenuPrincipale,0,0,3,"Save as"
 If StoriaDeiProgettiAperti=True
  For ProgettoAperto.b=4 To VoceMenuEsci-1
   MenuItem 0,0,0,ProgettoAperto,ProgettoAperto$(ProgettoAperto-4)
  Next ProgettoAperto
 EndIf
 MenuItem 0,0,0,VoceMenuEsci,"Quit"

;--------------------------
;imposta il menu' Controls
;sets Controls menu
;------------------
 MenuTitle #ListaMenuPrincipale,1,"Controls"
 MenuItem #ListaMenuPrincipale,0,1,0,"Play"

;-------------------------
;imposta il menu' Windows
;sets Windows menu
;------------------
 MenuTitle #ListaMenuPrincipale,2,"Windows"
 MenuItem #ListaMenuPrincipale,0,2,0,"Sounds Editor"
 MenuItem #ListaMenuPrincipale,0,2,1,"Sequence Editor"

;-----------------------
;imposta il menu' Prefs
;sets Prefs menu
;----------------
 MenuTitle #ListaMenuPrincipale,3,"Prefs"
 MenuItem #ListaMenuPrincipale,0,3,0,"Set MIDI device"
 MenuItem #ListaMenuPrincipale,1,3,1,"  Original colours"
 MenuItem #ListaMenuPrincipale,0,3,2,"Clear projects history"

;-------------------------------------------------------------------
;apre la finestra principale per ricavarne la larghezza e l'altezza
;opens main window to obtain its width and height
;-------------------------------------------------
 XPosF.w=0:YPosF.w=AltezzaFonte+3:XLunF.w=LarghezzaSchermo:YLunF.w=AltezzaSchermo-(AltezzaFonte+3)
 TipoFinestra.l=#FinestraDiSfondo+#FinestraSenzaBordi+#FinestraAttivata
 Window #FinestraPrincipale,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"",-1,-1

 MettiLImmagineDiSfondoNellaFinestraPrincipale{}

;-------------------------------------------------------------------------
;questa variabile conserva la larghezza interna della finestra principale
;this variable stores the inner witdh of the main window
;--------------------------------------------------------
 LarghezzaInternaFinestraPrincipale.w=InnerWidth

;----------------------------------------------------------------------
;questa variabile conserva l'altezza interna della finestra principale
;this variable stores the inner height of the main window
;---------------------------------------------------------
 AltezzaInternaFinestraPrincipale.w=InnerHeight

;------------------------------------------------------------------------------
;copia in memoria lo sfondo della posizione a video dell'indicazione del tempo
;copies into memory the time indication's on screen position background
;-----------------------------------------------------------------------
 CopiaLoSfondoSottoAlTempo{}

 CloseWindow #FinestraPrincipale

;----------------------------------------------------------------------
;imposta la barra di scorrimento che regola la velocita' di esecuzione
;sets the slider that tunes the execution velocity
;_-------------------------------------------------
 XLunSlider=LarghezzaInternaFinestraPrincipale
 YLunSlider=8
 ImpostaSlider{1,0,AltezzaInternaFinestraPrincipale-8,"HORIZONTAL",0,#ListaGadgetPrincipale}

;-----------------------------------------------------------------------
;imposta la barra di scorrimento che serve per visualizzare le sequenze
;sets the slider that is used to shows the sequences
;_---------------------------------------------------
 XLunSlider=16
 YLunSlider=SequenzeVisibili*8
 ImpostaSlider{2,0,8,"VERTICAL",0,#ListaGadgetPrincipale}

;-----------------------------------------------------------------------
;imposta la barra di scorrimento che serve per visualizzare le sequenze
;sets the slider that is used to shows the sequences
;_---------------------------------------------------
 XLunSlider=LarghezzaInternaFinestraPrincipale-16
 YLunSlider=4
 ImpostaSlider{3,16,8+SequenzeVisibili*8,"HORIZONTAL",0,#ListaGadgetPrincipale}

;------------------------------------------------------------------------------
;apre la finestra principale solo per il menu' come invisibile e ci attacca la
; lista dei gadget principale
;opens main window for menu usage only as invisible and it attaches the main
; gadget list
;-------------
 Window #FinestraPrincipale,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"",-1,-1,#ListaGadgetPrincipale

;-------------------------------
;attacca il menu' alla finestra
;attaches menu to window
;------------------------
 SetMenu #ListaMenuPrincipale

;----------------------------------------------
;imposta la fonte di caratteri per la finestra
;sets the font for the window
;-----------------------------
 WindowFont #FonteDiCaratteriTopaz8

 WJam #UnColoreConSfondoTrasparente

 MettiLImmagineDiSfondoNellaFinestraPrincipale{}

;-------------------------------------------------------------------------
;imposta la barra di scorrimento della velocita' di esecuzione delle note
;sets the notes execution velocity slider
;-----------------------------------------
 MostraSlider{1,BattuteAlMinuto-10,300-9,"HORIZONTAL",#ListaGadgetPrincipale,#FinestraPrincipale}

;-------------------------------------------------------------------
;mostra la velocita' di esecuzione delle note in battute per minuto
;shows the execution velocity in bar per minute
;-----------------------------------------------
 WLocate 0,AltezzaInternaFinestraPrincipale-8-8:WColour 3
 Print "BPM>",BattuteAlMinuto," Ticks/50th>",TicPerCinquantesimoDiSecondo

;----------------------------
;mostra le sequenze visibili
;shows the visible sequences
;----------------------------
 MostraSlider{2,YSequenzeVisibili,#MassimoSequenze-SequenzeVisibili,"VERTICAL",#ListaGadgetPrincipale,#FinestraPrincipale}

;-------------------------------------
;calcola l'area invisibile del motivo
;evaluate the motive's invisible area
;_------------------------------------
 AreaInvisibileDelMotivo=Max(FineMotivo-(LarghezzaInternaFinestraPrincipale-16),0)

;----------------------------
;mostra le sequenze visibili
;shows the visible sequences
;----------------------------
 MostraSlider{3,XSequenzeVisibili,AreaInvisibileDelMotivo,"HORIZONTAL",#ListaGadgetPrincipale,#FinestraPrincipale}

 MostraIlTempo{(#MisureDiBase-1)*16+#BattitiDiBase-1,#EseguiGliEventiDallaFinestraPrincipale}

;-----------------------------------------------------------------
;le finestre di richiesta sono assegnate alla finestra principale
;the request windows are assigned to main window
;------------------------------------------------
 EZOutput #FinestraPrincipale

 FinestraPrincipaleAperta=True

End Statement

;--------------------------------------------------------------------------
;questa procedura per ora legge solo il nome di un file e o inserisce nel
; menu principale; dovrebbe caricare un progetto di AmySequencer
;this procedure till now only reads a file name and put it into the main menu
; it should load an AmySequencer project
;----------------------------------------
Statement CaricaUnProgetto{}
SHARED ProgettoAperto$()
SHARED StoriaDeiProgettiAperti
SHARED VoceMenuEsci
 MaxLen P$=160
 MaxLen F$=64
 ProgettoAperto$=FileRequest$("Load AmySequencer project",P$,F$)
 If ProgettoAperto$<>""
  For ProgettoAperto.b=0 To 4
   If ProgettoAperto$=ProgettoAperto$(ProgettoAperto) Then Statement Return
  Next ProgettoAperto
  For ProgettoAperto=3 To 0 Step -1
   ProgettoAperto$(ProgettoAperto+1)=ProgettoAperto$(ProgettoAperto)
  Next ProgettoAperto
  ProgettoAperto$(0)=ProgettoAperto$
  StoriaDeiProgettiAperti=WriteFile(0,"ProjectsHistory")
  If StoriaDeiProgettiAperti=True
   FileOutput 0
   For ProgettoAperto=0 To 4
    If ProgettoAperto$(ProgettoAperto)<>""
     NPrint ProgettoAperto$(ProgettoAperto)
    EndIf
   Next ProgettoAperto
   CloseFile 0
   PopOutput
   VoceMenuEsci+1
  EndIf
 EndIf
End Statement

;-----------------------------------------------------------
;questa procedura imposta i suoni da usare con il programma
;this procedure sets sounds to use with program
;-----------------------------------------------
Statement EditoreSuoni{}
SHARED AltezzaFonte
SHARED AltezzaSchermo
SHARED LarghezzaSchermo
SHARED PercorsoSuoni$
SHARED Suono()
SHARED XLunSlider
SHARED YLunSlider

;-----------------------------------------------------------------------
;imposta il colore del testo nei menu' a quello piu' chiaro disponibile
;sets text menu colour to the brightest available
;-------------------------------------------------
 MenuColour 3

 MenuTitle #ListaMenuEditoreSuoni,0,"Sounds"
 MenuItem #ListaMenuEditoreSuoni,0,0,0,"Load"
 MenuItem #ListaMenuEditoreSuoni,0,0,1,"Discard"

 XPosF.w=0:YPosF.w=AltezzaFonte+3:XLunF.w=LarghezzaSchermo:YLunF.w=AltezzaSchermo-(AltezzaFonte+3)
 TipoFinestra.l=#GadgetChiudiFinestra+#FinestraConMemoriaSfondo+#FinestraAttivata
 Window #FinestraEditoreSuoni,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"Sounds Editor",-1,-1
 LarghezzaInternaFinestraEditoreSuoni.w=InnerWidth
 AltezzaInternaFinestraEditoreSuoni.w=InnerHeight
 CloseWindow #FinestraEditoreSuoni

;-------------------------------------------------------------------------------
;imposta la barra di scorrimento che serve per visualizzare i suoni disponibili
;sets the slider that is used to show the available sounds
;_---------------------------------------------------------
 XLunSlider=16
 YLunSlider=AltezzaInternaFinestraEditoreSuoni
 ImpostaSlider{1,LarghezzaInternaFinestraEditoreSuoni-16,0,"VERTICAL",0,#ListaGadgetEditoreSuoni}

 Window #FinestraEditoreSuoni,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"Sounds Editor",-1,-1,#ListaGadgetEditoreSuoni

;-------------------------------
;attacca il menu' alla finestra
;attaches menu to window
;------------------------
 SetMenu #ListaMenuEditoreSuoni

;----------------------------------------------
;imposta la fonte di caratteri per la finestra
;sets the font for the window
;-----------------------------
 WindowFont #FonteDiCaratteriTopaz8

 WJam #DueColoriConSfondoPieno

;----------------------------------
;sounds window's displaying  start
;----------------------------------
 InizioSuoni.b=0

;------------------------
;maximum strings length
;------------------------
 LunghezzaMassimaStringhe.b=(LarghezzaInternaFinestraEditoreSuoni-16)/8

;-----------------------------
;stated by mouse sound number
;-----------------------------
  SuonoIndicatoDalTopo.b=-1

;-------------------------------------------------------------------------
;imposta la barra di scorrimento della velocita' di esecuzione delle note
;sets the notes execution velocity slider
;-----------------------------------------
 MostraSlider{1,InizioSuoni,2,"VERTICAL",#ListaGadgetEditoreSuoni,#FinestraEditoreSuoni}

 Repeat
  If SecondoClicDelTopo.b=False
   WCls
   If SuoniCaricati.b>31 Then Enable #ListaGadgetEditoreSuoni,1 Else Disable #ListaGadgetEditoreSuoni,1
   Redraw #FinestraEditoreSuoni,1
   WLocate 0,0

;----------------------
;loaded sounds counter
;----------------------
   SuoniCaricati=0

   For Suono.b=0 To 30
    AssegnamentoSuono$=Suono(InizioSuoni+Suono)\Nome
    If AssegnamentoSuono$<>""
     CanaleSuono.b=Suono(InizioSuoni+Suono)\Canale
     If CanaleSuono>0 Then WColour CanaleSuono-1,16-CanaleSuono Else WColour 1,0
     Format "00"
     If CanaleSuono>0 Then CanaleSuono$=" channel "+Str$(CanaleSuono) Else CanaleSuono$=" no channel"
     Format""
     AssegnamentoSuono$+CanaleSuono$
     AssegnamentoSuono$=Right$(AssegnamentoSuono$,LunghezzaMassimaStringhe)
     AssegnamentoSuono$+SPACE$(LunghezzaMassimaStringhe-Len(AssegnamentoSuono$))
     NPrint AssegnamentoSuono$
     SuoniCaricati+1
    EndIf
   Next Suono
   SecondoClicDelTopo=True
  EndIf
  EventoFinestraEditoreSuoni.l=WaitEvent
  Select EventoFinestraEditoreSuoni
  Case #HaiPremutoUnTastoDelTopo
   TastoCliccatoDelTopo.b=MButtons:YTopo=WMouseY
   Select TastoCliccatoDelTopo
   Case 1
    SuonoIndicatoDalTopo=YTopo/8+InizioSuoni
    If SuoniCaricati>0 AND SuonoIndicatoDalTopo<SuoniCaricati
     CanaleSuono.b=Suono(SuonoIndicatoDalTopo)\Canale
     CanaleSuono+1:If CanaleSuono=17 Then CanaleSuono=0
     Suono(SuonoIndicatoDalTopo)\Canale=CanaleSuono
    EndIf
    SecondoClicDelTopo=False
   Case 5
    SecondoClicDelTopo=True
   End Select
;  Case #HaiPremutoUnGadget
;   If SuoniCaricati>31
;    AltezzaSlider.w=
;    InizioSuoni=ValoreSlider{1,2,AltezzaInternaFinestraEditoreSuoni,"VERTICAL",#ListaGadgetEditoreSuoni}
;   EndIf
;   SecondoClicDelTopo=False
  Case #HaiRilasciatoUnGadget
   If SuoniCaricati>31
    InizioSuoni=ValoreSlider{1,2,AltezzaInternaFinestraEditoreSuoni,"VERTICAL",#ListaGadgetEditoreSuoni}
   EndIf
   SecondoClicDelTopo=False
  Case #HaiAttivatoIlMenu
   If MenuHit=0 AND ItemHit=0
    If SuoniCaricati<32
     MaxLen PercorsoSuoni$=160
     MaxLen NomeSuono$=64
     NomeSuono$=FileRequest$("Load a sound...",PercorsoSuoni$,NomeSuono$)
     If NomeSuono$<>""
      StessoSuono.b=False
      If SuoniCaricati>0
       For SuonoPrecedente=0 To SuoniCaricati-1
        If NomeSuono$=Suono(SuonoPrecedente)\Nome Then StessoSuono=True
       Next SuonoPrecedente
      EndIf
      If StessoSuono=False
       Suono=SuoniCaricati
       LoadSound Suono,NomeSuono$
       Suono(Suono)\Nome=NomeSuono$
       Sound Suono,3
      EndIf
     EndIf
    EndIf
   EndIf
   If MenuHit=0 AND ItemHit=1
    If SuoniCaricati>0 AND SuonoIndicatoDalTopo<SuoniCaricati AND SuonoIndicatoDalTopo>-1
     Suono=SuonoIndicatoDalTopo
     Free Sound Suono
     Suono(Suono)\Nome=""
     While Suono+1<SuoniCaricati
      Suono(Suono)\Nome=Suono(Suono+1)\Nome
      Suono(Suono)\Canale=Suono(Suono+1)\Canale
      Suono+1
     Wend
     Suono(Suono)\Nome=""
     Suono(Suono)\Canale=0
     SuonoIndicatoDalTopo=-1
    EndIf
   EndIf
   SecondoClicDelTopo=False
  Case #HaiChiusoLaFinestra
   SuoniAssegnatiAlloStessoCanale.b=False
   For SuonoUno.b=0 To 31
    For SuonoDue.b=0 To 31
     If SuonoUno<>SuonoDue
      If Suono(SuonoUno)\Canale>0 AND Suono(SuonoUno)\Canale=Suono(SuonoDue)\Canale
       SuoniAssegnatiAlloStessoCanale=True
      EndIf
     EndIf
    Next SuonoDue
   Next SuonoUno
   If SuoniAssegnatiAlloStessoCanale=True
    Messaggio$="You have two or more sounds|assigned to the same channel;|please adjust all better!"
    EZRequest "AmySequencer message",Messaggio$,"OK"
    SecondoClicDelTopo=False
   Else
    EsciDallEditoreSuoni.b=True
   EndIf
  Case #HaiPremutoUnTasto
   TastoPremuto$=LCase$(Inkey$)
   Select TastoPremuto$
   Case TastoEsc$
    EsciDallEditoreSuoni=True
   Case TastoCursoreSu$
   Case TastoCursoreGiu$
   End Select
   SecondoClicDelTopo=False
  End Select
 Until EsciDallEditoreSuoni=True
 CloseWindow #FinestraEditoreSuoni
 Use Window #FinestraPrincipale
 WJam #UnColoreConSfondoTrasparente
End Statement

;-----------------------------------------------------
;questa procedura cancella a video un evento musicale
;this procedure clears on screen a musical event
;------------------------------------------------
Statement CancellaUnEventoMusicale{TipoDiEvento$,Evento.b,InizioEvento.l,DurataEvento.l,ModoDisegno.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED ScalaNote
SHARED TipoDiNota()
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
 Select TipoDiEvento$
 Case "Note"
  NotaVisualizzata.w=(127-Evento-YInizioAreaVisibile)*8
  If NotaVisualizzata>=0 AND NotaVisualizzata+7<=AltezzaInternaFinestraEditoreSequenza-8-8
   InizioNota.l=InizioEvento:FineNota.l=InizioNota+DurataEvento-1
   I.w=16+InizioNota/ScalaNote-XInizioAreaVisibile
   F.w=16+FineNota/ScalaNote-XInizioAreaVisibile
   If I>=16 AND I<LarghezzaInternaFinestraEditoreSequenza
    InizioNotaVisibile.b=True
   Else
    InizioNotaVisibile=False
   EndIf
   If F>=16 AND F<LarghezzaInternaFinestraEditoreSequenza
    FineNotaVisibile.b=True
   Else
    FineNotaVisibile=False
   EndIf
   If I<16 AND F>LarghezzaInternaFinestraEditoreSequenza
    NotaVisibile.b=True
   Else
    If InizioNotaVisibile=True OR FineNotaVisibile=True
     NotaVisibile=True
    Else
     NotaVisibile=False
    EndIf
   EndIf
   If NotaVisibile=True
    X0Nota=Min(Max(I,16),LarghezzaInternaFinestraEditoreSequenza-1)
    Y0Nota=Min(Max(NotaVisualizzata,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
    X1Nota=Min(Max(F,16),LarghezzaInternaFinestraEditoreSequenza-1)
    Y1Nota=Min(Max(NotaVisualizzata+7,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
    If TipoDiNota(Nota)\Diesis=True
     WBox X0Nota,Y0Nota,X1Nota,Y1Nota,0
    Else
     WBox X0Nota,Y0Nota,X1Nota,Y1Nota,3
    EndIf
   EndIf
  EndIf
 Case "Program"
  FineProgramma.l=InizioEvento+Len("Program000")*8-1
  If ModoDisegno=#EventoSelezionato Then FineProgramma+Len("X")*8
  I.w=16+InizioEvento/ScalaNote-XInizioAreaVisibile
  F.w=16+FineProgramma-XInizioAreaVisibile
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
   Programma.w=AreaVisibileDeiValori*Max((127-Evento+1),0)/127
   For Linea.b=0 To 7
    Y.w=Programma+Linea
    If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
     Wline I,Y,FineProgramma,Y,0
    Else
     Wline I,Y,FineProgramma,Y,3
    EndIf
   Next Linea
  EndIf
 Case "Control"
  FineControllo.l=InizioEvento+Len("Control000")*8-1
  If ModoDisegno=#EventoSelezionato Then FineControllo+Len("X")*8
  I.w=16+InizioEvento/ScalaNote-XInizioAreaVisibile
  F.w=16+FineControllo-XInizioAreaVisibile
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
   Controllo.w=AreaVisibileDeiValori*Max((127-Evento+1),0)/127
   For Linea.b=0 To 7
    Y.w=Controllo+Linea
    If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
     Wline I,Y,FineControllo,Y,0
    Else
     Wline I,Y,FineControllo,Y,3
    EndIf
   Next Linea
  EndIf
 Case "Tempo"
  FineTempo.l=InizioEvento+Len("Tempo=00/00")*8-1
  If ModoDisegno=#EventoSelezionato Then FineTempo+Len("X")*8
  I.w=16+InizioEvento/ScalaNote-XInizioAreaVisibile
  F.w=16+FineTempo-XInizioAreaVisibile
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
   Tempo.w=AreaVisibileDeiValori*Max((127-Evento+1),0)/127
   For Linea.b=0 To 7
    Y.w=Controllo+Linea
    If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
     Wline I,Y,FineTempo,Y,0
    Else
     Wline I,Y,FineTempo,Y,3
    EndIf
   Next Linea
  EndIf
 End Select
End Statement

;--------------------------------------------
;questa procedura disegna un evento musicale
;this procedure draws a musical events
;--------------------------------------
Statement DisegnaUnEventoMusicale{TipoDiEvento$,Evento.b,InizioEvento.l,DurataEvento.l,CanaleEvento.b,ModoDisegno.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED ScalaNote
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
 Select TipoDiEvento$
 Case "Note"
  NotaVisualizzata.w=(127-Evento-YInizioAreaVisibile)*8
  If NotaVisualizzata>=0 AND NotaVisualizzata+7<=AltezzaInternaFinestraEditoreSequenza-8-8
   FineNota.l=InizioEvento+DurataEvento-1
   I.w=16+InizioEvento/ScalaNote-XInizioAreaVisibile
   F.w=16+FineNota/ScalaNote-XInizioAreaVisibile
   If I>=16 AND I<LarghezzaInternaFinestraEditoreSequenza
    InizioNotaVisibile.b=True
   Else
    InizioNotaVisibile=False
   EndIf
   If F>=16 AND F<LarghezzaInternaFinestraEditoreSequenza
    FineNotaVisibile.b=True
   Else
    FineNotaVisibile=False
   EndIf
   If I<16 AND F>LarghezzaInternaFinestraEditoreSequenza
    NotaVisibile.b=True
   Else
    If InizioNotaVisibile=True OR FineNotaVisibile=True
     NotaVisibile=True
    Else
     NotaVisibile=False
    EndIf
   EndIf
   If NotaVisibile=True
    X0Nota=Min(Max(I,16),LarghezzaInternaFinestraEditoreSequenza-1)
    Y0Nota=Min(Max(NotaVisualizzata,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
    X1Nota=Min(Max(F,16),LarghezzaInternaFinestraEditoreSequenza-1)
    Y1Nota=Min(Max(NotaVisualizzata+7,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
    WBox X0Nota,Y0Nota,X1Nota,Y1Nota,16-CanaleEvento
    If ModoDisegno=#EventoSelezionato
     Wline X0Nota,NotaVisualizzata,X1Nota,NotaVisualizzata+7,CanaleEvento-1
     Wline X0Nota,NotaVisualizzata+7,X1Nota,NotaVisualizzata,CanaleEvento-1
    EndIf
    If ModoDisegno=#EventoNonSelezionato
     Wline X0Nota+1,NotaVisualizzata+1,X1Nota-1,NotaVisualizzata+1,CanaleEvento-1
     Wline X0Nota+1,NotaVisualizzata+6,X1Nota-1,NotaVisualizzata+6,CanaleEvento-1
    EndIf
    If ModoDisegno=#EventoNonSelezionato
     If InizioNotaVisibile=True
      Wline I+1,NotaVisualizzata+1,I+1,NotaVisualizzata+6,CanaleEvento-1
     EndIf
     If FineNotaVisibile=True
      Wline F-1,NotaVisualizzata+1,F-1,NotaVisualizzata+6,CanaleEvento-1
     EndIf
    EndIf
   EndIf
  EndIf
 Case "Program"
  FineProgramma.l=InizioEvento+Len("Program000")*8-1
  If ModoDisegno=#EventoSelezionato Then FineProgramma+Len("X")*8
  I.w=16+InizioEvento/ScalaNote-XInizioAreaVisibile
  F.w=16+FineProgramma-XInizioAreaVisibile
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   WColour CanaleEvento-1,16-CanaleEvento
   Format "000":Programma$="Program"+Str$(Evento):Format ""
   If ModoDisegno=#EventoSelezionato Then Programma$+"X"
   I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
   Y.w=AreaVisibileDeiValori*Max((127-Evento+1),0)/127
   WLocate I,Y:Print Left$(Right$(Programma$,(F-16+1)/8),(F-I+1)/8)
  EndIf
 Case "Control"
  FineControllo.l=InizioEvento+Len("Control000")*8-1
  If ModoDisegno=#EventoSelezionato Then FineControllo+Len("X")*8
  I.w=16+InizioEvento/ScalaNote-XInizioAreaVisibile
  F.w=16+FineControllo-XInizioAreaVisibile
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   WColour CanaleEvento-1,16-CanaleEvento
   Format "000":Controllo$="Control"+Str$(Evento):Format ""
   If ModoDisegno=#EventoSelezionato Then Controllo$+"X"
   I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
   Y.w=AreaVisibileDeiValori*Max((127-Evento+1),0)/127
   WLocate I,Y:Print Left$(Right$(Controllo$,(F-16+1)/8),(F-I+1)/8)
  EndIf
 Case "Tempo"
  FineTempo.l=InizioEvento+Len("Tempo=00/00")*8-1
  If ModoDisegno=#EventoSelezionato Then FineTempo+Len("X")*8
  I.w=16+InizioEvento/ScalaNote-XInizioAreaVisibile
  F.w=16+FineTempo-XInizioAreaVisibile
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   WColour CanaleEvento-1,16-CanaleEvento:Format"00"
   Tempo$="Tempo="+Str$(Evento MOD 16+1)+"/"+Str$(Evento/16+1):Format ""
   If ModoDisegno=#EventoSelezionato Then Tempo$+"X"
   I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
   Y.w=AreaVisibileDeiValori*Max((127-Evento+1),0)/127
   WLocate I,Y:Print Left$(Right$(Tempo$,(F-16+1)/8),(F-I+1)/8)
  EndIf
 End Select
End Statement

;-----------------------------------------------------------
;questa procedura disegna le note di sfondo con i loro nomi
;this procedure draws the notes background with note names
;----------------------------------------------------------
Statement MostraLeNoteDiSfondoConILoroNomi{}
SHARED AreaInvisibileDelleNote
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED TipoDiNota()
SHARED YInizioAreaVisibile
 For Tasto.b=0 To 127-AreaInvisibileDelleNote
  Nota.b=127-Tasto-YInizioAreaVisibile
  Y0Nota.w=Tasto*8:Y1Nota.w=Y0Nota+7
  If TipoDiNota(Nota)\Diesis=True
   WBox 16,Y0Nota,LarghezzaInternaFinestraEditoreSequenza,Y1Nota,0
   WColour 3,0
  Else
   WBox 16,Y0Nota,LarghezzaInternaFinestraEditoreSequenza,Y1Nota,3
   WColour 0,3
  EndIf
  WLocate 16,Y0Nota
  Print "Note ",Nota,">"
  Print TipoDiNota(Nota)\NomeInglese
  Print "-"
  Print TipoDiNota(Nota)\NomeItaliano
  Print TipoDiNota(Nota)\Ottava
 Next Tasto
End Statement

;-----------------------------------------------
;questa procedura mostra i numeri delle battute
;this procedure shows the bar numbers
;-------------------------------------
Statement MostraLeBattute{}
SHARED AreaInvisibileDelleNote
SHARED Battiti
SHARED EventoMusicale()
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED Misure
SHARED ScalaNote
SHARED SequenzaSelezionata
SHARED TipoDiNota()
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
 Nota.b=127-YInizioAreaVisibile-(127-AreaInvisibileDelleNote)
 Nota$=Str$(Nota):OttavaNota$=Str$(TipoDiNota(Nota)\Ottava):NomeIngleseNota$=TipoDiNota(Nota)\NomeInglese
 NomeItalianoNota$=TipoDiNota(Nota)\NomeItaliano
 LarghezzaTesto.w=Len("Note "+Nota$+">"+NomeIngleseNota$+"-"+NomeItalianoNota$+OttavaNota$+" ")*8
 If TipoDiNota(Nota)\Diesis=True Then WColour 3,0 Else WColour 0,3
 ScostamentoBattute.w=XInizioAreaVisibile MOD 192
 FineTempoVisibile.l=XInizioAreaVisibile+(LarghezzaInternaFinestraEditoreSequenza-16)*ScalaNote
 TempoVisibile.l=XInizioAreaVisibile
 ResetList EventoMusicale()
 Repeat
  XTempo.w=(TempoVisibile-XInizioAreaVisibile-ScostamentoBattute)/ScalaNote
  If XTempo>LarghezzaTesto
   While NextItem(EventoMusicale())=True
    If EventoMusicale()\Tipo="Tempo"
     If EventoMusicale()\Sequenza=SequenzaSelezionata AND EventoMusicale()\Inizio<=TempoVisibile
      NuoviBattiti.b=EventoMusicale()\Evento MOD 16+1
      NuoveMisure.b=EventoMusicale()\Evento/16+1
      TempoCambiato.b=True
     EndIf
    EndIf
   Wend
   WLocate XTempo,(127-AreaInvisibileDelleNote)*8
   If TempoCambiato=True
    ConvertiIlTempoInBattute{TempoVisibile-ScostamentoBattute,NuoviBattiti,NuoveMisure,False}
   Else
    ConvertiIlTempoInBattute{TempoVisibile-ScostamentoBattute,Battiti,Misure,False}
   EndIf
  EndIf
  If TempoCambiato=True
   IncrementoTempoVisibile.w=(192*(4.0/NuoveMisure))*Max(ScalaNote/4,1)
  Else
   IncrementoTempoVisibile.w=(192*(4.0/Misure))*Max(ScalaNote/4,1)
  EndIf
  TempoVisibile+IncrementoTempoVisibile
 Until TempoVisibile>FineTempoVisibile
End Statement

;-----------------------------------------------------
;questa procedura mostra gli slider dell'editore note
;this procedure shows the notes editor' sliders
;-----------------------------------------------
Statement MostraSliderEditoreSequenza{}
SHARED AreaInvisibileDelleNote
SHARED AreaInvisibileDelTempo
SHARED DurataSequenza
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED ScalaNote
SHARED Sequenza()
SHARED SequenzaSelezionata
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
 MostraSlider{1,YInizioAreaVisibile,AreaInvisibileDelleNote,"VERTICAL",#ListaGadgetEditoreSequenza,#FinestraEditoreSequenza}
 AreaInvisibileDelTempo=DurataSequenza/ScalaNote-(LarghezzaInternaFinestraEditoreSequenza-16)
 AreaInvisibileDelTempo=Max(AreaInvisibileDelTempo,0)
 If AreaInvisibileDelTempo=0
  Disable #ListaGadgetEditoreSequenza,2
  XInizioAreaVisibile=0
 Else
  Enable #ListaGadgetEditoreSequenza,2
 EndIf
 Redraw #FinestraEditoreSequenza,2
 MostraSlider{2,XInizioAreaVisibile,AreaInvisibileDelTempo,"HORIZONTAL",#ListaGadgetEditoreSequenza,#FinestraEditoreSequenza}
End Statement

;--------------------------------------------
;questa procedura mostra gli eventi musicali
;this procedure shows musical events
;------------------------------------
Statement MostraGliEventiMusicali{}
SHARED EventoMusicale()
SHARED SequenzaSelezionata
 ResetList EventoMusicale()
 While NextItem(EventoMusicale())=True
  TipoDiEvento$=EventoMusicale()\Tipo
  If EventoMusicale()\Sequenza=SequenzaSelezionata
   InizioEvento.l=EventoMusicale()\Inizio
   CanaleEvento.b=EventoMusicale()\Canale
   If EventoMusicale()\Selezionato=True
    Select TipoDiEvento$
    Case "Note"
     Nota.b=EventoMusicale()\Evento:DurataNota.l=EventoMusicale()\Durata
     DisegnaUnEventoMusicale{"Note",Nota,InizioEvento,DurataNota,CanaleEvento,#EventoSelezionato}
    Case "Program"
     Programma.b=EventoMusicale()\Evento
     DisegnaUnEventoMusicale{"Program",Programma,InizioEvento,0,CanaleEvento,#EventoSelezionato}
    Case "Control"
     Controllo.b=EventoMusicale()\Evento
     DisegnaUnEventoMusicale{"Control",Controllo,InizioEvento,0,CanaleEvento,#EventoSelezionato}
    Case "Tempo"
     Tempo.b=EventoMusicale()\Evento
     DisegnaUnEventoMusicale{"Tempo",Tempo,InizioEvento,0,CanaleEvento,#EventoSelezionato}
    End Select
   Else
    Select TipoDiEvento$
    Case "Note"
     Nota=EventoMusicale()\Evento:DurataNota=EventoMusicale()\Durata
     DisegnaUnEventoMusicale{"Note",Nota,InizioEvento,DurataNota,CanaleEvento,#EventoNonSelezionato}
    Case "Program"
     Programma=EventoMusicale()\Evento
     DisegnaUnEventoMusicale{"Program",Programma,InizioEvento,0,CanaleEvento,#EventoNonSelezionato}
    Case "Control"
     Controllo=EventoMusicale()\Evento
     DisegnaUnEventoMusicale{"Control",Controllo,InizioEvento,0,CanaleEvento,#EventoNonSelezionato}
    Case "Tempo"
     Tempo=EventoMusicale()\Evento
     DisegnaUnEventoMusicale{"Tempo",Tempo,InizioEvento,0,CanaleEvento,#EventoNonSelezionato}
    End Select
   EndIf
  EndIf
 Wend
End Statement

;---------------------------------------------------------------
;questa procedura mostra la scala di visualizzazione delle note
;this procedure shows the note scale of notes displaying
;--------------------------------------------------------
Statement MostraLaScalaDelleNote{}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED ColoriOriginali
SHARED ScalaNote
; For Scatola.b=0 To 4
;  Y0Scatola.w=AltezzaInternaFinestraEditoreSequenza-8-8
;  WBox Scatola,Y0Scatola+Scatola,15-Scatola,Y0Scatola+7-Scatola,15-Scatola
; Next Scatola
 Select ScalaNote
 Case 1
  Ingrandimento.b=1
 Case 2
  Ingrandimento=2
 Case 4
  Ingrandimento=3
 Case 8
  Ingrandimento=4
 Case 16
  Ingrandimento=5
 Case 32
  Ingrandimento=6
 End Select
 WLocate 0,AltezzaInternaFinestraEditoreSequenza-8-8
 If ColoriOriginali=True Then WColour 1,0 Else WColour 2,1
 Print "Z",Ingrandimento
End Statement

Statement MostraITastiDaUsare{}
 MostraITastiDaUsare$="Space>.......move sequence end forward|"
 MostraITastiDaUsare$+"No selected events:|"
 MostraITastiDaUsare$+"Cursor up>...scroll window up|"
 MostraITastiDaUsare$+"Cursor down>.scroll window down|"
 MostraITastiDaUsare$+"Cursor left>.scroll window forward|"
 MostraITastiDaUsare$+"Cursor right>scroll window backward|"
 MostraITastiDaUsare$+"Backspace>...delete last event|"
 MostraITastiDaUsare$+"with selected events:|"
 MostraITastiDaUsare$+"Cursor up>...inc sel events/tempo beat|"
 MostraITastiDaUsare$+"Cursor down>.dec sel events/tempo beat|"
 MostraITastiDaUsare$+"Cursor left>.move sel events forward|"
 MostraITastiDaUsare$+"Cursor right>move sel events backward|"
 MostraITastiDaUsare$+"with selected events plus shift:|"
 MostraITastiDaUsare$+"Cursor up>...move sel notes up of one octave|"
 MostraITastiDaUsare$+"             inc sel events of 10|"
 MostraITastiDaUsare$+"             inc sel tempo events measure|"
 MostraITastiDaUsare$+"Cursor down> move sel notes down of one octave|"
 MostraITastiDaUsare$+"             dec sel events of 10|"
 MostraITastiDaUsare$+"             dec sel tempo events measure|"
 MostraITastiDaUsare$+"Cursor left>.stretch sel notes forward|"
 MostraITastiDaUsare$+"Cursor right>stretch sel notes backward|"
 MostraITastiDaUsare$+"Backspace>...delete all sel events|"
 MostraITastiDaUsare$+"Esc>.........leave the editor"
 EZRequest "AmySequencer help",MostraITastiDaUsare$,"OK"
End Statement

Statement MostraLaMappaturaDelleNoteSullaTastiera{}
 MostraLaMappaturaDelleNoteSullaTastiera$="Note    lo octave hi octave|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"C--Do  >........Z.........Q|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"C#-Do# >........S.........2|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"D--Re  >........X.........W|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"D#-Re# >........D.........3|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"E--Mi  >........C.........E|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"F--Fa  >........V.........R|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"F#-Fa# >........G.........5|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"G--Sol >........B.........T|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"G#-Sol#>........H.........6|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"A--La  >........N.........Y|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"A#-La# >........J.........7|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"B--Si  >........M.........U|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"function keys to select octave"
 EZRequest "AmySequencer help",MostraLaMappaturaDelleNoteSullaTastiera$,"OK"
End Statement

;---------------------------------------------------
;questa procedura permette di cambiare la nota base
;this procedure permits to change the basic note
;------------------------------------------------
Statement CambiaLEventoDiBase{}
SHARED AltezzaFonte
SHARED ColoriOriginali
SHARED EventiSelezionati
SHARED EventoMusicale()
SHARED LarghezzaEventoDiBase
SHARED TastoCursoreDestra$
SHARED TastoCursoreSinistra$
SHARED TastoEsc$
SHARED TipoDiEvento$
SHARED ValoreEventoDiBase
SHARED XLunSlider
SHARED YLunSlider
 TipoFinestra.l=#FinestraMovibile+#GadgetNascondiFinestra+#GadgetChiudiFinestra+#FinestraConMemoriaSfondo+#FinestraAttivata
 YPosF.w=(AltezzaFonte+3)*2
 YLunF.w=AltezzaFonte+3+16+8+8+2:If TipoDiEvento$<>"Program" AND TipoDiEvento$<>"Tempo" Then YLunF+8+8
 TitoloFinestra$="Basic event: "+LCase$(TipoDiEvento$)
 Window #FinestraCambioEventoBase,4,YPosF,4+24*9+4,YLunF,TipoFinestra,TitoloFinestra$,-1,-1
 LarghezzaInternaFinestraCambioEventoBase.w=InnerWidth
 AltezzaInternaFinestraCambioEventoBase.w=InnerHeight
 CloseWindow #FinestraCambioEventoBase
 XLunSlider=LarghezzaInternaFinestraCambioEventoBase
 YLunSlider=8
 If TipoDiEvento$<>"Program" AND TipoDiEvento$<>"Tempo"
  ImpostaSlider{1,0,AltezzaInternaFinestraCambioEventoBase-8-8-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
  ImpostaSlider{2,0,AltezzaInternaFinestraCambioEventoBase-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
 Else
  ImpostaSlider{1,0,AltezzaInternaFinestraCambioEventoBase-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
 EndIf
 Window #FinestraCambioEventoBase,4,YPosF,4+24*9+4,YLunF,TipoFinestra,TitoloFinestra$,-1,-1,#ListaGadgetCambioEventoBase
 WindowFont #FonteDiCaratteriTopaz8
; Zona.b=NewZoneTable(#TabellaZoneCambioEventoBase,9)
; If Zona=True Then UseZoneTable #TabellaZoneCambioEventoBase Else Statement Return
; UseZoneTable #TabellaZoneEditoreSequenza
 For Zona.b=0 To 7
  WBlit Zona,24*Zona,0;:SetZone Zona,24*Zona,0,24*Zona+23,15
 Next
 WLocate 24*8+8,4:WColour 1,0:Print "3";:SetZone 8,24*8,0,24*8+23,15
 MostraSlider{1,(LarghezzaEventoDiBase-2)/2,(192*6-2)/2,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
 If TipoDiEvento$<>"Program" AND TipoDiEvento$<>"Tempo"
  MostraSlider{2,ValoreEventoDiBase,127,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
 EndIf
 NuovaLarghezzaEventoDiBase.w=LarghezzaEventoDiBase
 NuovoValoreEventoDiBase.b=ValoreEventoDiBase
 EventoBaseDiModificato.b=False
 Repeat
  ResetTimer
  If SecondoClicDelTopo.b=False
   If TipoDiEvento$="Program" OR TipoDiEvento$="Tempo"
    WLocate 0,AltezzaInternaFinestraCambioEventoBase-8-8
   Else
    WLocate 0,AltezzaInternaFinestraCambioEventoBase-8-8-8-8
   EndIf
   If NuovaLarghezzaEventoDiBase MOD 6=0
    If ColoriOriginali=True Then WColour 3,2 Else WColour 10,9
   Else
    WColour 2,1
   EndIf
   Format "0000":Print NuovaLarghezzaEventoDiBase:Format "":Print SPACE$(18)+"width"
   If TipoDiEvento$<>"Program" AND TipoDiEvento$<>"Tempo"
    WLocate 0,AltezzaInternaFinestraCambioEventoBase-8-8
    WColour 1,0:Format "000":Print NuovoValoreEventoDiBase:Format ""
    If TipoDiEvento$="Note" Then Valore$="velocity"
    If TipoDiEvento$="Control" Then Valore$="value"
    Print SPACE$(24-Len(Valore$)),Valore$
   EndIf
   SecondoClicDelTopo=True
  EndIf
  EventoFinestraCambioEventoBase.l=WaitEvent
  TempoTrascorso.l=Timer
  Select EventoFinestraCambioEventoBase
  Case #HaiPremutoUnTastoDelTopo
   XTopo.w=WMouseX:YTopo.w=WMouseY:TastoCliccatoDelTopo.b=MButtons
   Select TastoCliccatoDelTopo
   Case 1
    XZonaTopo.b=XTopo/24:YZonaTopo.b=YTopo>=0 AND YTopo<16
    If YZonaTopo=True
     Select XZonaTopo
     Case 0
      NuovaLarghezzaEventoDiBase=192*4:NotaPuntata.w=0:Terzina.b=0
      Speak "You have choosen a whole note width"
     Case 1
      NuovaLarghezzaEventoDiBase=192*2:NotaPuntata=0:Terzina=0
      Speak "You have choosen a half note width"
     Case 2
      NuovaLarghezzaEventoDiBase=192:NotaPuntata=0:Terzina=0
      Speak "You have choosen a quarter note width"
     Case 3
      NuovaLarghezzaEventoDiBase=192/2:NotaPuntata=0:Terzina=0
      Speak "You have choosen an eighth note width"
     Case 4
      NuovaLarghezzaEventoDiBase=192/4:NotaPuntata=0:Terzina=0
      Speak "You have choosen a sixteenth note width"
     Case 5
      NuovaLarghezzaEventoDiBase=192/8:NotaPuntata=0:Terzina=0
      Speak "You have choosen a thirty second note width"
     Case 6
      NuovaLarghezzaEventoDiBase=192/16:NotaPuntata=0:Terzina=0
      Speak "You have choosen a sixty fourth note width"
     Case 7
      If NotaPuntata=0
       NotaPuntata=NuovaLarghezzaEventoDiBase/2
       NuovaLarghezzaEventoDiBase+NotaPuntata
       If Terzina>0
        Terzina=0
        Speak "You have no more a triplet note width, you have choosen a dotted note width"
       Else
        Speak "You have choosen a dotted note width"
       EndIf
      Else
       NuovaLarghezzaEventoDiBase/3*2
       NotaPuntata=0
       Speak "You have no more a dotted note width"
      EndIf
     Case 8
      If Terzina=0 AND NuovaLarghezzaEventoDiBase>5
       Terzina=3:NuovaLarghezzaEventoDiBase/Terzina
       If NotaPuntata>0
        NotaPuntata=0
        Speak "You have no more a dotted note width, you have choosen a triplet note width"
       Else
        Speak "You have choosen a triplet note width"
       EndIf
      Else
       NuovaLarghezzaEventoDiBase*Terzina:Terzina=0
       Speak "You have no more a triplet note width"
      EndIf
     End Select
     If XZonaTopo>=0 AND XZonaTopo<9
MostraSlider{1,(NuovaLarghezzaEventoDiBase-2)/2,(192*6-2)/2,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
      Speak ", that are "+Str$(NuovaLarghezzaEventoDiBase)+" ticks."
     EndIf
    EndIf
    SecondoClicDelTopo=False
   Case 5
    SecondoClicDelTopo=True
   End Select
;  Case #HaiPremutoUnGadget
;   XLunSlider=LarghezzaInternaFinestraCambioEventoBase
;   NuovaLarghezzaEventoDiBase=ValoreSlider{1,(192*6-2)/2,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}*2+2
  Case #HaiRilasciatoUnGadget
   Select GadgetHit
   Case 1
    XLunSlider=LarghezzaInternaFinestraCambioEventoBase
    NuovaLarghezzaEventoDiBase=ValoreSlider{1,(192*6-2)/2,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}*2+2
    NotaPuntata=0:Terzina=0
    Speak "You have choosen a note width of "+Str$(NuovaLarghezzaEventoDiBase)+" ticks."
   Case 2
    XLunSlider=LarghezzaInternaFinestraCambioEventoBase
    NuovoValoreEventoDiBase=ValoreSlider{2,127,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}
    Speak "You have choosen a note velocity of "+Str$(NuovoValoreEventoDiBase)+"."
   End Select
   SecondoClicDelTopo=False
  Case #HaiChiusoLaFinestra
   EsciDalCambioEventoBase=True
  Case #HaiPremutoUnTasto
   TastoPremuto$=LCase$(Inkey$)
   Select TastoPremuto$
   Case TastoEsc$
    EsciDalCambioEventoBase=True
   Case TastoCursoreDestra$
    If NuovaLarghezzaEventoDiBase<192*6-2
     NuovaLarghezzaEventoDiBase+2:NotaPuntata=0:Terzina=0
MostraSlider{1,(NuovaLarghezzaEventoDiBase-2)/2,(192*6-2)/2,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
     If TempoTrascorso>99 Then Speak "You have choosen a note width of "+Str$(NuovaLarghezzaEventoDiBase)+" ticks."
    EndIf
   Case TastoCursoreSinistra$
    If NuovaLarghezzaEventoDiBase>3
     NuovaLarghezzaEventoDiBase-2:NotaPuntata=0:Terzina=0
MostraSlider{1,(NuovaLarghezzaEventoDiBase-2)/2,(192*6-2)/2,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
     If TempoTrascorso>99 Then Speak "You have choosen a note width of "+Str$(NuovaLarghezzaEventoDiBase)+" ticks."
    EndIf
   End Select
   SecondoClicDelTopo=False
  End Select
 Until EsciDalCambioEventoBase=True

 If NuovaLarghezzaEventoDiBase<>LarghezzaEventoDiBase Then EventoDiBaseModificato=True
 If NuovoValoreEventoDiBase<>ValoreEventoDiBase Then EventoDiBaseModificato=True
 LarghezzaEventoDiBase=NuovaLarghezzaEventoDiBase:ValoreEventoDiBase=NuovoValoreEventoDiBase

 If EventoDiBaseModificato=True AND EventiSelezionati>0
  Messaggio$="You have made changes:|"
  Messaggio$="Would you apply these to the selected events?"
  ApplicaINuoviValoriAgliEventiSelezionati.b=EZRequest("AmySequencer message",Messaggio$,"Yes|No")
  If ApplicaINuoviValoriAgliEventiSelezionati=1
   Select TipoDiEvento$
   Case "Note"
    AggiustaInizio.b=EZRequest("AmySequencer message","Quantize notes start?","Yes|No")
    AggiustaDurata.b=EZRequest("AmySequencer message","Quantize notes length?","Yes|No")
    AggiustaValore.b=EZRequest("AmySequencer message","Change notes velocity?","Yes|No")
   Case "Program"
    AggiustaInizio.b=EZRequest("AmySequencer message","Quantize programs start?","Yes|No")
   Case "Control"
    AggiustaInizio.b=EZRequest("AmySequencer message","Quantize controls start?","Yes|No")
    AggiustaValore.b=EZRequest("AmySequencer message","Change controls value?","Yes|No")
   Case "Tempo"
    AggiustaInizio.b=EZRequest("AmySequencer message","Quantize tempo events start?","Yes|No")
   End Select
   ResetList EventoMusicale()
   While NextItem(EventoMusicale())=True
    If EventoMusicale()\Selezionato=True
     Select EventoMusicale()\Tipo
     Case "Note"
      If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoDiBase*LarghezzaEventoDiBase
      If AggiustaDurata=1 Then EventoMusicale()\Durata=LarghezzaEventoDiBase
      If AggiustaValore=1 Then EventoMusicale()\Valore=ValoreEventoDiBase
     Case "Program"
      If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoDiBase
     Case "Control"
      If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoDiBase
      If AggiustaValore=1 Then EventoMusicale()\Valore=ValoreEventoDiBase
     Case "Tempo"
      If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoDiBase
     End Select
    EndIf
   Wend
  EndIf
 EndIf

;*************************************************************
;la seguente linea se attivata da' errore quando non dovrebbe
;the following line if avtivated gives an error when it should not do
;*********************************************************************
; FreeZoneTable(#TabellaZoneCambioEventoBase)

 CloseWindow #FinestraCambioEventoBase
 Use Window #FinestraEditoreSequenza

;***************************************************
;il seguente comando sembra non avere alcun effetto
;the following command seems have no effect
;*******************************************
; UseZoneTable #TabellaZoneEditoreSequenza

End Statement

;---------------------------------------------------------------
;this procedure states the selected by mouse event new position
;questa procedura mostra la nuova posizione dell'evento selezionato col mouse
;-----------------------------------------------------------------------------
Statement MostraNuovaPosizioneEvento{XEvento.l,YEvento.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED LarghezzaEventoDiBase
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED MostraNuovoValore
SHARED ScalaNote
SHARED TipoDiEvento$
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
 X0.w=16+XEvento/ScalaNote-XInizioAreaVisibile
 Select TipoDiEvento$
 Case "Note"
  Y0.w=(127-YInizioAreaVisibile-YEvento)*8
  X1.w=X0+(LarghezzaEventoDiBase-1)/ScalaNote
 Case "Program"
  Y0=AreaVisibileDeiValori*Max((127-YEvento+1),0)/127
  X1=X0+Len("Program000X")*8-1
 Case "Control"
  Y0=AreaVisibileDeiValori*Max((127-YEvento+1),0)/127
  X1=X0+Len("Control000X")*8-1
 Case "Tempo"
  Y0=AreaVisibileDeiValori*Max((127-YEvento+1),0)/127
  X1=X0+Len("Tempo=00/00X")*8-1
 End Select
 Y1.w=Y0+7
 X0=Min(Max(X0,16),LarghezzaInternaFinestraEditoreSequenza-1)
 Y0=Min(Max(Y0,0),AltezzaInternaFinestraEditoreSequenza-1-8-8-7)
 X1=Min(Max(X1,16),LarghezzaInternaFinestraEditoreSequenza-1)
 Y1=Min(Max(Y1,7),AltezzaInternaFinestraEditoreSequenza-1-8-8)
 WJam #SecondaVoltaStessoColore
 If MostraNuovoValore=True
  WLocate X0,Y0
  Select TipoDiEvento$
  Case "Note"
   Wline X0,Y0,X1,Y0,X1,Y1,X0,Y1,X0,Y0,0
  Case "Program"
   Format "000":Print "Program",Str$(YEvento),"X":Format ""
  Case "Control"
   Format "000":Print "Control",Str$(YEvento),"X":Format ""
  Case "Tempo"
   Format "00":Print "Tempo=",Str$(YEvento MOD 16+1),"/",Str$(YEvento/16+1):Format ""
  End Select
 Else
  Wline X0,Y0,X1,Y0,X1,Y1,X0,Y1,X0,Y0,0
 EndIf
 WJam #DueColoriConSfondoPieno
End Statement

;---------------------------------------------------------------------------
;questa procedura permette di spostare le nota selezionate cliccando con il
; mouse su una di esse
;this procedure permits to move the selected notes clicking on one of these
;---------------------------------------------------------------------------
Statement MuoviGliEventiSelezionatiConIlTopo{XPosizioneEvento.l,YPosizioneEvento.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED Battiti
SHARED CanaleSelezionato
SHARED DurataSequenza
SHARED EventoMusicale()
SHARED EventoMusicaleSpostatoConIlTopo
SHARED LarghezzaEventoDiBase
SHARED Misure
SHARED MostraNuovoValore
SHARED ScalaNote
SHARED SequenzaSelezionata
SHARED XInizioAreaVisibile
SHARED XPosizioneNota
SHARED YInizioAreaVisibile
SHARED YPosizioneNota
 PrimoSpostamento.b=True
 Repeat
  NuovaXTopo.w=WMouseX:NuovaYTopo.w=WMouseY
  TastoPremutoDelTopo=Joyb(0)
  TipoDiEvento$=EventoMusicale()\Tipo
  InizioEvento.l=EventoMusicale()\Inizio
  CanaleEvento.b=EventoMusicale()\Canale
  Select TipoDiEvento$
  Case "Note"
   XNuovaPosizioneNota.l=((XInizioAreaVisibile+NuovaXTopo-16)*ScalaNote)/LarghezzaEventoDiBase*LarghezzaEventoDiBase
   YNuovaPosizioneNota.b=127-YInizioAreaVisibile-NuovaYTopo/8
   If XNuovaPosizioneNota<>XPosizioneEvento
    IncrementoXEventoMusicale.l=XNuovaPosizioneNota-XPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoXEventoMusicale=0
   EndIf
   If YNuovaPosizioneNota<>YPosizioneEvento
    IncrementoYEventoMusicale.b=YNuovaPosizioneNota-YPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoYEventoMusicale=0
   EndIf
   If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
    EventoMusicaleSpostatoConIlTopo=False
   Else
    Messaggio$="Note>"+Str$(IncrementoYEventoMusicale)
   EndIf
  Case "Program"
   XNuovaPosizioneProgramma.l=((XInizioAreaVisibile+NuovaXTopo-16)*ScalaNote)/LarghezzaEventoDiBase*LarghezzaEventoDiBase
   YNuovaPosizioneProgramma.b=127-NuovaYTopo*127/AreaVisibileDeiValori
   If YNuovaPosizioneProgramma<0
    If NuovaYTopo<0 Then YNuovaPosizioneProgramma=127
    If NuovaYTopo>AreaVisibileDeiValori Then YNuovaPosizioneProgramma=0
   EndIf
   If XNuovaPosizioneProgramma<>XPosizioneEvento
    IncrementoXEventoMusicale=XNuovaPosizioneProgramma-XPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoXEventoMusicale=0
   EndIf
   If YNuovaPosizioneProgramma<>YPosizioneEvento
    IncrementoYEventoMusicale=YNuovaPosizioneProgramma-YPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoYEventoMusicale=0
   EndIf
   If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
    EventoMusicaleSpostatoConIlTopo=False
   Else
    Messaggio$="Program>"+Str$(IncrementoYEventoMusicale)
   EndIf
  Case "Control"
   XNuovaPosizioneControllo.l=((XInizioAreaVisibile+NuovaXTopo-16)*ScalaNote)/LarghezzaEventoDiBase*LarghezzaEventoDiBase
   YNuovaPosizioneControllo.b=127-NuovaYTopo*127/AreaVisibileDeiValori
   If YNuovaPosizioneControllo<0
    If NuovaYTopo<0 Then YNuovaPosizioneControllo=127
    If NuovaYTopo>AreaVisibileDeiValori Then YNuovaPosizioneControllo=0
   EndIf
   If XNuovaPosizioneControllo<>XPosizioneEvento
    IncrementoXEventoMusicale=XNuovaPosizioneControllo-XPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoXEventoMusicale=0
   EndIf
   If YNuovaPosizioneControllo<>YPosizioneEvento
    IncrementoYEventoMusicale=YNuovaPosizioneControllo-YPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoYEventoMusicale=0
   EndIf
   If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
    EventoMusicaleSpostatoConIlTopo=False
   Else
    Messaggio$="Control>"+Str$(IncrementoYEventoMusicale)
   EndIf
  Case "Tempo"
   XNuovaPosizioneTempo.l=((XInizioAreaVisibile+NuovaXTopo-16)*ScalaNote)/LarghezzaEventoDiBase*LarghezzaEventoDiBase
   YNuovaPosizioneTempo.b=127-NuovaYTopo*127/AreaVisibileDeiValori
   If YNuovaPosizioneTempo<0
    If NuovaYTopo<0 Then YNuovaPosizioneTempo=127
    If NuovaYTopo>AreaVisibileDeiValori Then YNuovaPosizioneTempo=0
   EndIf
   If XNuovaPosizioneTempo<>XPosizioneEvento
    IncrementoXEventoMusicale=XNuovaPosizioneTempo-XPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoXEventoMusicale=0
   EndIf
   If YNuovaPosizioneTempo<>YPosizioneEvento
    IncrementoYEventoMusicale=YNuovaPosizioneTempo-YPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoYEventoMusicale=0
   EndIf
   If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
    EventoMusicaleSpostatoConIlTopo=False
   Else
    NuoviBattiti.b=IncrementoYEventoMusicale MOD 16
    NuoveMisure.b=Abs(IncrementoYEventoMusicale/16)
    Messaggio$="Tempo=":If Sgn(IncrementoYEventoMusicale)=-1 Then Messaggio$+"-"
    Messaggio$+Str$(NuoviBattiti)+"/"+Str$(NuoveMisure)
   EndIf
  End Select
  Select TipoDiEvento$
  Case "Note"
   NuovaXEvento.l=XNuovaPosizioneNota:NuovaYEvento.b=YNuovaPosizioneNota
  Case "Program"
   NuovaXEvento=XNuovaPosizioneProgramma:NuovaYEvento=YNuovaPosizioneProgramma
  Case "Control"
   NuovaXEvento=XNuovaPosizioneControllo:NuovaYEvento=YNuovaPosizioneControllo
  Case "Tempo"
   NuovaXEvento=XNuovaPosizioneTempo:NuovaYEvento=YNuovaPosizioneTempo
  End Select
  MostraNuovaPosizioneEvento{NuovaXEvento,NuovaYEvento}
  If EventoMusicaleSpostatoConIlTopo=False
   Messaggio$="No change made"
  EndIf
  XMessaggio.w=16*16+8*3+8*4+8*6
  YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
  WLocate XMessaggio,YMessaggio
  Print SPACE$(80-XMessaggio/8)
  WLocate XMessaggio,YMessaggio
  WColour CanaleSelezionato-1,16-CanaleSelezionato
  Print Messaggio$
  If EventoMusicaleSpostatoConIlTopo=True
   Print " pos>":ConvertiIlTempoInBattute{IncrementoXEventoMusicale,Battiti,Misure,False}
  EndIf
  VWait
  MostraNuovaPosizioneEvento{NuovaXEvento,NuovaYEvento}
 Until TastoPremutoDelTopo<>#TastoSinistroDelTopoPremuto
 If EventoMusicaleSpostatoConIlTopo=True
  PushItem EventoMusicale()
  ResetList EventoMusicale()
  While NextItem(EventoMusicale())=True
   If EventoMusicale()\Sequenza=SequenzaSelezionata
    If EventoMusicale()\Tipo=TipoDiEvento$ AND EventoMusicale()\Selezionato=True
     EventoMusicale()\Evento+IncrementoYEventoMusicale
     EventoMusicale()\Evento=Min(Max(EventoMusicale()\Evento,0),127)
     EventoMusicale()\Inizio+IncrementoXEventoMusicale
     If EventoMusicale()\Inizio<0 Then EventoMusicale()\Inizio=0
     DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+EventoMusicale()\Durata)
    EndIf
   EndIf
  Wend
  PopItem EventoMusicale()
 EndIf
End Statement

;----------------------------------------
;questa procedura suona la nota corrente
;this procedure plays the current note
;--------------------------------------
Statement SuonaLaNota{Nota.b,VelocitaNota.b,CanaleNota.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED EventoMusicale()
SHARED MIDIAttivato
SHARED NoteSuonate
SHARED PeriFreq()
SHARED Suono()
SHARED VoceSpenta
 For Suono.b=0 To 31
  If Suono(Suono)\Canale=CanaleNota Then Pop For:Goto FineCicloForEsecutoreNote
 Next Suono
FineCicloForEsecutoreNote
 If Suono<32
  If Suono(Suono)\Canale>0
   Periodo.l=PeriFreq(Nota)\Periodo
   If Periodo>=#PeriodoMinimo AND Periodo<65536
    If VoceSpenta>0
     If VoceSpenta BitTst 0=True Then Voce.b=1:VoceSpenta BitClr 0:Goto SuonaCampione
     If VoceSpenta BitTst 1=True Then Voce=2:VoceSpenta BitClr 1:Goto SuonaCampione
     If VoceSpenta BitTst 2=True Then Voce=4:VoceSpenta BitClr 2:Goto SuonaCampione
     If VoceSpenta BitTst 3=True Then Voce=8:VoceSPenta BitClr 3
    EndIf
SuonaCampione
    SetPeriod Suono,Periodo:Sound Suono,Voce
    EventoMusicale()\VoceUsata=Voce
    Messaggio$="Note>"+Str$(Nota)+" frequency>"+Str$(PeriFreq(Nota)\Frequenza)
   EndIf
  EndIf
 Else
  If MIDIAttivato=True
   ByteDiStatoMIDI.b=#_NoteOn+(CanaleNota-1)
   WriteSerial 0,ByteDiStatoMIDI
   WriteSerial 0,Nota
   WriteSerial 0,VelocitaNota
   Messaggio$="Note>"+Str$(Nota)+" vel>"+Str$(VelocitaNota)
   NoteSuonate+1
  EndIf
 EndIf
 If Modo=#EseguiGliEventiDallEditoreSequenza
  XMessaggio.w=16*16+8*3+8*4+8*6
  YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
  Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
  WLocate XMessaggio,YMessaggio
  WColour CanaleNota-1,16-CanaleNota
  Print Messaggio$
 EndIf
End Statement

;-----------------------------------------------
;questa procedura esegue il cambio di programma
;this procedure execute the program change
;------------------------------------------
Statement EseguiIlCambioDiProgramma{Programma,CanaleProgramma.b,Modo.b}
SHARED MIDIAttivato
 If MIDIAttivato=True
  ByteDiStatoMIDI.b=#_ProgramChange+(CanaleProgramma-1)
  WriteSerial 0,ByteDiStatoMIDI
  WriteSerial 0,Programma
 EndIf
 If Modo=#EseguiGliEventiDallEditoreSequenza
  XMessaggio.w=16*16+8*3+8*4+8*6
  YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
  Messaggio$="Program>"+Str$(Programma)
  Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
  WLocate XMessaggio,YMessaggio
  WColour CanaleProgramma-1,16-CanaleProgramma
  Print Messaggio$
 EndIf
End Statement

;-----------------------------------------------
;questa procedura esegue il cambio di controllo
;this procedure execute the control change
;------------------------------------------
Statement EseguiIlCambioDiControllo{Controllo,ValoreControllo,CanaleControllo.b,Modo.b}
 If MIDIAttivato=True
  ByteDiStatoMIDI.b=#_ControlChange+(CanaleControllo-1)
  WriteSerial 0,ByteDiStatoMIDI
  WriteSerial 0,Controllo
  WriteSerial 0,ValoreControllo
 EndIf
 If Modo=#EseguiGliEventiDallEditoreSequenza
  XMessaggio.w=16*16+8*3+8*4+8*6
  YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
  Messaggio$="Control>"+Str$(Controllo)+" val>"+Str$(ValoreControllo)
  Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
  WLocate XMessaggio,YMessaggio
  WColour CanaleControllo-1,16-CanaleControllo
  Print Messaggio$
 EndIf
End Statement

;-----------------------------------------------------
;questa procedura interrompe la nota suonata corrente
;this procedure stops the current played note
;---------------------------------------------
Statement SmettiDiSuonareLaNota{Nota.b,VelocitaNota.b,CanaleNota.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED EventoMusicale()
SHARED MIDIAttivato
SHARED NoteSuonate
SHARED VoceSpenta
 VoceUsata.b=EventoMusicale()\VoceUsata
 If VoceUsata>0
  Quiet VoceUsata
  VoceSpenta OR VoceUsata
 Else
  If MIDIAttivato=True
   ByteDiStatoMIDI=#_NoteOff+(CanaleNota-1)
   WriteSerial 0,ByteDiStatoMIDI
   WriteSerial 0,Nota
   WriteSerial 0,VelocitaNota
   NoteSuonate-1
  EndIf
 EndIf
End Statement

;----------------------------------------------------------
;questa procedura interrompe l'esecuzione di tutte le note
;this procedure stops all notes execution
;-----------------------------------------
Statement InterrompiTutteLeNote{Modo.b}
 WriteSerial 0,#_AllNotesOff
 If Modo=#EseguiGliEventiDallEditoreSequenza
  XMessaggio.w=16*16+8*3+8*4+8*6
  YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
  Messaggio$="AllNotesOff"
  Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
  WLocate XMessaggio,YMessaggio
  WColour 3,2
  Print Messaggio$
 EndIf
End Statement

;----------------------------------------------------------------------
;questa procedura imposta il menu della finestra dell'editore sequenza
;this procedure sets the sequence editor window menu
;----------------------------------------------------
Statement ImpostaMenuFinestraEditoreSequenza{}
SHARED MostraNuovoValore
SHARED TipoDiEvento$

 Free MenuList #ListaMenuEditoreSequenza

 MenuTitle #ListaMenuEditoreSequenza,0,"Controls"
 MenuItem #ListaMenuEditoreSequenza,0,0,0,"Play"

 MenuTitle #ListaMenuEditoreSequenza,1,"Event type"
 Select TipoDiEvento$
 Case "Note"
  MenuItem #ListaMenuEditoreSequenza,4,1,0,"  Note"
  MenuItem #ListaMenuEditoreSequenza,2,1,1,"  Program"
  MenuItem #ListaMenuEditoreSequenza,2,1,2,"  Control"
  MenuItem #ListaMenuEditoreSequenza,2,1,3,"  Tempo"
 Case "Program"
  MenuItem #ListaMenuEditoreSequenza,2,1,0,"  Note"
  MenuItem #ListaMenuEditoreSequenza,4,1,1,"  Program"
  MenuItem #ListaMenuEditoreSequenza,2,1,2,"  Control"
  MenuItem #ListaMenuEditoreSequenza,2,1,3,"  Tempo"
 Case "Control"
  MenuItem #ListaMenuEditoreSequenza,2,1,0,"  Note"
  MenuItem #ListaMenuEditoreSequenza,2,1,1,"  Program"
  MenuItem #ListaMenuEditoreSequenza,4,1,2,"  Control"
  MenuItem #ListaMenuEditoreSequenza,2,1,3,"  Tempo"
 Case "Tempo"
  MenuItem #ListaMenuEditoreSequenza,2,1,0,"  Note"
  MenuItem #ListaMenuEditoreSequenza,2,1,1,"  Program"
  MenuItem #ListaMenuEditoreSequenza,2,1,2,"  Control"
  MenuItem #ListaMenuEditoreSequenza,4,1,3,"  Tempo"
 End Select

 MenuTitle #ListaMenuEditoreSequenza,2,"Settings"
 MenuItem #ListaMenuEditoreSequenza,0,2,0,"Basic event"
 If MostraNuovoValore=True
  MenuItem #ListaMenuEditoreSequenza,3,2,1,"  Show dragged event value"
 Else
  MenuItem #ListaMenuEditoreSequenza,1,2,1,"  Show dragged event value"
 EndIf

 MenuTitle #ListaMenuEditoreSequenza,3,"Help"
 MenuItem #ListaMenuEditoreSequenza,0,3,0,"Keys to use"
 MenuItem #ListaMenuEditoreSequenza,0,3,1,"Notes on keys"

;-------------------------------
;attacca il menu' alla finestra
;attaches menu to window
;------------------------
 SetMenu #ListaMenuEditoreSequenza

End Statement

;----------------------------------------------
;questa procedura modifica gli eventi musicali
;this procedure modifies the musical events
;-------------------------------------------
Statement Selezione{Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED Battiti
SHARED CanaleSelezionato
SHARED ColoriOriginali
SHARED DurataSequenza
SHARED Eventi
SHARED EventiSelezionati
SHARED EventoMusicale()
SHARED EventoMusicaleSpostatoConIlTopo
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED LarghezzaEventoDiBase
SHARED MIDIAttivato
SHARED Misure
SHARED NotaSuonata
SHARED PeriFreq()
SHARED ScalaNote
SHARED SequenzaSelezionata
SHARED Suono()
SHARED TipoDiEvento$
SHARED ValoreEventoDiBase
SHARED XInizioAreaVisibile
SHARED XPosizioneNota
SHARED XTopo
SHARED YInizioAreaVisibile
SHARED YPosizioneNota
SHARED YTopo
 ResetList EventoMusicale()
 StessoEvento.b=%00000
 XTopo=Min(Max(XTopo,16),LarghezzaInternaFinestraEditoreSequenza-1)
 While NextItem(EventoMusicale())=True
  StessoEvento=%00000
  TipoDiEventoSelezionato$=EventoMusicale()\Tipo
  InizioEvento.l=EventoMusicale()\Inizio
  CanaleEvento.b=EventoMusicale()\Canale
  SequenzaEvento.w=EventoMusicale()\Sequenza
  EventoSelezionato.b=EventoMusicale()\Selezionato
  If Modo=#SelezionaUnEvento
   Select TipoDiEventoSelezionato$
   Case "Note"
    YTopo=Min(Max(YTopo,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
    Nota.b=EventoMusicale()\Evento
    DurataNota.l=EventoMusicale()\Durata
    FineNota.l=InizioEvento+DurataNota-1
    VelocitaNota.b=EventoMusicale()\Valore
    XPosizioneNota=((XInizioAreaVisibile+XTopo-16)*ScalaNote)/LarghezzaEventoDiBase*LarghezzaEventoDiBase
    YPosizioneNota=127-YInizioAreaVisibile-YTopo/8
    If XPosizioneNota>=InizioEvento Then StessoEvento OR %00001
    If XPosizioneNota<=FineNota Then StessoEvento OR %00010
    If YPosizioneNota=Nota Then StessoEvento OR %00100
    If SequenzaEvento=SequenzaSelezionata Then StessoEvento OR %01000
    If StessoEvento=%01111
     If CanaleSelezionato<>CanaleEvento
      AggiungiEvento.b=EZRequest("AmySequencer message","Would you add a new note|with the current channel?","Yes|No")
      If AggiungiEvento=0
       Format "00"
       WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
       If ColoriOriginali=True
        WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
       Else
        WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2:Print Str$(CanaleSelezionato)
       EndIf
       CanaleSelezionato=CanaleEvento
       WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
       WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
       Format ""
       StessoEvento OR %10000
      EndIf
     Else
      TipoDiEvento$=TipoDiEventoSelezionato$
      ImpostaMenuFinestraEditoreSequenza{}
      StessoEvento OR %10000
     EndIf
     If EventoSelezionato=True
      MuoviGliEventiSelezionatiConIlTopo{XPosizioneNota,YPosizioneNota}
      If EventoMusicaleSpostatoConIlTopo=False
       EventiSelezionati-1
       EventoMusicale()\Selezionato=False
      Else
       Nota=EventoMusicale()\Evento
       InizioNota=EventoMusicale()\Inizio
      EndIf
     Else
      NotaPiuLunga.l=DurataNota
      EventiSelezionati+1
      EventoMusicale()\Selezionato=True
     EndIf
     If NotaSuonata\Eseguito=True
      SmettiDiSuonareLaNota{NotaSuonata\Evento,NotaSuonata\Valore,NotaSuonata\Canale,#EseguiGliEventiDallEditoreSequenza}
     EndIf
     SuonaLaNota{NotaSuonata\Evento,NotaSuonata\Valore,NotaSuonata\Canale,#EseguiGliEventiDallEditoreSequenza}
     NotaSuonata\Evento=Nota,InizioNota,CanaleEvento
     NotaSuonata\Durata=DurataNota,VelocitaNota
     NotaSuonata\Eseguito=True
     Pop While:Goto FineCicloWhile
    EndIf
   Case "Program"
    YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
    Programma.b=EventoMusicale()\Evento
    LunghezzaEvento.w=Len("Program000")*8
    If EventoSelezionato=True Then LunghezzaEvento+Len("X")*8
    FineProgramma.w=InizioEvento+LunghezzaEvento-1
    XPosizioneProgramma.w=((XInizioAreaVisibile+XTopo-16)*ScalaNote)/LarghezzaEventoDiBase*LarghezzaEventoDiBase
    YPosizioneProgramma.b=127-YTopo*127/AreaVisibileDeiValori
    If XPosizioneProgramma>=InizioEvento Then StessoEvento OR %00001
    If XPosizioneProgramma<FineProgramma Then StessoEvento OR %00010
    If YPosizioneProgramma=Programma Then StessoEvento OR %00100
    If SequenzaEvento=SequenzaSelezionata Then StessoEvento OR %01000
    If StessoEvento=%01111
     If CanaleSelezionato<>CanaleEvento
      AggiungiEvento.b=EZRequest("AmySequencer message","Would you add a new program|with the current channel?","Yes|No")
      If AggiungiEvento=0
       Format "00"
       WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
       If ColoriOriginali=True
        WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
       Else
        WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2:Print Str$(CanaleSelezionato)
       EndIf
       CanaleSelezionato=CanaleEvento
       WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
       WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
       Format ""
       StessoEvento OR %10000
      EndIf
     Else
      TipoDiEvento$=TipoDiEventoSelezionato$
      ImpostaMenuFinestraEditoreSequenza{}
      StessoEvento OR %10000
     EndIf
     If EventoSelezionato=True
      MuoviGliEventiSelezionatiConIlTopo{XPosizioneProgramma,YPosizioneProgramma}
      If EventoMusicaleSpostatoConIlTopo=False
       EventiSelezionati-1
       EventoMusicale()\Selezionato=False
      EndIf
     Else
      EventiSelezionati+1
      EventoMusicale()\Selezionato=True
     EndIf
     Pop While:Goto FineCicloWhile
    EndIf
   Case "Control"
    YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
    Controllo.b=EventoMusicale()\Evento
    LunghezzaEvento.w=Len("Control000")*8
    If EventoSelezionato=True Then LunghezzaEvento+Len("X")*8
    FineControllo.w=InizioEvento+LunghezzaEvento-1
    XPosizioneControllo.w=((XInizioAreaVisibile+XTopo-16)*ScalaNote)/LarghezzaEventoDiBase*LarghezzaEventoDiBase
    YPosizioneControllo.b=127-YTopo*127/AreaVisibileDeiValori
    If XPosizioneControllo>=InizioEvento Then StessoEvento OR %00001
    If XPosizioneControllo<FineControllo Then StessoEvento OR %00010
    If YPosizioneControllo=Controllo Then StessoEvento OR %00100
    If SequenzaEvento=SequenzaSelezionata Then StessoEvento OR %01000
    If StessoEvento=%01111
     If CanaleSelezionato<>CanaleEvento
      AggiungiEvento.b=EZRequest("AmySequencer message","Would you add a new control|with the current channel?","Yes|No")
      If AggiungiEvento=0
       Format "00"
       WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
       If ColoriOriginali=True
        WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
       Else
        WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2:Print Str$(CanaleSelezionato)
       EndIf
       CanaleSelezionato=CanaleEvento
       WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
       WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
       Format ""
       StessoEvento OR %10000
      EndIf
     Else
      TipoDiEvento$=TipoDiEventoSelezionato$
      ImpostaMenuFinestraEditoreSequenza{}
      StessoEvento OR %10000
     EndIf
     If EventoSelezionato=True
      MuoviGliEventiSelezionatiConIlTopo{XPosizioneControllo,YPosizioneControllo}
      If EventoMusicaleSpostatoConIlTopo=False
       EventiSelezionati-1
       EventoMusicale()\Selezionato=False
      EndIf
     Else
      EventiSelezionati+1
      EventoMusicale()\Selezionato=True
     EndIf
     Pop While:Goto FineCicloWhile
    EndIf
   Case "Tempo"
    YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
    Tempo.b=EventoMusicale()\Evento
    LunghezzaEvento.w=Len("Tempo=00/00")*8
    If EventoSelezionato=True Then LunghezzaEvento+Len("X")*8
    FineTempo.w=InizioEvento+LunghezzaEvento-1
    XPosizioneTempo.w=((XInizioAreaVisibile+XTopo-16)*ScalaNote)/LarghezzaEventoDiBase*LarghezzaEventoDiBase
    YPosizioneTempo.b=127-YTopo*127/AreaVisibileDeiValori
    If XPosizioneTempo>=InizioEvento Then StessoEvento OR %00001
    If XPosizioneTempo<FineTempo Then StessoEvento OR %00010
    If YPosizioneTempo=Tempo Then StessoEvento OR %00100
    If SequenzaEvento=SequenzaSelezionata Then StessoEvento OR %01000
    If StessoEvento=%01111
     If CanaleSelezionato<>CanaleEvento
      AggiungiEvento.b=EZRequest("AmySequencer message","Would you add a new tempo|with the current channel?","Yes|No")
      If AggiungiEvento=0
       Format "00"
       WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
       If ColoriOriginali=True
        WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
       Else
        WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2:Print Str$(CanaleSelezionato)
       EndIf
       CanaleSelezionato=CanaleEvento
       WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
       WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
       Format ""
       StessoEvento OR %10000
      EndIf
     Else
      TipoDiEvento$=TipoDiEventoSelezionato$
      ImpostaMenuFinestraEditoreSequenza{}
      StessoEvento OR %10000
     EndIf
     If EventoSelezionato=True
      MuoviGliEventiSelezionatiConIlTopo{XPosizioneTempo,YPosizioneTempo}
      If EventoMusicaleSpostatoConIlTopo=False
       EventiSelezionati-1
       EventoMusicale()\Selezionato=False
      EndIf
     Else
      EventiSelezionati+1
      EventoMusicale()\Selezionato=True
     EndIf
     Pop While:Goto FineCicloWhile
    EndIf
   End Select
  Else
   If EventoMusicale()\Sequenza=SequenzaSelezionata
    If EventoSelezionato=True
     Select Modo
     Case #CambiaIlCanaleDegliEventiSelezionati
      EventoMusicale()\Canale=CanaleSelezionato
     Case #AlzaDiUnoGliEventiSelezionati
      If EventoMusicale()\Evento<127 Then EventoMusicale()\Evento+1
     Case #AbbassaDiUnoGliEventiSelezionati
      If EventoMusicale()\Evento>0 Then EventoMusicale()\Evento-1
     Case #SpostaAvantiNelTempoGliEventiSelezionati
      EventoMusicale()\Inizio+LarghezzaEventoDiBase
      DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+EventoMusicale()\Durata)
     Case #SpostaIndietroNelTempoGliEventiSelezionati
      EventoMusicale()\Inizio-LarghezzaEventoDiBase:If EventoMusicale()\Inizio<0 Then EventoMusicale()\Inizio=0
     Case #EliminaGliEventiSelezionati
      If Eventi>0
       If EventoMusicale()\Selezionato=True Then EventiSelezionati-1
       If InizioEvento+EventoMusicale()\Durata>=DurataSequenza Then DurataSequenza-EventoMusicale()\Durata
       XInizioAreaVisibile-EventoMusicale()\Durata
       XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
       KillItem EventoMusicale():Eventi-1
       If Eventi=0 Then DurataSequenza=0
      EndIf
     Case #DeselezionaTuttiGliEventi
      EventiSelezionati-1
      EventoMusicale()\Selezionato=False
     Case #InvertiLaSelezioneDiTuttiGliEventi
      EventiSelezionati-1
      EventoMusicale()\Selezionato=False
     End Select
     Select TipoDiEventoSelezionato$
     Case "Note"
      Select Modo
      Case #AllungaLaDurataDelleNoteSelezionate
       If EventoMusicale()\Durata=#_MClksPerSP
        EventoMusicale()\Durata=LarghezzaEventoDiBase
       Else
        EventoMusicale()\Durata+LarghezzaEventoDiBase
       EndIf
       NotaPiuLunga=Max(NotaPiuLunga,EventoMusicale()\Durata)
       DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+EventoMusicale()\Durata)
      Case #RiduciLaDurataDelleNoteSelezionate
       EventoMusicale()\Durata-LarghezzaEventoDiBase
       EventoMusicale()\Durata=Max(EventoMusicale()\Durata,#_MClksPerSP)
       NotaPiuLunga=Max(EventoMusicale()\Durata,NotaPiuLunga)
      Case #AlzaDiUnOttavaLeNoteSelezionate
       EventoMusicale()\Evento+12
       EventoMusicale()\Evento=Min(EventoMusicale()\Evento,127)
      Case #AbbassaDiUnOttavaLeNoteSelezionate
       EventoMusicale()\Evento-12
       EventoMusicale()\Evento=Max(EventoMusicale()\Evento,0)
      Case #CambiaIlValoreDegliEventiSelezionati
       EventoMusicale()\Valore=ValoreEventoDiBase
      End Select
     Case "Tempo"
      NuoviBattiti.b=EventoMusicale()\Evento MOD 16
      NuoveMisure.b=EventoMusicale()\Evento/16
      Select Modo
      Case #AggiungiUnBattitoAlTempoSelezionato
       NuoviBattiti+1
       NuoviBattiti=Min(NuoviBattiti,15)
      Case #TogliUnBattitoAlTempoSelezionato
       NuoviBattiti-1
       NuoviBattiti=Max(NuoviBattiti,0)
      Case #AggiungiUnaMisuraAlTempoSelezionato
       NuoveMisure+1
       NuoveMisure=Min(NuoveMisure,7)
      Case #TogliUnaMisuraAlTempoSelezionato
       NuoveMisure-1
       NuoveMisure=Max(NuoveMisure,0)
      End Select
      EventoMusicale()\Evento=NuoveMisure*16+NuoviBattiti
     Default
      Select Modo
      Case #AggiungiDieciAgliEventiSelezionati
       EventoMusicale()\Evento+10
       EventoMusicale()\Evento=Min(EventoMusicale()\Evento,127)
      Case #SottraiDieciAgliEventiSelezionati
       EventoMusicale()\Evento-10
       EventoMusicale()\Evento=Max(EventoMusicale()\Evento,0)
      End Select
     End Select
    Else
     Select Modo
     Case #SelezionaTuttiGliEventi
      EventiSelezionati+1
      EventoMusicale()\Selezionato=True
     Case #InvertiLaSelezioneDiTuttiGliEventi
      EventiSelezionati+1
      EventoMusicale()\Selezionato=True
     End Select
    EndIf
   EndIf
  EndIf
 Wend
FineCicloWhile
 If Modo=#SelezionaUnEvento AND StessoEvento<%11111
  If CanaleSelezionato>0
   LastItem EventoMusicale()
   If AddItem(EventoMusicale())=True
    Eventi+1
    EventoMusicale()\Inizio=((XInizioAreaVisibile+XTopo-16)*ScalaNote)/LarghezzaEventoDiBase*LarghezzaEventoDiBase
    EventoMusicale()\Canale=CanaleSelezionato
    EventoMusicale()\Sequenza=SequenzaSelezionata
    EventoMusicale()\Selezionato=False
    EventoMusicale()\Tipo=TipoDiEvento$
    Select TipoDiEvento$
    Case "Note"
     YTopo=Min(Max(YTopo,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
     EventoMusicale()\Evento=127-YInizioAreaVisibile-YTopo/8
     EventoMusicale()\Durata=LarghezzaEventoDiBase
     EventoMusicale()\Valore=ValoreEventoDiBase
     If NotaSuonata\Eseguito=True
      SmettiDiSuonareLaNota{NotaSuonata\Evento,NotaSuonata\Valore,NotaSuonata\Canale,#EseguiGliEventiDallEditoreSequenza}
     EndIf
     NotaSuonata\Evento=EventoMusicale()\Evento,EventoMusicale()\Inizio,EventoMusicale()\Canale,EventoMusicale()\Sequenza
     NotaSuonata\Durata=EventoMusicale()\Durata,EventoMusicale()\Valore
     SuonaLaNota{NotaSuonata\Evento,NotaSuonata\Valore,NotaSuonata\Canale,#EseguiGliEventiDallEditoreSequenza}
     NotaSuonata\Eseguito=True
    Case "Program"
     YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
     EventoMusicale()\Evento=127-YTopo*127/AreaVisibileDeiValori
     EventoMusicale()\Durata=2
    Case "Control"
     YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
     EventoMusicale()\Evento=127-YTopo*127/AreaVisibileDeiValori
     EventoMusicale()\Durata=2
     EventoMusicale()\Valore=ValoreEventoDiBase
    Case "Tempo"
     YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
     EventoMusicale()\Evento=127-YTopo*127/AreaVisibileDeiValori
     EventoMusicale()\Durata=2
    End Select
    DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+EventoMusicale()\Durata)
   Else
    EZRequest "AmySequencer message","You have used all the available events","OK"
   EndIf
  Else
   EZRequest "AmySequencer message","You must select a channel first","OK"
  EndIf
 EndIf
 If Modo=#SelezionaGliEventiUguali
  ResetList EventoMusicale()
  Nota=127-YInizioAreaVisibile-YTopo/8
  While NextItem(EventoMusicale())=True
   If  EventoMusicale()\Canale=CanaleSelezionato AND EventoMusicale()\Sequenza=SequenzaSelezionata
    If EventoMusicale()\Selezionato=False
     Select TipoDiEvento$
     Case "Note"
      If EventoMusicale()\Evento=Nota
       EventiSelezionati+1
       EventoMusicale()\Selezionato=True
      EndIf
     Case "Program"
      If EventoMusicale()\Evento=Programma
       EventiSelezionati+1
       EventoMusicale()\Selezionato=True
      EndIf
     Case "Control"
      If EventoMusicale()\Evento=Controllo
       EventiSelezionati+1
       EventoMusicale()\Selezionato=True
      EndIf
     Case "Tempo"
      If EventoMusicale()\Evento=Tempo
       EventiSelezionati+1
       EventoMusicale()\Selezionato=True
      EndIf
     End Select
    EndIf
   EndIf
  Wend
 EndIf
 If NotaPiuLunga>0
  XMessaggio.w=16*16+8*3+8*4+8*6
  YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
  WLocate XMessaggio,YMessaggio
  WColour 1,0
  Print SPACE$(80-XMessaggio/8)
  WLocate XMessaggio,YMessaggio
  Print "Len>":ConvertiIlTempoInBattute{NotaPiuLunga,Battiti,Misure,True}
 EndIf
End Statement

;-----------------------------------------------
;questa procedura si occupa eseguire gli eventi
;this procedure executes the events
;-----------------------------------
Statement EseguiGliEventi{Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED DurataSequenza
SHARED EventoMusicale()
SHARED FineMotivo
SHARED Sequenza()
SHARED SequenzaSelezionata
SHARED TicPerCinquantesimoDiSecondo
 ResetTimer
 Tempo.l=Timer
 If Modo=#EseguiGliEventiDallaFinestraPrincipale Then FineEsecuzione.l=FineMotivo
 If Modo=#EseguiGliEventiDallEditoreSequenza Then FineEsecuzione=DurataSequenza
 Repeat
  Tempo=Timer*TicPerCinquantesimoDiSecondo
  EventoFinestraEsecutoreEventiMusicali.l=Event
  If EventoFinestraEsecutoreEventiMusicali=#HaiChiusoLaFinestra Then Pop Repeat:Statement Return
  ResetList EventoMusicale()
  While NextItem(EventoMusicale())
   SequenzaEvento.w=EventoMusicale()\Sequenza
   If SequenzaEvento=SequenzaSelezionata OR Modo=#EseguiGliEventiDallaFinestraPrincipale
    If Modo=#EseguiGliEventiDallaFinestraPrincipale
     InizioEvento.l=Sequenza(SequenzaEvento)\Inizio+EventoMusicale()\Inizio
    EndIf
    If Modo=#EseguiGliEventiDallEditoreSequenza
     InizioEvento.l=EventoMusicale()\Inizio
    EndIf
    TipoDiEvento$=EventoMusicale()\Tipo
    DurataEvento.l=EventoMusicale()\Durata
    FineEvento.l=InizioEvento+DurataEvento-1
    CanaleEvento.b=EventoMusicale()\Canale
    EventoEseguito.b=EventoMusicale()\Eseguito
    If EventoEseguito=0 AND Tempo>=InizioEvento
     If TipoDiEvento$="Note"
      Nota.b=EventoMusicale()\Evento
      VelocitaNota.b=EventoMusicale()\Valore
      SuonaLaNota{Nota,VelocitaNota,CanaleEvento,Modo}
      If Modo=#EseguiGliEventiDallEditoreSequenza
       DisegnaUnEventoMusicale{"Note",Nota,InizioEvento,DurataEvento,CanaleEvento,#EventoEvidenziato}
      EndIf
     Else
      Select TipoDiEvento$
      Case "Program"
       Programma.b=EventoMusicale()\Evento
       EseguiIlCambioDiProgramma{Programma,CanaleEvento,Modo}
      Case "Control"
       Controllo.b=EventoMusicale()\Evento:ValoreEvento.b=EventoMusicale()\Valore
       EseguiIlCambioDiControllo{Controllo,ValoreEvento,CanaleEvento,Modo}
      Case "Tempo"
       TempoCambiato.b=EventoMusicale()\Evento
       MostraIlTempo{TempoCambiato,Modo}
      End Select
     EndIf
     EventoMusicale()\Eseguito=1
    EndIf
    If EventoEseguito=1 AND Tempo>=FineEvento
     Nota=EventoMusicale()\Evento
     VelocitaNota=EventoMusicale()\Valore
     EventoSelezionato.b=EventoMusicale()\Selezionato
     If TipoDiEvento$="Note"
      SmettiDiSuonareLaNota{Nota,VelocitaNota,CanaleEvento,Modo}
      If Modo=#EseguiGliEventiDallEditoreSequenza
       If EventoSelezionato=True
        DisegnaUnEventoMusicale{"Note",Nota,InizioEvento,DurataEvento,CanaleEvento,#EventoSelezionato}
       Else
        DisegnaUnEventoMusicale{"Note",Nota,InizioEvento,DurataEvento,CanaleEvento,#EventoNonSelezionato}
       EndIf
      EndIf
     EndIf
     EventoMusicale()\Eseguito=2
    EndIf
   EndIf
  Wend
 Until Tempo>=FineEsecuzione
 ResetList EventoMusicale()
 While NextItem(EventoMusicale())
  If EventoMusicale()\Tipo="Note" AND EventoMusicale()\Eseguito=1
   Nota=EventoMusicale()\Evento
   VelocitaNota=EventoMusicale()\Valore
   CanaleEvento=EventoMusicale()\Canale
   SmettiDiSuonareLaNota{Nota,VelocitaNota,CanaleEvento,0}
  EndIf
  EventoMusicale()\Eseguito=0
 Wend
 Quiet %1111
End Statement

Statement AggiungiUnaNotaDallaTastiera{Nota$}
SHARED AreaInvisibileDelleNote
SHARED CanaleSelezionato
SHARED DurataSequenza
SHARED Eventi
SHARED EventoMusicale()
SHARED LarghezzaEventoDiBase
SHARED NotaSuonata
SHARED OttavaSelezionata
SHARED ScalaNote
SHARED SequenzaSelezionata
SHARED ValoreEventoDiBase
SHARED XInizioAreaVisibile
 Select Nota$
 Case "C1"
  Nota.b=0
 Case "C#1"
  Nota=1
 Case "D1"
  Nota=2
 Case "D#1"
  Nota=3
 Case "E1"
  Nota=4
 Case "F1"
  Nota=5
 Case "F#1"
  Nota=6
 Case "G1"
  Nota=7
 Case "G#1"
  Nota=8
 Case "A1"
  Nota=9
 Case "A#1"
  Nota=10
 Case "B1"
  Nota=11
 Case "C2"
  Nota=12
 Case "C#2"
  Nota=13
 Case "D2"
  Nota=14
 Case "D#2"
  Nota=15
 Case "E2"
  Nota=16
 Case "F2"
  Nota=17
 Case "F#2"
  Nota=18
 Case "G2"
  Nota=19
 Case "G#2"
  Nota=20
 Case "A2"
  Nota=21
 Case "A#2"
  Nota=22
 Case "B2"
  Nota=23
 End Select
 Nota+OttavaSelezionata*12:Nota=Min(Nota,127)
 If CanaleSelezionato>0
  LastItem EventoMusicale()
  If AddItem(EventoMusicale())=True
   Eventi+1
   EventoMusicale()\Tipo="Note"
   EventoMusicale()\Evento=Nota
   EventoMusicale()\Inizio=DurataSequenza/LarghezzaEventoDiBase*LarghezzaEventoDiBase
   EventoMusicale()\Canale=CanaleSelezionato
   EventoMusicale()\Sequenza=SequenzaSelezionata
   EventoMusicale()\Selezionato=False
   EventoMusicale()\Durata=LarghezzaEventoDiBase
   EventoMusicale()\Valore=ValoreEventoDiBase
   If NotaSuonata\Eseguito=True
    Nota.b=NotaSuonata\Evento
    VelocitaNota.b=NotaSuonata\Valore
    CanaleNota.b=NotaSuonata\Canale
    SmettiDiSuonareLaNota{Nota,VelocitaNota,CanaleNota,#EseguiGliEventiDallEditoreSequenza}
   EndIf
   NotaSuonata\Evento=EventoMusicale()\Evento,EventoMusicale()\Inizio,EventoMusicale()\Canale,EventoMusicale()\Sequenza
   NotaSuonata\Durata=EventoMusicale()\Durata,EventoMusicale()\Valore
   SuonaLaNota{NotaSuonata\Evento,NotaSuonata\Valore,NotaSuonata\Canale,#EseguiGliEventiDallEditoreSequenza}
   NotaSuonata\Eseguito=True
   DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+EventoMusicale()\Durata)
 Else
   EZRequest "AmySequencer message","You have used all the available events","OK"
  EndIf
 Else
  EZRequest "AmySequencer message","You must select a channel first","OK"
 EndIf
End Statement

;------------------------------------------------
;questa procedura permette di gestire gli eventi
;this procedure permits to manage events
;----------------------------------------
Statement EditoreSequenza{}
SHARED AltezzaFonte
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AltezzaSchermo
SHARED AreaInvisibileDelleNote
SHARED AreaInvisibileDelTempo
SHARED AreaVisibileDeiValori
SHARED Battiti
SHARED CanaleSelezionato
SHARED ColoriOriginali
SHARED DurataSequenza
SHARED Eventi
SHARED EventiSelezionati
SHARED EventoMusicale()
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED LarghezzaEventoDiBase
SHARED LarghezzaSchermo
SHARED MIDIAttivato
SHARED Misure
SHARED MostraNuovoValore
SHARED NotaSuonata
SHARED NoteSuonate
SHARED OttavaSelezionata
SHARED PeriFreq()
SHARED PrimaVoltaNellEditoreSequenza
SHARED ScalaNote
SHARED Sequenza()
SHARED SequenzaSelezionata
SHARED TastoBackspace$
SHARED TastoCursoreDestra$
SHARED TastoCursoreGiu$
SHARED TastoCursoreSinistra$
SHARED TastoCursoreSu$
SHARED TastoEsc$
SHARED TicPerCinquantesimoDiSecondo
SHARED TipoDiEvento$
SHARED TipoDiNota()
SHARED XInizioAreaVisibile
SHARED XLunSlider
SHARED XTopo
SHARED YInizioAreaVisibile
SHARED YLunSlider
SHARED YTopo

;-----------------------------------------------------------------------
;imposta il colore del testo nei menu' a quello piu' chiaro disponibile
;sets text menu colour to the brightest available
;-------------------------------------------------
 MenuColour 3

 XPosF.w=0:YPosF.w=AltezzaFonte+3:XLunF.w=LarghezzaSchermo:YLunF.w=AltezzaSchermo-(AltezzaFonte+3)
 TipoFinestra.l=#GadgetNascondiFinestra+#GadgetChiudiFinestra+#FinestraConMemoriaSfondo+#FinestraAttivata
 Eventi=Sequenza(SequenzaSelezionata-1)\Eventi
 EventiSelezionati=Sequenza(SequenzaSelezionata-1)\EventiSelezionati
 TitoloFinestra$="Sequence "+Str$(SequenzaSelezionata)+"-"
 If Eventi>0
  TitoloFinestra$+Str$(EventiSelezionati)+"selected event"
  If EventiSelezionati<>1 Then TitoloFinestra$+"s"
  TitoloFinestra$+" of "+Str$(Eventi)+" event"
  If Eventi<>1 Then TitoloFinestra$+"s"
 Else
  TitoloFinestra$+"no events into this sequence"
 EndIf
 Window #FinestraEditoreSequenza,XPosF,YPosF,XLunF,YLunF,TipoFinestra,TitoloFinestra$,-1,-1
 LarghezzaInternaFinestraEditoreSequenza=InnerWidth
 AltezzaInternaFinestraEditoreSequenza=InnerHeight
 CloseWindow #FinestraEditoreSequenza

 AreaInvisibileDelleNote.b=128-(AltezzaInternaFinestraEditoreSequenza-8-8)/8

 AreaVisibileDeiValori.w=(128-AreaInvisibileDelleNote)*8-1-7

 XLunSlider=16
 YLunSlider=AltezzaInternaFinestraEditoreSequenza-8-8
 ImpostaSlider{1,0,0,"VERTICAL",0,#ListaGadgetEditoreSequenza}

 XLunSlider=LarghezzaInternaFinestraEditoreSequenza-16
 YLunSlider=8
 ImpostaSlider{2,16,AltezzaInternaFinestraEditoreSequenza-8-8,"HORIZONTAL",0,#ListaGadgetEditoreSequenza}

 Window #FinestraEditoreSequenza,XPosF,YPosF,XLunF,YLunF,TipoFinestra,TitoloFinestra$,-1,-1,#ListaGadgetEditoreSequenza

;----------------------------------------------
;imposta la fonte di caratteri per la finestra
;sets the font for the window
;-----------------------------
 WindowFont #FonteDiCaratteriTopaz8

 WJam #DueColoriConSfondoPieno

 SetZone 0,0,0,LarghezzaInternaFinestraEditoreSequenza-1,AltezzaInternaFinestraEditoreSequenza-1-8-8
 Format "00"
 For Canale.b=1 To 16
  X0Canale.w=(Canale-1)*16:Y0Canale.w=AltezzaInternaFinestraEditoreSequenza-8
  WLocate X0Canale,Y0Canale
  If Canale=CanaleSelezionato
   WColour Canale-1,16-Canale
  Else
   If ColoriOriginali=True
    WColour Canale MOD 2+1,Canale MOD 2
   Else
    WColour 10+(Canale MOD 2)*2,9+(Canale MOD 2)*2
   EndIf
  EndIf
  Print Canale
  SetZone Canale,X0Canale,Y0Canale,X0Canale+15,Y0Canale+7
 Next Canale
 Format ""
 WLocate X0Canale+16,Y0Canale
 If ColoriOriginali=True Then WColour 2,1 Else WColour 14,13
 Print "All":SetZone 17,X0Canale+16,Y0Canale,X0Canale+16+23,Y0Canale+7
 WLocate X0Canale+16+8*3,Y0Canale
 If ColoriOriginali=True Then WColour 1,0 Else WColour 15,14
 Print "None":SetZone 18,X0Canale+16+8*3,Y0Canale,X0Canale+16+8*3+8*4-1,Y0Canale+7
 WLocate X0Canale+16+8*3+8*4,Y0Canale
 If ColoriOriginali=True Then WColour 2,1 Else WColour 14,13
 Print "Toggle":SetZone 19,X0Canale+16+8*3+8*4,Y0Canale,X0Canale+16+8*3+8*4+8*6-1,Y0Canale+7
 MostraLaScalaDelleNote{}
 SetZone 20,0,AltezzaInternaFinestraEditoreSequenza-8-8,15,AltezzaInternaFinestraEditoreSequenza-8-8+7
 InizioSequenza.l=Sequenza(SequenzaSelezionata-1)\Inizio
 Repeat
  If SecondoClicDelTopo.b=False
   TitoloFinestra$="Sequence "+Str$(SequenzaSelezionata)+"-"
   If Eventi>0
    TitoloFinestra$+Str$(EventiSelezionati)+" selected event"
    If EventiSelezionati<>1 Then TitoloFinestra$+"s"
    TitoloFinestra$+" of "+Str$(Eventi)+" event"
    If Eventi<>1 Then TitoloFinestra$+"s"
   Else
    TitoloFinestra$+"no events into this sequence"
   EndIf
   WTitle TitoloFinestra$

   If PrimaVoltaNellEditoreSequenza=True
;------------------------------------------------------------------
;questa variabile indica l'inizio delle note nell'editore sequenza
;this variable states the note beginning in the sequence editor
;---------------------------------------------------------------
    YInizioAreaVisibile=127-(127-AreaInvisibileDelleNote)-#_MiddleC
   EndIf

   ImpostaMenuFinestraEditoreSequenza{}
   MostraLeNoteDiSfondoConILoroNomi{}
   MostraLeBattute{}
   MostraGliEventiMusicali{}
   MostraSliderEditoreSequenza{}
   SecondoClicDelTopo=True
  EndIf
  If NotaSuonata\Eseguito=True
   Nota.b=NotaSuonata\Evento:InizioNota.l=NotaSuonata\Inizio
   FineNota.l=InizioNota+NotaSuonata\Durata-1
   VelocitaNota.b=NotaSuonata\Valore
   CanaleNota.b=NotaSuonata\Canale
   If Tempo>FineNota
    SmettiDiSuonareLaNota{Nota,VelocitaNota,CanaleNota,#EseguiGliEventiDallEditoreSequenza}
    NotaSuonata\Eseguito=False
   EndIf
  Else
   ResetTimer
  EndIf
  If NoteSuonate>0
   If NoteSuonate=1 Then Messaggio$="There is a note" Else Messaggio$="There are "+Str$(NoteSuonate)
   Messaggio$+" still playing:|clicking on OK you will stop "
   If NoteSuonate=1 Then Messaggio$+"this." Else Messaggio$+"these."
   EZRequest "AmySequencer message",Messaggio$,"OK"
   InterrompiTutteLeNote{#EseguiGliEventiDallEditoreSequenza}
   NoteSuonate=0
  EndIf
  If PrimaVoltaNellEditoreSequenza=True
   MostraITastiDaUsare{}
   MostraLaMappaturaDelleNoteSullaTastiera{}
   PrimaVoltaNellEditoreSequenza=False
  EndIf
  EventoFinestraEditoreSequenza.l=Event
  TempoTrascorso.l=Timer
  Select EventoFinestraEditoreSequenza
  Case #HaiPremutoUnTastoDelTopo
   TastoCliccatoDelTopo=MButtons:TastoPremutoDelTopo=Joyb(0)
   XTopo=WMouseX:YTopo=WMouseY:ZonaTopo.b=Zone(XTopo,YTopo)
   Select TastoCliccatoDelTopo
   Case 1
    Select ZonaTopo
    Case 0
     Selezione{#SelezionaUnEvento}
    Case 1
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=1:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
     Format ""
    Case 2
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=2:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
     Format ""
    Case 3
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=3:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
     Format ""
    Case 4
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=4:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
     Format ""
    Case 5
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=5:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSeleZionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
     Format ""
    Case 6
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=6:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
     Format ""
    Case 7
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=7:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
     Format ""
    Case 8
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=8:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
     Format ""
    Case 9
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=9:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
     Format ""
    Case 10
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=10:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
     Format ""
    Case 11
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=11:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
     Format ""
    Case 12
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=12:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
     Format ""
    Case 13
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=13:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
     Format ""
    Case 14
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=14:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
     Format ""
    Case 15
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=15:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
     Format ""
    Case 16
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=16:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
     Format ""
    Case 17
     Selezione{#SelezionaTuttiGliEventi}
     NoteSelezionate=Note
    Case 18
     Selezione{#DeselezionaTuttiGliEventi}
     NoteSelezionate=0
    Case 19
     Selezione{#InvertiLaSelezioneDiTuttiGliEventi}
    Case 20
     ScalaNote+ScalaNote
     If ScalaNote=64 Then ScalaNote=1
     AreaInvisibileDelTempo=(DurataSequenza-LarghezzaInternaFinestraEditoreSequenza-16)/ScalaNote
     MostraLaScalaDelleNote{}
     MostraSliderEditoreSequenza{}
    End Select
    SecondoClicDelTopo=False
   Case 5
    If TempoTrascorso>49 AND ZonaTopo=0
     Selezione{#SelezionaGliEventiUguali}
     SecondoClicDelTopo=False
    Else
     SecondoClicDelTopo=True
    EndIf
   End Select
;   Case #HaiPremutoUnGadget
;    Select GadgetHit
;    Case 1
;     AltezzaSlider.w=AltezzaInternaFinestraEditoreSequenza-8-8
;     YInizioAreaVisibile=ValoreSlider{1,AreaInvisibileDelleNote,AltezzaSlider,"VERTICAL",#ListaGadgetEditoreSequenza}
;    Case 2
;     LunghezzaSlider.w=LarghezzaInternaFinestraEditoreSequenza-16
;     XInizioAreaVisibile=ValoreSlider{2,AreaInvisibileDelTempo,LunghezzaSlider,"HORIZONTAL",#ListaGadgetEditoreSequenza}
;    End Select
  Case #HaiRilasciatoUnGadget
   Select GadgetHit
   Case 1
    AltezzaSlider.w=AltezzaInternaFinestraEditoreSequenza-8-8
    YInizioAreaVisibile=ValoreSlider{1,AreaInvisibileDelleNote,AltezzaSlider,"VERTICAL",#ListaGadgetEditoreSequenza}
   Case 2
    LunghezzaSlider.w=LarghezzaInternaFinestraEditoreSequenza-16
    XInizioAreaVisibile=ValoreSlider{2,AreaInvisibileDelTempo,LunghezzaSlider,"HORIZONTAL",#ListaGadgetEditoreSequenza}
   End Select
   SecondoClicDelTopo=False
  Case #HaiAttivatoIlMenu
   If MenuHit=0 AND ItemHit=0 Then EseguiGliEventi{#EseguiGliEventiDallEditoreSequenza}
   If MenuHit=1 AND ItemHit=0 Then TipoDiEvento$="Note"
   If MenuHit=1 AND ItemHit=1 Then TipoDiEvento$="Program"
   If MenuHit=1 AND ItemHit=2 Then TipoDiEvento$="Control"
   If MenuHit=1 AND ItemHit=3 Then TipoDiEvento$="Tempo"
   If MenuHit=2 AND ItemHit=0 Then CambiaLEventoDiBase{}
   If MenuHit=2 AND ItemHit=1 Then MostraNuovoValore=NOT MostraNuovoValore
   If MenuHit=3 AND ItemHit=0 Then MostraITastiDaUsare{}
   If MenuHit=3 AND ItemHit=1 Then MostraLaMappaturaDelleNoteSullaTastiera{}
   SecondoClicDelTopo=False
  Case #HaiChiusoLaFinestra
   EsciDallEditoreSequenza.b=True
  Case #HaiPremutoUnTasto
   TastoPremuto$=LCase$(Inkey$):TastoRiga.w=RawKey
   If TastoPremuto$=TastoEsc$ Then EsciDallEditoreSequenza=True
   Select TastoRiga
   Case 2
    Nota$="C#2"
   Case 3
    Nota$="D#2"
   Case 5
    Nota$="F#2"
   Case 6
    Nota$="G#2"
   Case 7
    Nota$="A#2"
   Case 16
    Nota$="C2"
   Case 17
    Nota$="D2"
   Case 18
    Nota$="E2"
   Case 19
    Nota$="F2"
   Case 20
    Nota$="G2"
   Case 21
    Nota$="A2"
   Case 22
    Nota$="B2"
   Case 33
    Nota$="C#1"
   Case 34
    Nota$="D#1"
   Case 35
    Nota$="F#1"
   Case 36
    Nota$="G#1"
   Case 37
    Nota$="A#1"
   Case 49
    Nota$="C1"
   Case 50
    Nota$="D1"
   Case 51
    Nota$="E1"
   Case 52
    Nota$="F1"
   Case 53
    Nota$="G1"
   Case 54
    Nota$="A1"
   Case 55
    Nota$="B1"
   Case 80
    OttavaSelezionata=0
   Case 81
    OttavaSelezionata=1
   Case 82
    OttavaSelezionata=2
   Case 83
    OttavaSelezionata=3
   Case 84
    OttavaSelezionata=4
   Case 85
    OttavaSelezionata=5
   Case 86
    OttavaSelezionata=6
   Case 87
    OttavaSelezionata=7
   Case 88
    OttavaSelezionata=8
   Case 89
    OttavaSelezionata=9
   Default
    TastoRiga=0
   End Select
   If TastoRiga>0
    If TastoRiga<80
     AggiungiUnaNotaDallaTastiera{Nota$}
    Else
     YInizioAreaVisibile=Max(127-(127-AreaInvisibileDelleNote)-OttavaSelezionata*12,0)
    EndIf
   EndIf
   If EventiSelezionati>0
    TastiShiftPremuti.b=(Qualifier-$8000) AND %11
    If TastiShiftPremuti>0
     Select TastoPremuto$
     Case TastoBackspace$
      Selezione{#EliminaGliEventiSelezionati}
     Case TastoCursoreSu$
      If TipoDiEvento$="Note" Then Selezione{#AlzaDiUnOttavaLeNoteSelezionate}
      If TipoDiEvento$="Program" Then Selezione{#AggiungiDieciAgliEventiSelezionati}
      If TipoDiEvento$="Control" Then Selezione{#AggiungiDieciAgliEventiSelezionati}
      If TipoDiEvento$="Tempo" Then Selezione{#AggiungiUnaMisuraAlTempoSelezionato}
     Case TastoCursoreGiu$
      If TipoDiEvento$="Note" Then Selezione{#AbbassaDiUnOttavaLeNoteSelezionate}
      If TipoDiEvento$="Program" Then Selezione{#SottraiDieciAgliEventiSelezionati}
      If TipoDiEvento$="Control" Then Selezione{#SottraiDieciAgliEventiSelezionati}
      If TipoDiEvento$="Tempo" Then Selezione{#TogliUnaMisuraAlTempoSelezionato}
     Case TastoCursoreDestra$
      If TipoDiEvento$="Note" Then Selezione{#AllungaLaDurataDelleNoteSelezionate}
     Case TastoCursoreSinistra$
      If TipoDiEvento$="Note" Then Selezione{#RiduciLaDurataDelleNoteSelezionate}
     End Select
    Else
     Select TastoPremuto$
     Case TastoBackspace$
      If LastItem(EventoMusicale())=True
       If EventoMusicale()\Selezionato=True Then EventiSelezionati-1
       DurataSequenza-EventoMusicale()\Durata
       XInizioAreaVisibile-EventoMusicale()\Durata
       XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
       KillItem EventoMusicale():Eventi-1
      EndIf
     Case TastoCursoreSu$
      If TipoDiEvento$="Tempo"
       Selezione{#AggiungiUnBattitoAlTempoSelezionato}
      Else
       Selezione{#AlzaDiUnoGliEventiSelezionati}
      EndIf
     Case TastoCursoreGiu$
      If TipoDiEvento$="Tempo"
       Selezione{#TogliUnBattitoAlTempoSelezionato}
      Else
       Selezione{#AbbassaDiUnoGliEventiSelezionati}
      EndIf
     Case TastoCursoreDestra$
      Selezione{#SpostaAvantiNelTempoGliEventiSelezionati}
     Case TastoCursoreSinistra$
      Selezione{#SpostaIndietroNelTempoGliEventiSelezionati}
     End Select
    EndIf
   Else
    Select TastoPremuto$
    Case TastoBackspace$
     If LastItem(EventoMusicale())=True
      If EventoMusicale()\Selezionato=True Then EventiSelezionati-1
      DurataSequenza-EventoMusicale()\Durata
      XInizioAreaVisibile-EventoMusicale()\Durata
      XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
      KillItem EventoMusicale():Eventi-1
     EndIf
    Case TastoCursoreSu$
     If YInizioAreaVisibile>0 Then YInizioAreaVisibile-1
    Case TastoCursoreGiu$
     If YInizioAreaVisibile<AreaInvisibileDelleNote Then YInizioAreaVisibile+1
    Case TastoCursoreDestra$
     XInizioAreaVisibile+LarghezzaEventoDiBase
     XInizioAreaVisibile=Min(XInizioAreaVisibile,AreaInvisibileDelTempo)
    Case TastoCursoreSinistra$
     XInizioAreaVisibile-LarghezzaEventoDiBase
     XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
    End Select
   EndIf
   If TastoPremuto$=" " Then DurataSequenza+192*(4.0/Misure)
   SecondoClicDelTopo=False
  End Select
  Tempo=Timer*TicPerCinquantesimoDiSecondo
 Until EsciDallEditoreSequenza=True
 Sequenza(SequenzaSelezionata-1)\Eventi=Eventi
 Sequenza(SequenzaSelezionata-1)\EventiSelezionati=EventiSelezionati
 Sequenza(SequenzaSelezionata-1)\Inizio=InizioSequenza
 Sequenza(SequenzaSelezionata-1)\Durata=DurataSequenza
 CloseWindow #FinestraEditoreSequenza
 Use Window #FinestraPrincipale
 WJam #UnColoreConSfondoTrasparente
End Statement

;---------------------------------------------
;questa procedura mostra la sequenza indicata
;this procedure shows the stated sequence
;-----------------------------------------
Statement MostraSequenza{NomeSequenza$,InizioSequenza.l,YSequenza.b,DurataSequenza.l,EventiSequenza.l,ModoDisegno.b}
SHARED AltezzaInternaFinestraPrincipale
SHARED LarghezzaInternaFinestraPrincipale
SHARED SequenzeVisibili
SHARED XSequenzeVisibili
SHARED YSequenzeVisibili
 Y0.w=8+YSequenza*8:Y1.w=Y0+7
 If Y0>=8 AND Y1<8+SequenzeVisibili*8
  FineSequenza.l=InizioSequenza+DurataSequenza-1
  I.w=16+InizioSequenza-XSequenzeVisibili
  F.w=16+FineSequenza-XSequenzeVisibili
  If I>=16 AND I<LarghezzaInternaFinestraPrincipale
   InizioSequenzaVisibile.b=True
  Else
   InizioSequenzaVisibile=False
  EndIf
  If F>=16 AND F<LarghezzaInternaFinestraPrincipale
   FineSequenzaVisibile.b=True
  Else
   FineSequenzaVisibile=False
  EndIf
  If I<16 AND F>LarghezzaInternaFinestraPrincipale
   SequenzaVisibile.b=True
  Else
   If InizioSequenzaVisibile=True OR FineSequenzaVisibile=True
    SequenzaVisibile=True
   Else
    SequenzaVisibile=False
   EndIf
  EndIf
  If SequenzaVisibile=True
   X0Sequenza.w=Min(Max(I,16),LarghezzaInternaFinestraPrincipale-1)
   Y0Sequenza.w=Min(Max(Y0,8),AltezzaInternaFinestraPrincipale-1-8-8-4-7)
   X1Sequenza.w=Min(Max(F,16),LarghezzaInternaFinestraPrincipale-1)
   Y1Sequenza.w=Min(Max(Y1,8+7),AltezzaInternaFinestraPrincipale-1-8-8-4)
   ColoreSequenza.b=(YSequenza+YSequenzeVisibili) MOD 16
   WBox X0Sequenza,Y0Sequenza,X1Sequenza,Y1Sequenza,ColoreSequenza
   If ModoDisegno=#SequenzaSelezionata
    Wline X0Sequenza,Y0,X1Sequenza,Y1,15-ColoreSequenza
    Wline X0Sequenza,Y1,X1Sequenza,Y0,15-ColoreSequenza
   EndIf
   If ModoDisegno=#SequenzaNonSelezionata
    Wline X0Sequenza+1,Y0Sequenza+1,X1Sequenza-1,Y0Sequenza+1,15-ColoreSequenza
    Wline X0Sequenza+1,Y1Sequenza-1,X1Sequenza-1,Y1Sequenza-1,15-ColoreSequenza
   EndIf
   If ModoDisegno=#SequenzaNonSelezionata
    If InizioSequenzaVisibile=True
     Wline I+1,Y0Sequenza+1,I+1,Y1Sequenza-1,15-ColoreSequenza
    EndIf
    If FineSequenzaVisibile=True
     Wline F-1,Y0Sequenza+1,F-1,Y1Sequenza-1,15-ColoreSequenza
    EndIf
   EndIf
   If NomeSequenza$="" Then NomeSequenza$="Sequence "+Str$(YSequenza+YSequenzeVisibili+1)
   If I>=16 OR I<LarghezzaInternaFinestraPrincipale OR F>=16 OR F<LarghezzaInternaFinestraPrincipale
    WColour 15-ColoreSequenza,ColoreSequenza
    I=Max(I,16):F=Min(F,LarghezzaInternaFinestraPrincipale-1)
    WLocate I,Y0Sequenza:Print Left$(Right$(NomeSequenza$,(F-16+1)/8),(F-I+1)/8)
   EndIf
  EndIf
 EndIf
End Statement

;--------------------------------------------------------------
;questa procedura mostra le sequenze nella finestra principale
;this procedure show the sequences in the main window
;-----------------------------------------------------
Statement MostraLeSequenze{}
SHARED AreaInvisibileDelMotivo
SHARED ColoriOriginali
SHARED FineMotivo
SHARED LarghezzaInternaFinestraPrincipale
SHARED Sequenza()
SHARED SequenzaSelezionata
SHARED Sequenze
SHARED SequenzeVisibili
SHARED XSequenzeVisibili
SHARED YSequenzeVisibili
 While Sequenze>0 AND YSequenza<SequenzeVisibili
  NomeSequenza$=Sequenza(YSequenza+YSequenzeVisibili)\Nome
  InizioSequenza.l=Sequenza(YSequenza+YSequenzeVisibili)\Inizio
  DurataSequenza.l=Sequenza(YSequenza+YSequenzeVisibili)\Durata
  If DurataSequenza>0
   EventiSequenza.l=Sequenza(YSequenza+YSequenzeVisibili)\Eventi
   If YSequenza+YSequenzeVisibili+1=SequenzaSelezionata Then Modo.b=#SequenzaSelezionata Else Modo=#SequenzaNonSelezionata
   MostraSequenza{NomeSequenza$,InizioSequenza,YSequenza,DurataSequenza,EventiSequenza,Modo}
  EndIf
  YSequenza+1
 Wend
 FineMotivo=0
 For TutteLeSequenze.w=0 To #MassimoSequenze-1
  DurataSequenza.l=Sequenza(TutteLeSequenze)\Durata
  If DurataSequenza>0
   FineSequenza.l=Sequenza(TutteLeSequenze)\Inizio+DurataSequenza-1
   FineMotivo=Max(FineMotivo,FineSequenza+1)
  EndIf
 Next TutteLeSequenze
 AreaInvisibileDelMotivo=Max(FineMotivo-(LarghezzaInternaFinestraPrincipale-16),0)
 MostraSlider{3,XSequenzeVisibili,AreaInvisibileDelMotivo,"HORIZONTAL",#ListaGadgetPrincipale,#FinestraPrincipale}
End Statement

Statement MostraIBattitiPerMinuto{}
SHARED AltezzaFonte
SHARED AltezzaSchermo
SHARED BattuteAlMinuto
SHARED TicPerCinquantesimoDiSecondo
 WLocate 0,AltezzaSchermo-(AltezzaFonte+3)-8-8
 WColour 3:Print "BPM>",BattuteAlMinuto," Ticks/50th>",TicPerCinquantesimoDiSecondo
End Statement

;-----------------------------------------------------------
;questa pprocedura elimina tutti gli eventi du una sequenza
;this procedure deletes all the events of a sequence
;----------------------------------------------------
Statement EliminaTuttiGliEventiDellaSequenza{Sequenza.w}
SHARED EventoMusicale()
SHARED Sequenza()
 If Sequenza(Sequenza)\Eventi>0
  While NextItem(EventoMusicale())=True
   If EventoMusicale()\Sequenza=Sequenza Then KillItem EventoMusicale()
  Wend
 EndIf
End Statement

;*********************************************
;Fine delle procedure ed inizio del programma
;procedures end and program start
;*********************************

;----------------------------------------------------
;questo programma puo' essere lanciato dal Workbench
;this program can be launched from Workbench
;_-------------------------------------------
WBStartup

BlitMode CookieMode

CaricaLaFonteDiCaratteriTopaz8{}

ImpostaIlParlatoDellAmiga{}

CaricaLeImmaginiDelleNote{}

CreaLaBitmapPerLImmagineDiSfondo{}

ImpostaLoSchermo{}

CaricaLImmagineDiSfondoNellaBitmap{}

CaricaLaStoriaDeiProgettiAperti{}

ImpostaLaFinestraPrincipale{}

CalcolaLaFrequenzaEdIlPeriodoDelleNote{}

MostraIlTempo{(Misure-1)*16+Battiti-1,#EseguiGliEventiDallaFinestraPrincipale}

AttivaMIDI{}

Sequenze.w=0

SequenzaSelezionata.w=0

VoceSpenta=%1111

;-----------------
;clclo principale
;main loop
;----------
Repeat

 If SecondoClicDelTopo.b=False
  MettiLImmagineDiSfondoNellaFinestraPrincipale{}
  MostraGliEventiMusicaliDisponibili{}
  MostraLeSequenze{}
  MostraIBattitiPerMinuto{}
  MostraIlTempo{(Misure-1)*16+Battiti-1,#EseguiGliEventiDallaFinestraPrincipale}
  Redraw #FinestraPrincipale
  SecondoClicDelTopo=True
 EndIf

 If NoteSuonate>0
  If NoteSuonate=1 Then Messaggio$="There is a note" Else Messaggio$="There are "+Str$(NoteSuonate)
  Messaggio$+"still playing:|clicking on OK you will stop "
  If NoteSuonate=1 Then Messaggio$+"this." Else Messaggio$+"these."
  EZRequest "AmySequencer message",Messaggio$,"OK"
  InterrompiTutteLeNote{#EseguiGliEventiDallaFinestraPrincipale}
  NoteSuonate=0
 EndIf

;--------------------------------------------------------------
;questa variabile cattura gli eventi della finestra principale
;this variable catch main window events
;---------------------------------------
 EventoFinestraPrincipale.l=WaitEvent

 Select EventoFinestraPrincipale

;------------------------------------
;se avete premuto un tasto del mouse
;if you have prssed a mouse button
;----------------------------------
 Case #HaiPremutoUnTastoDelTopo
  XTopo=WMouseX:YTopo=WMouseY:TastoCliccatoDelTopo.b=MButtons
  Select TastoCliccatoDelTopo
  Case #TastoSinistroDelTopoPremuto
   If YTopo>=8 AND YTopo<8+SequenzeVisibili*8
    SequenzaSelezionata=YSequenzeVisibili+(YTopo-8)/8+1
    If Sequenza(SequenzaSelezionata-1)\Durata=0 Then Sequenze+1
    Sequenza(SequenzaSelezionata-1)\Inizio=XSequenzeVisibili+XTopo-16
    Sequenza(SequenzaSelezionata-1)\Durata=Max(Sequenza(SequenzaSelezionata-1)\Durata,192*4.0*Battiti/Misure)
   EndIf
   If YTopo>AltezzaInternaFinestraPrincipale-1-8-8 AND YTopo<AltezzaInternaFinestraPrincipale-8
    If XTopo>LarghezzaInternaFinestraPrincipale-Len("Tempo=00/00")*8
     CambiaLaMisuraDelTempo{}
     MostraIlTempo{(Misure-1)*16+Battiti-1,#EseguiGliEventiDallaFinestraPrincipale}
    EndIf
   EndIf
   SecondoClicDelTopo=False
  Case #TastoSinistroDelTopoRilasciato
   SecondoClicDelTopo=True
  End Select
;---------------------------
;se avete premuto un gadget
;if you have pressed a gadget
;-----------------------------
; Case #HaiPremutoUnGadget
;  Select GadgetHit
;  Case 1
;   LunghezzaSlider.w=LarghezzaInternaFinestraPrincipale
;   BattuteAlMinuto=10+ValoreSlider{1,300-9,LunghezzaSlider,"HORIZONTAL",#ListaGadgetPrincipale}
;   TicPerCinquantesimoDiSecondo=BattuteAlMinuto*192*4/3000
;  Case 2
;   AltezzaSlider.w=AltezzaSchermo-(AltezzaFonte+3)-8-8-8
;   YSequenzeVisibili=ValoreSlider{2,#MassimoSequenze-SequenzeVisibili,LunghezzaSlider,"VERTICAL",#ListaGadgetPrincipale}
;  Case 3
;   LunghezzaSlider=LarghezzaInternaFinestraPrincipale-16
;   XSequenzeVisibili=ValoreSlider{3,AreaInvisibileDelMotivo,LunghezzaSlider,"HORIZONTAL",#ListaGadgetPrincipale}
;  End Select
;  SecondoClicDelTopo=False

;------------------------------
;se avete rilasciato un gadget
;if you have released a gadget
;------------------------------
 Case #HaiRilasciatoUnGadget
  Select GadgetHit
  Case 1
   LunghezzaSlider.w=LarghezzaInternaFinestraPrincipale
   BattuteAlMinuto=10+ValoreSlider{1,300-9,LunghezzaSlider,"HORIZONTAL",#ListaGadgetPrincipale}
   TicPerCinquantesimoDiSecondo=BattuteAlMinuto*192*4/3000
  Case 2
   AltezzaSlider.w=AltezzaSchermo-(AltezzaFonte+3)-8-8-8
   YSequenzeVisibili=ValoreSlider{2,#MassimoSequenze-SequenzeVisibili,AltezzaSlider,"VERTICAL",#ListaGadgetPrincipale}
  Case 3
   LunghezzaSlider=LarghezzaInternaFinestraPrincipale-16
   XSequenzeVisibili=ValoreSlider{3,AreaInvisibileDelMotivo,LunghezzaSlider,"HORIZONTAL",#ListaGadgetPrincipale}
  End Select
  SecondoClicDelTopo=False

;--------------------------------------
;se avete attivato il menu' principale
;if you have activated main menu
;--------------------------------
 Case #HaiAttivatoIlMenu
  Select MenuHit
  Case 0
   If ItemHit=1
    CaricaUnProgetto{}
    ImpostaLaFinestraPrincipale{}
   EndIf
  Case 1
   If ItemHit=0
    EseguiGliEventi{#EseguiGliEventiDallaFinestraPrincipale}
    MostraIlTempo{(Misure-1)*16+Battiti-1,#EseguiGliEventiDallaFinestraPrincipale}
   EndIf
  Case 2
   Select ItemHit
   Case 0
    EditoreSuoni{}
   Case 1
    If SequenzaSelezionata>0
     EditoreSequenza{}
    Else
     EZRequest "AmySequencer message","You must select a sequence first","OK"
    EndIf
   End Select
  Case 3
   Select ItemHit
   Case 0
    AttivaMIDI{}
   Case 1
    ColoriOriginali=NOT ColoriOriginali
    CaricaLImmagineDiSfondoNellaBitmap{}
    CopiaLoSfondoSottoAlTempo{}
   Case 2
    If Exists("ProjectsHistory")
     CancellaLaStoriaDeiProgettiAperti{}
     ImpostaLaFinestraPrincipale{}
    EndIf
   End Select
  End Select

;-------------------------------------------------------------------
;se avete scelto la voce Quit dal menu' Project attiva la variabile
; EsciDalProgramma
;if you have selected voice Quit from Project menu activates EsciDalProgramma
; flag
;------
  If MenuHit=0 AND ItemHit=VoceMenuEsci Then EsciDalProgramma=True

  SecondoClicDelTopo=False

;--------------------------
;se avete premuto un tasto
;if you have pressed a key
;--------------------------
 Case #HaiPremutoUnTasto

;--------------------------------------------
;questa variabile memorizza il tasto premuto
;this variable store key pressed
;--------------------------------
  TastoPremuto$=Inkey$

;-------------------------------------------------------------------
;se avete premuto il tasto Esc attiva la variabile EsciDalProgramma
;if you have typed Esc key activates EsciDalProgramma flag
;----------------------------------------------------------
  If TastoPremuto$=TastoEsc$ Then EsciDalProgramma=True
  Select TastoPremuto$
  Case TastoBackspace$
   If SequenzaSelezionata>0
    EliminaTuttiGliEventiDellaSequenza{SequenzaSelezionata}
    Sequenza(SequenzaSelezionata-1)\Nome=""
    Sequenza(SequenzaSelezionata-1)\Inizio=0
    Sequenza(SequenzaSelezionata-1)\Durata=0
    Sequenza(SequenzaSelezionata-1)\Eventi=0
    Sequenza(SequenzaSelezionata-1)\EventiSelezionati=0
    Sequenze-1:SequenzaSelezionata=0
   EndIf
  Case TastoCursoreSu$
   If YSequenzeVisibili>0 Then YSequenzeVisibili-1
  Case TastoCursoreGiu$
   If YSequenzeVisibili<#MassimoSequenze-SequenzeVisibili Then YSequenzeVisibili+1
  Case TastoCursoreDestra$
   If XSequenzeVisibili<AreaInvisibileDelMotivo
    XSequenzeVisibili+LarghezzaEventoDiBase
    XSequenzeVisibili=Min(XSequenzeVisibili,AreaInvisibileDelMotivo)
   EndIf
  Case TastoCursoreSinistra$
   If XSequenzeVisibili>0
    XSequenzeVisibili-LarghezzaEventoDiBase
    XSequenzeVisibili=Max(XSequenzeVisibili,0)
   EndIf
  End Select
  SecondoClicDelTopo=False

 End Select

;----------------------------------------------------------------
;ripete il ciclo se la variabile EsciDalProgramma e' disattivata
;repeats loop if EsciDalProgramma flag is deactivated
;-----------------------------------------------------
Until EsciDalProgramma=True

;----------------------
;fine del programma
;program end
;------------
End
