;-> 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",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 SuonoIndicatoDalTopo31 ; 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-1 Suono=SuonoIndicatoDalTopo Free Sound Suono Suono(Suono)\Nome="" While Suono+1SuonoDue 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=16 AND FLarghezzaInternaFinestraEditoreSequenza 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=16 OR F=16 OR I=16 OR F=16 OR I=16 OR F=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=16 AND FLarghezzaInternaFinestraEditoreSequenza 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=16 OR F=16 OR I=16 OR F=16 OR I=16 OR F" 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 XPosizioneProgrammaCanaleEvento 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 XPosizioneControlloCanaleEvento 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 XPosizioneTempoCanaleEvento 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=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=16 AND FLarghezzaInternaFinestraPrincipale 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=16 OR F0 AND YSequenza0 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 YTopoLarghezzaInternaFinestraPrincipale-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 XSequenzeVisibili0 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