Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
FACOLTÀ DI INGEGNERIA
Corso di Laurea in Ingegneria Informatica e dell’Automazione
Tesi di Laurea
Candidato: Relatore:
Samuele PACIONI Prof. Ing. Aldo Franco
matr. 1005693 DRAGONI
1. - INTRODUZIONE ……………………………………………………….... 1
2. - INTERFACCE GRAFICHE, VISUAL STUDIO 6.0 ED MFC:…...…
…….CARATTERISTICHE SALIENTI …………………………………........ 5
2.1 – INTERFACCE GRAFICHE …………………………………………………………………….......... 5
2.2 – MICROSOFT VISUAL C++ 6.0 …………………………………………………….................. 11
2.3 – MICROSOFT FOUNDATION CLASS: MFC ………………………………………………..… 13
2.3.1 – MFC: DEFINIZIONE E SPECIFICHE ……………………………………………………………… 14
1. - INTRODUZIONE
1
Capitolo 1
27 novembre 2008
Tastiere elettroniche
Fisarmoniche elettroniche
Pianoforti digitali
Organi liturgici
Multitimbricità
Polifonia
Unità effetti integrata (Dsp)
Sequencer
Connessioni audio e midi
Ogni strumento inoltre include un‟ interfaccia utente dove appare possibile
modificare vari parametri che caratterizzano ogni singolo timbro (pitch,
frequenza, dinamica, volume, panpot, controlli midi, effetti e molto altro)
2
Capitolo 1
27 novembre 2008
3
Capitolo 1
27 novembre 2008
4
Capitolo 2
27 novembre 2008
1
L’ interazione può avvenire con qualsiasi altro strumento elettronico che supporti tali
modalità di comunicazione.
5
Capitolo 2
27 novembre 2008
Di pari passo si sono succedute nel tempo le varie release dei più conosciuti
S.O. di casa Microsoft ed Apple rispettivamente Windows e Mac OS X fino
alle ultime versioni attualmente in commercio con l‟ introduzione di
notevoli miglioramenti grafici e prestazionali (figura 2.2).
Figura 2.2 – Evoluzione nel tempo delle interfacce grafiche nei sistemi operativi
prodotti da Microsoft ed Apple.………….…………….….
6
Capitolo 2
27 novembre 2008
7
Capitolo 2
27 novembre 2008
Esempi:
editing di testi
8
Capitolo 2
27 novembre 2008
editing di disegni
animazione grafica tridimensionale
menu bar (barra del menu'): contiene le funzioni principali
dell'applicazione
area messaggi: contiene messaggi di help o di spiegazione
status bar: mostra lo stato attuale dell'applicazione
vari dispositivi di interfaccia
o etichette testuali
o etichette grafiche (bitmap)
o cornici ed altri elementi decorativi
o aree grafiche
o aree di visualizzazione ed editing di testi
9
Capitolo 2
27 novembre 2008
10
Capitolo 2
27 novembre 2008
2
Un integrated development environment (IDE), in italiano ambiente integrato di
sviluppo è un software che aiuta i programmatori nello sviluppo dell’ applicativo.
3
Le Application Programming Interface API (Interfa ccia di Programmazione di
un'Applicazione), sono ogni insieme di procedure disponibili al programmatore, di solito
raggruppate a formare un set di strumenti specifici per un deter minato compito. È un
metodo per ottener e un'astrazione, di solito tra l'hardware e il programmatore, o tra
software a basso ed alto livello.
11
Capitolo 2
27 novembre 2008
Figura 2.6 – Resource View di Visual C++. All‟ interno della workspace window
(“finestra di lavoro”) del visualizzatore di risorse sono esaminabili gli elementi
grafici: finestre di dialogo, icone, menù e string table.
12
Capitolo 2
27 novembre 2008
Figura 2.7 – Class View di Visual C++. Diagramma a grafo della gerarchia delle
classi.
13
Capitolo 2
27 novembre 2008
4
Software Development Kit (più brevemente SDK) è un termine che in italiano si può
tradurre come "pacchetto di sviluppo per applicazioni", e sta a indicare un insieme di
strumenti per lo sviluppo e la documentazione di software.
14
Capitolo 2
27 novembre 2008
ON_WM_PAINT ()
END_MESSAGE_ MAP ()
Messaggio Descrizione
WM_CHAR Un carattere è inserito da tastiera
L‟ utente seleziona un elemento dal menù o un
WM_COMMAND
controllo invia una notifica alla finestra “parente”
WM_CREATE E‟ creata una finestra
WM_DESTROY E‟ chiusa una finestra
WM_LBUTTONDOWN Il tasto sinistro del mouse risulta schiaccciato
WM_LBUTTONUP Il tasto sinistro del mouse risulta rilasciato
WM_MOUSEMOVE Il puntatore del mouse risulta in movimento
WM_PAINT Un finestra deve essere ridisegnata (aggiornata)
M_QUIT L‟ applicazione viene terminata
WM_SIZE Un finestra risulta ridimensionata
15
Capitolo 2
27 novembre 2008
16
Capitolo 2
27 novembre 2008
{
…
CClientDC dc (this);
ResetGame (); …
17
Capitolo 2
27 novembre 2008
Nella mappa dei messaggi vanno aggiunti gli eventi generati dai
controlli utilizzati; ad esempio il controllo bottone genera un evento
ON_BN_CLICKED che viene generato al momento della pressione.
Gli eventi dei controlli che si desidera gestire vanno associati alle
corrispondenti routine di gestione (es. OnButtonClicked).
18
Capitolo 2
27 novembre 2008
Per inserire una dialog box in una applicazione MFC e‟ necessario ereditare
una propria classe dalla classe base CDialog, inserire i controlli all‟interno
della dialog, ed eventualmente implementare alcune funzioni virtuali che
gestiscono il comportamento della dialog. In sintesi i passi da seguire per
aggiungere ad una applicazione una semplice dialog box che richiede l‟input
di un campo test e di uno numerico (listato 2_2_4), sono questi:
19
Capitolo 2
27 novembre 2008
immagini
testo statico
testo editabile
raggruppamenti
pulsanti
Check box
radio box
combo box
list box
scroll bar orizzontali
scroll bar verticali
spin
progress
slider
hot key
list control
tree control
tab control
animazioni
20
Capitolo 2
27 novembre 2008
rich edit
custom control
Figura 2.9 – Con il ClssWizard relativo ad una Dialog risulta possibile l „intera
gestione delle variabili membro e delle funzioni membro associate ad essa .
21
Capitolo 3
27 novembre 2008
3.1 – INTRODUZIONE
22
Capitolo 3
27 novembre 2008
uno di stop oltre agli otto bit della trasmissione. Quindi un byte che viene
ricevuto o trasmesso dall' interfaccia midi è composto da 10 bit .
I cavi utilizzati per la trasmissione di dati midi sono composti da cinque fili,
anche se in realtà ne vengono utilizzati solo tre. Il connettore per il
collegamento alle porte MIDI-IN,OUT, THRU è a cinque poli. Due poli e
due cavi non vengono praticamente utilizzati.
23
Capitolo 3
27 novembre 2008
24
Capitolo 3
27 novembre 2008
BYTE
25
Capitolo 3
27 novembre 2008
26
Capitolo 3
27 novembre 2008
27
Capitolo 3
27 novembre 2008
28
Capitolo 3
27 novembre 2008
29
Capitolo 3
27 novembre 2008
System exclusive
Status Byte: 11110000 (Sistema esclusivo) F0H
Lo status bytes è seguito da una serie di byte che costituiscono
l‟informazione (compreso l‟ID).
End of exclusive
Status Byte: 11110111 (Fine messaggio) F7H
Indica la fine di messaggio di sistema esclusivo.
BYTE Description
DEV Device ID
MDL Model ID
11H Command ID
[BODY] MainData
30
Capitolo 3
27 novembre 2008
Device-ID: DEV
Il device- ID contiene un unico valore che identifica il
…………… singolo device
Relativamente alla connessione midi di più strumenti .
31
Capitolo 3
27 novembre 2008
32
Capitolo 3
27 novembre 2008
33
Capitolo 4
27 novembre 2008
4.1 – INTRODUZIONE
34
Capitolo 4
27 novembre 2008
prerogativa di rispettare gli standard imposti sia dal protocollo midi sia dai
modelli grafici di costruzione trattati nei capitoli introduttivi.
35
Capitolo 4
27 novembre 2008
baroque_ROM[NUMBER_OF_TIMBRES][COUPLED_VOICES][NUMBER_OF_VOICES]
const TRIP
baroque_ROM[NUMBER_OF_TIMBRES][COUPLED_VOICES][NUMBER_OF_VOICES] = {
{
{
{
//PEDAL >> Timbri_RAM[Tab0][Rank0][VoicePalette0]
/*unsigned char Sysexcode;*/ 155,
/*unsigned char NomeVoce[LENGTH_OF_NAMES+1];*/
/*PrincipalBass16'",
/*unsigned char orgPar t_exist;*/ 0,
/*unsigned char cc32;*/ 4,
/*unsigned char cc0;*/ 0,
/*unsigned char pc;*/ 0,
/*unsigned char volume;*/ 115,
/*unsigned char filter;*/ 89,
/*unsigned char micro_panpot;*/ 3,
/*unsigned char Panpot;*/ 64,
/*unsigned char voiceFamily;*/ 8,
/*char PoliphonicPriority;*/ 1,
/*unsigned char Env_Attack;*/ 64,
/*unsigned char Env_Decay;*/ 64,
/*unsigned char Env_Release;*/ 64,
/*unsigned char Env_Delay;*/ 40,
/*unsigned char RndTune_Probability;*/ 4,
/*unsigned char RndTune_MaxCents;*/ 4,
/*unsigned char pitch;*/ 59,
/*unsigned char pipe;*/ 0,
/*unsigned char outch;*/ 1,
/*unsigned char Dummy2[7];*/ {0,0,0,0,0,0,0},
/*unsigned char ShortNomeVoce[9];*/ "Princ 16",
/*unsigned char volume_nbn[128];*/
{
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
36
Capitolo 4
27 novembre 2008
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64
},
/*unsigned char tone_nbn[128];*/
{
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32
},
/*unsigned char pitch_nbn[128];*/
{
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64
}
},
{
//PEDAL >> Timbri_RAM[Tab0][Rank0][ VoicePalette1]
/*unsigned char Sysexcode;*/ 152,
/*unsigned char NomeVoce[LENGTH_OF_NAMES+1];*/
……………………………………………………………………………."Violon Bass 16' ",
/*unsigned char orgPar t_exist;*/ 0,
/*unsigned char cc32;*/ 4,
/*unsigned char cc0;*/ 0,
/*unsigned char pc;*/ 2,
/*unsigned char volume;*/ 113,
/*unsigned char filter;*/ 64,
/*unsigned char micro_panpot;*/ 3,
/*unsigned char Panpot;*/ 64,
/*unsigned char voiceFamily;*/ 8,
/*char PoliphonicPriority;*/ 1,
/*unsigned char Env_Attack;*/ 64,
/*unsigned char Env_Decay;*/ 64,
/*unsigned char Env_Release;*/ 64,
/*unsigned char Env_Delay;*/ 40,
/*unsigned char RndTune_Probability;*/ 4,
/*unsigned char RndTune_MaxCents;*/ 4,
/*unsigned char pitch;*/ 64,
/*unsigned char pipe;*/ 0,
/*unsigned char outch;*/ 1,
/*unsigned char Dummy2[7];*/ {0,0,0,0,0,0,0},
/*unsigned char ShortNomeVoce[9];*/ "Viol 16",
/*unsigned char volume_nbn[128];*/
37
Capitolo 4
27 novembre 2008
{
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64
},
/*unsigned char tone_nbn[128];*/
{
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32
},
/*unsigned char pitch_nbn[128];*/
{
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64
}
},
{
//PEDAL >> Timbri_RAM[Tab0][Rank0][VoicePalette2]
…
/*unsigned char NomeVoce[LENGTH_OF_NAMES+1];*/
"Vuoto ",
….
},
{
//PEDAL >> Timbri_RAM[Tab0][Rank0][VoicePalette3]
…
…
},
{
//PEDAL >> Timbri_RAM[Tab0][Rank0][VoicePalette4]
…
…
},
{
//PEDAL >> Timbri_RAM[Tab0][Rank0][VoicePalette5]
…
…
},
{
//PEDAL >> Timbri_RAM[Tab0][Rank0][VoicePalette6]
…
38
Capitolo 4
27 novembre 2008
…
},
{
//PEDAL >> Timbri_RAM[Tab0][Rank0][VoicePalette7]
…
…
},
{
{
},
{
//PEDAL >> Timbri_RAM[Tab0][Rank1][VoicePalette1]
….
},
{
//PEDAL >> Timbri_RAM[Tab0][Rank1][VoicePalette2]
…
},
{
//PEDAL >> Timbri_RAM[Tab0][Rank1][VoicePalette3]
…
}
},
{
//PEDAL >> Timbri_RAM[Tab0][Rank1][VoicePalette4]
…
},
{
//PEDAL >> Timbri_RAM[Tab0][Rank1][VoicePalette5]
…
},
{
//PEDAL >> Timbri_RAM[Tab0][Rank1][VoicePalette6]
…
},
{
//PEDAL >> Timbri_RAM[Tab0][Rank1][VoicePalette7]
}
}
},
{
{
{
//PEDAL >> Timbri_RAM[Tab1][Rank0][VoicePalette0]
…
},
{
//PEDAL >> Timbri_RAM[Tab1][Rank0][VoicePalette1]
…
},
{
//PEDAL >> Timbri_RAM[Tab1][Rank0][VoicePalette2]
…
},
{
39
Capitolo 4
27 novembre 2008
Come si può facilmente evincere dal codice precedente, l‟ accesso alle voci
risulta possibile mediante 3 indici fondamentali:
40
Capitolo 4
27 novembre 2008
41
Capitolo 4
27 novembre 2008
NUM ERO
INDICI VA LORI
F0 SYSEX OFFSET VA LORI CK F7
VOCE MODIFICATI
MODIFICATI
42
Capitolo 4
27 novembre 2008
43
Capitolo 4
27 novembre 2008
44
Capitolo 4
27 novembre 2008
Figura 4.3 – Dispositivo di interfaccia di tipo slider per la modifica del valore
numerico; essa risulta richiamabile col pulsante >EDITA< dalle 2 finestre di
editing.
45
Capitolo 4
27 novembre 2008
Figura 4.3 – Finestra di dialogo che consente la selezione multi timbrica delle 244
voci.
46
Capitolo 5
27 novembre 2008
Figura 5.1 – Elenco delle 5 Dialog di progetto visualizzabili dal Developer Studio.
NOME_DIALOG Descrizione
Finestra relat iva all‟ ed iting dei parametri
dei 3 parametri di tipo vettore modificali
IDD_ DIALOG_ NOTA tramite l‟ imp lementazione grafica d i una
tastiera virtuale costituita da 128 tasti
musicali.
47
Capitolo 5
27 novembre 2008
Di seguito vengono riportate la lista dei file .cpp e .h sviluppati nel Visual C++ e
l‟ elenco delle immagini utilizzate nelle creazioni grafiche dell‟ intera interfaccia.
Figura 5.2 – Lista dei file .cpp e .h sviluppati nel Visual C++ e l‟ elenco .delle immagini
utilizzate nelle creazioni grafiche dell‟ intera interfaccia.
48
Capitolo 5
27 novembre 2008
Il codice C++ per la costruzione della finestra di dialogo principale risulta definito
nel file RODGER_i385_GUIDlg.cpp; ad essa è stato assegnato il nome
identificativo: IDD_RODGERS_i385_GUI_DIALOG.
Dal editor grafico del Visual C++ è possibile visionarne la composizione
individuando i diversi dispositivi d‟ interfaccia integrati tramite l‟ apposito GUI
designer tipico dell„ ambiente di sviluppo usato.
Compaiono:
26 Pulsanti “ON” che consentono la selezione della rispettiva voce
2 Combo_Box che permettono la selezione del Rank e della Voice Palette
1 Combo_Box realitava alla selezione del Device_Midi
2 Pulsanti che aprono le 2 Dialog di visualizzaione dei parametri
editabili.
1 Pulsante che opera l‟ accesso alla dialog di multi selezione (senza
editing) di più voci.
49
Capitolo 5
27 novembre 2008
g_dati_RAM[NUMBER_OF_TIMBRES][COUPLED_VOIC ES][NUMBER_OF_VOICES];
void CRODGERS_i385_GUIDlg::CaricaBaroqueRom()
{
int i , j, k ;
g_dati_RAM[i][j][k] = baroque_ROM[i][j][k];
}
}
}
return;
}
50
Capitolo 5
27 novembre 2008
CBitmapButton m_Button_ON1;
…
…
CBitmapButton m_Button_ON26;
La gestione dell‟ evento di Click tramite mouse su ogni singolo pulsante è stata
possibile con l‟ utilizzo del ClassWizard, associando ad ogni tasto il tipo di
messaggio ON_BN_CLICKED secondo la seguente mappatura:
ON_BN_CLICKED(IDC_ON1, OnOn1)
…
…
ON_BN_CLICKED(IDC_ON26, OnOn26)
void CRODGERS_i385_GUIDlg::OnOn1()
{
ModificaTab(0);
timbre = 0;
m_cEdButtonParVoce.EnableWindow(TRUE);
m_cEdButtonParNota.EnableWindow(TRUE);
}
51
Capitolo 5
27 novembre 2008
void CRODGERS_i385_GUIDlg::OnOn2()
{
ModificaTab(1);
timbre = 1;
m_cEdButtonParVoce.EnableWindow(TRUE);
m_cEdButtonParNota.EnableWindow(TRUE);
}
…
…
void CRODGERS_i385_GUIDlg::OnOn26()
{
ModificaTab(25);
timbre = 25;
m_cEdButtonParVoce.EnableWindow(TRUE);
m_cEdButtonParNota.EnableWindow(TRUE);
}
52
Capitolo 5
27 novembre 2008
m_cCmbRank.ResetContent();
m_cCmbPalette.ResetContent();
str.Format(_T(g_dati_RAM[tab][1][0].NomeVoce));
if( str!="Vuoto ")
{
curr_rank=1;
}
53
Capitolo 5
27 novembre 2008
void CRODGERS_i385_GUIDlg::OnSelchangeComboRank()
{
int i;
int selection = m_cCmbRank.GetCurSel();
coupled = selection;
m_cCmbPalette.ResetContent();
La selezione del Rank provoca anche il cambiamento degli elementi della Combo
Voice Palette; dopo il suo reset tale combo viene riempita con gli elementi
NomeVoce in base alla variabile globale timbre e alla selection (rank selezionato)
con un indice i di scorrimento. Alla fine viene settato di default il primo elemento.
void CRODGERS_i385_GUIDlg::OnSelchangeComboPalette
{
int selection = m_cCmbPalette.GetCurSel();
voice = selection;
54
Capitolo 5
27 novembre 2008
m_cCmbMidiDevice.ResetContent();
55
Capitolo 5
27 novembre 2008
Figura 5.4 – Composizione strutturale della dialog principale con l‟ utilizzo di elementi
attivi e reattivi d‟ interfaccia sfruttando le possibilità di integrazione grafica tramite il
caricamento di immagini di background e sulla superfice dei vari oggetti d‟ interfaccia.
bitmap.LoadBitmap( IDB_BACK_SEL_VOCE );
BITMAP bmp;
bitmap.GetBitmap( &bmp );
memdc.CreateCompatibleDC( &dc );
memdc.SelectObject( &bitmap );
CRect rect;
GetClientRect(rect);
56
Capitolo 5
27 novembre 2008
57
Capitolo 5
27 novembre 2008
(bianco) (bianco)
Pulsante rilasciato
Pulsante non Pulsante in fase di (effettuata la Pulsante
cliccato click (schiacciato) selezione) disabilitato
Evidente come quello più importante (nel nostro caso) sia il FOCUS che permette
di mantenere evidenziata la voce di registro principale selezionata (mentre gli
altri 25 pulsanti restano di default bianchi).
void CRODGERS_i385_GUIDlg::OnButtonEditParVoce()
{
CEditParDlg dlg;
dlg.DoModal();
return;
}
void CRODGERS_i385_GUIDlg::OnButtonEditParNota()
{
CEditParNotaDlg dlg;
dlg.DoModal();
return;
}
I 2 metodi associati al click di tali pulsanti aprono le 2 dialog relative all‟ editing
di tutti i parametri della voce selezionata; segue il codice relativo anche al
caricamento delle apposite bitmaps sulla lora superficie grafica.
m_cEdButtonParVoce.LoadBitmaps(IDB_EDIT_VOCE_UP, IDB_EDIT_VOCE_DOWN ,
IDB_EDIT_VOCE_UP, IDB_EDIT_NOTA_DISABLE);
…
…
m_cEdButtonParNota.LoadBitmaps(IDB_EDIT_NOTA_UP, IDB_EDIT_NOTA_DOWN ,
IDB_EDIT_NOTA_UP, IDB_EDIT_NOTA_DISABLE);
58
Capitolo 5
27 novembre 2008
CString m_cEdNomeVoce;
CString m_cEdSysexCode;
CString m_cEdOrgPart_Exist;
CString m_cEdControlChange32;
CString m_cEdControlChange0;
CString m_cEdProgramChange;
59
Capitolo 5
27 novembre 2008
CString m_cEdVolume;
CString m_cEdFilter;
CString m_cEdMicroPanpot;
CString m_cEdPanpot;
CString m_cEdVoiceFamily;
CString m_cEdPoliphonicPriority;
CString m_cEdEnvAttack;
CString m_cEdEnvDecay;
CString m_cEdEnvRelease;
CString m_cEdEnvDelay;
CString m_cEdRandomTuneProbability;
CString m_cEdRandomTuneMaxCents;
CString m_cEdPitch;
CString m_cEdPipe;
CString m_cEdOutch;
CString m_cEdDummy0;
…
CString m_cEdDummy6;
CString m_cEdShortNomeVoce;
Come si può evincere dal codice estratto dal file header corrispondente, ad ogni
parametro è assegnata una variabile (membro) di controllo di tipo CString. Per i 2
parametri stringa l‟ editing viene effettuato direttamente immettendo o cambiando
caratteri da tastiera. Per tutti gli altri, che assumono principalmente valore
numerico da 0 a 128 , la modifica può essere effettuata cliccando sul
corrispondente pulsante “EDITA”, attraverso l‟ apertura di un‟ apposita finestra
di editing (le cui caratteristiche verranno specificate in seguito). Ogni bottone di
edit è stato identificato con un opportuno ID evidenziando in modo univoco il
parametro a cui risulta associato. Con il ClassWizard, successivamente, ad ogni
tasto è stato associato il tipo di messaggio ON_BN_CLICKED secondo la
seguente mappatura:
ON_BN_CLICKED(IDC_BUTTON_SYSEX, OnButtonSysex)
ON_BN_CLICKED(IDC_BUTTON_ORGPARTEX, OnButtonOrgpar tex)
ON_BN_CLICKED(IDC_BUTTON_CC32, OnButtonCc32)
ON_BN_CLICKED(IDC_BUTTON_CC0, OnButtonCc0)
ON_BN_CLICKED(IDC_BUTTON_PC, OnButtonPc)
ON_BN_CLICKED(IDC_BUTTON_VOLUME, OnButtonVolume)
ON_BN_CLICKED(IDC_BUTTON_FILTER, OnButtonFilter)
ON_BN_CLICKED(IDC_BUTTON_MICRO_PANPOT, OnButtonMicroPanpot)
ON_BN_CLICKED(IDC_BUTTON_PANPOT, OnButtonPanpot)
ON_BN_CLICKED(IDC_BUTTON_VOICE_FAMILY, OnButtonVoiceFamily)
ON_BN_CLICKED(IDC_BUTTON_POLIPHONIC_PRIORITY, OnButtonPoliphonicPriority)
ON_BN_CLICKED(IDC_BUTTON_ENV_ATTACK, OnButtonEnvAttack)
ON_BN_CLICKED(IDC_BUTTON_ENV_DECAY, OnButtonEnvDecay)
ON_BN_CLICKED(IDC_BUTTON_MICRO_ENV_RELEASE, OnButtonMicroEnvRelease)
ON_BN_CLICKED(IDC_BUTTON_ENV_DELAY, OnButtonEnvDelay)
ON_BN_CLICKED(IDC_BUTTON_RANDOM_TUNE_PROB, OnButtonRandomTuneProb)
60
Capitolo 5
27 novembre 2008
ON_BN_CLICKED(IDC_BUTTON_RANDOM_TUNE_MAXCENTS, OnButtonRandomTunMaxcents)
ON_BN_CLICKED(IDC_BUTTON_PITCH, On ButtonPitch)
ON_BN_CLICKED(IDC_BUTTON_PIPE, OnButtonPipe)
ON_BN_CLICKED(IDC_BUTTON_OUTCH, OnButtonOutch)
ON_BN_CLICKED(IDC_BUTTON_DUMMY_0, OnButtonDummy0)
…
ON_BN_CLICKED(IDC_BUTTON_DUMMY_6, OnButtonDummy6)
BOOL CEditParDlg::OnInitDialog()
{
CDialog::OnInitDialog();
UpdateData(FALSE);
return TRUE;
}
61
Capitolo 5
27 novembre 2008
void CEditParDlg::OnButtonSysex()
{
CSLIDERDlg dlg;
min_range = 0;
max_range = 255;
p = &g_dati_RAM[timbre][coupled][voice].Sysexcode;
if(dlg.DoModal() == ID_BUTTON_SLIDER_MODIFICA)
{
m_cEdSysexCode.For mat("% ld", *p);
UpdateData(FALSE);
}
return;
}
void CEditParDlg::OnButtonOrgpartex()
{
CSLIDERDlg dlg;
min_range = 0;
max_range = 127;
p = &g_dati_RAM[timbre][coupled][voice].orgPar t_exist;
if(dlg.DoModal() == ID_BUTTON_SLIDER_MODIFICA)
{
m_cEdOrgPart_Exist.For mat("% ld", *p);
UpdateData(FALSE);
}
return;
}
Nella funzione membro viene aperta una istanza della CSLIDERDlg (dialog per l'
editing del parametro selezionato), successivamente si fissano i range massimo e
minimo nelle rispettive variabili globali necessarie per l' utente e per la funzione
62
Capitolo 5
27 novembre 2008
opportuna affinchè si possa fissare (in fase di editing) un corretto valore tra quelli
assumibili dal parametro stesso.
Importante anche l' assegnazione dell' indirizzo del campo relativo alla quantità
in editing alla varibile globale p; tale puntatore passato alla dialog CSLIDERDlg
si caratterizza come l' unico modo per identificare e modificare correttamente il
campo della matrice g_dati_RAM[][][] contenente il valore da editare.
Il codice nella parte finale permette di aggiornare il valore della varibile di
controllo (e quindi del parametro) quando l' utente decide di confermare la
modifica effettuata nell' apposita Dialog (CSLIDERDlg) per cui, tramite il
"puntatore globale" p, si può facilmente aggiornarne il valore nella finestra di
origine (che altrimenti, senza tale operazione, avrebbe visualizzati i "vecchi"
valori senza update).
Tutto ciò che riguarda la costruzione, l‟ impiego delle idonee API di windows per
la corretta organizzazione del messaggio e per l‟ utilizzo del Device selezionato, e
quindi l‟ invio midi finale è contenuto nella funzione membro :
NUM ERO
INDICI VA LORI
F0 SYSEX OFFSET VA LORI CK F7
VOCE MODIFICATI
MODIFICATI
costituito da 300 elementi di tipo unsigned char (1 byte). Analizziamo ora più
approfonditamente la parte di codice riguardante la MakeSysex.
63
Capitolo 5
27 novembre 2008
&g_dati_RAM[21][0][4].filter - &g_dati_RAM[21][0][4].Sysexcode;
//MESSAGGIO MIDI
midi_array[0] = 0xF0;
midi_array[1] = 0x41;
midi_array[2] = 0x10;
midi_array[3] = 0x30;
midi_array[4] = 0x12;
midi_array[5] = timbre;
midi_array[6] = coupled;
midi_array[7] = voice;
64
Capitolo 5
27 novembre 2008
#ifdef INTEL_TYPE
midi_array[11] = (char) (offset & 0x000F) ;
midi_array[10] = (char) ((offset & 0x00F0) >> 4);
midi_array[9] = (char) ((offset & 0x0F00) >> 8);
midi_array[8] = (char) ((offset & 0xF000) >> 12);
#else
midi_array[8] = (char) (offset & 0x000F) ;
midi_array[9] = (char) ((offset & 0x00F0) >> 4);
midi_array[10] = (char) ((offset & 0x0F00) >> 8);
midi_array[11] = (char) ((offset & 0xF000) >> 12);
#endif
65
Capitolo 5
27 novembre 2008
midi_array[12] = dim;
for (i=0; i<=dim-1; i++)
{
midi_array[13+i] = *pValue++;
}
um = 0;
for (w=5 ; w <=13 + (dim-1) ; w++)
{
sum += midi_array[w] ;
}
midi_array[13+dim] = ck;
midi_array[13+dim+1] = 0xF7;
Nella parte finale del messaggio midi viene calcolato il checksum ovvero una
somma di controllo. Si tratta di una sequenza di bit che risulta utilizzata per
verificare l'integrità del messaggio sommando tutti i byte dall‟ elemento subito
dopo i bytes che identificano l‟ exclusive message. fino a quello che identifica
l‟ ultimo dei valori assumibili dal parametro. Il checksum risulta memorizzato nel
penultimo elemento prima dell‟ F7 finale nel midi_array[]. Per controllare
l'integrità del messaggio in ricezione sarà sufficiente effettuare la stessa
operazione di somma e confrontarla con il checksum memorizzato. Se i due valori
coincidono, i dati possono essere considerati integri.
66
Capitolo 5
27 novembre 2008
midipor t = midi_device;
MIDIHDR* pHeader = new MIDIHDR;
pHeader->lpData = (char *) &midi_array[0];
pHeader->dwBufferLength = 200;
pHeader->dwBytesRecorded = (13+dim+1);
pHeader->dwFlags=0;
67
Capitolo 5
27 novembre 2008
La funzione è quella che permette l‟ invio del messaggio e deve essere preceduta
obbligatoriamente dalla midOutPrepareHeader da cui riprende la stessa
tipologia di parametri.
midiOutClose(device);
Figura 5.4 – Pulsante SEND SYSEX che consente la formattazione e l‟ invio del
messaggio midi (exclusive system message) contenenti le varie modifiche nella voce
interessata.
void CEditParDlg::OnOK()
{
MakeSysex2 (&g_dati_RAM[timbre][coupled][voice].Sysexcode , 2);
unsigned char * p;
char *p_temp;
p_temp = &g_dati_RAM[timbre][coupled][voice].NomeVoce[0];
p = (unsigned char*) p_temp;
MakeSysex(p , 17);
MakeSysex(&g_dati_RAM[timbre][coupled][voice].orgPart_exist , 1);
MakeSysex(&g_dati_RAM[timbre][coupled][voice].cc32 , 1);
MakeSysex(&g_dati_RAM[timbre][coupled][voice].cc0, 1);
68
Capitolo 5
27 novembre 2008
MakeSysex(&g_dati_RAM[timbre][coupled][voice].pc , 1);
MakeSysex(&g_dati_RAM[timbre][coupled][voice].volume , 1);
MakeSysex(&g_dati_RAM[timbre][coupled][voice].filter , 1);
MakeSysex(&g_dati_RAM[timbre][coupled][voice].micro_panpot , 1);
MakeSysex(&g_dati_RAM[timbre][coupled][voice].Panpot , 1);
MakeSysex(&g_dati_RAM[timbre][coupled][voice].voiceFamily , 1);
p_temp = &g_dati_RAM[timbre][coupled][voice].PoliphonicPriority;
p = (unsigned char*) p_temp;
MakeSysex(p , 1);
MakeSysex(&g_dati_RAM[timbre][coupled][voice].Env_Attack , 1);
MakeSysex(&g_dati_RAM[timbre][coupled][voice].Env_Decay , 1);
MakeSysex(&g_dati_RAM[timbre][coupled][voice].Env_Release , 1);
MakeSysex(&g_dati_RAM[timbre][coupled][voice].Env_Delay , 1);
MakeSysex(&g_dati_RAM[timbre][coupled][voice].RndTune_Probability , 1);
MakeSysex(&g_dati_RAM[timbre][coupled][voice].RndTune_MaxCents , 1);
MakeSysex(&g_dati_RAM[timbre][coupled][voice].pitch , 1);
MakeSysex(&g_dati_RAM[timbre][coupled][voice].pipe , 1);
MakeSysex(&g_dati_RAM[timbre][coupled][voice].outch , 1);
MakeSysex(&g_dati_RAM[timbre][coupled][voice].Dummy2[0] , 7);
CDialog::OnOK();
}
#ifdef INTEL_TYPE
midi_array[14] = (*p_value & 0x0F) ;
midi_array[13] = ((*p_value & 0xF0) >> 4);
#else
69
Capitolo 5
27 novembre 2008
70
Capitolo 5
27 novembre 2008
Figura 5.5 – Composizione strutturale della dialog per la modifica di 3 parametri multi
valore. La tastiera virtuale consente una visione globale dei 3 parametri consentendo
un‟ interazione agevolata rispetto all‟accesso nello strumento reale.
71
Capitolo 5
27 novembre 2008
Nel file header relativo alla dialog corrente è possibile visionare la definizione di
tutti i 128 pulsanti nel seguente modo:
CBitmapButton m_cNOTA0;
…
…
CBitmapButton m_cNOTA127;
Anche in questo caso ogni bottone è stato identificato con un opportuno ID a cui
risulta associato, con il ClassWizard, successivamente, il tipo di messaggio
ON_BN_CLICKED secondo la seguente mappatura:
ON_BN_CLICKED(IDC_NOTA0, OnNota0)
…
…
ON_BN_CLICKED(IDC_NOTA0, OnNota127)
void CEditParNotaDlg::OnNota0()
{
m_cEdVolumeNbn.For mat("% ld",_T(g_dati_RAM[timbre][coupled][voice].volume_nbn[0]));
m_cEdToneNbn.For mat("% ld",_T(g_dati_RAM[timbre][coupled][voice].tone_nbn[0]));
m_cEdPitchNbn.Format("% ld",_T(g_dati_RAM[timbre][coupled][voice].pitch_nbn[0]));
72
Capitolo 5
27 novembre 2008
Il click sulla nota0 per prima cosa opera la formattazione dei valori nelle 3
variabili membro delle rispettive editbox impostando, logicamente, come indice
dei 3 vettori volume_nbn[], tone_nbn[] e pitch_nbn[] il numero 0.
p_volume = &g_dati_RAM[timbre][coupled][voice].volume_nbn[0];
p_tone = &g_dati_RAM[timbre][coupled][voice].tone_nbn[0];
p_pitch = &g_dati_RAM[timbre][coupled][voice].pitch_nbn[0];
Il nome della nota selezionata viene visualizzata nella rispettiva casella di testo
dell‟ interfaccia grafica.
m_cButtonVolumeNbn.EnableWindow(TRUE);
m_cButtonToneNbn.EnableWindow(TRUE;
m_cButtonPitchNbn.EnableWindow(TRUE);
UpdateData(FALSE);
}
CButton m_cButtonPitchNbn;
CButton m_cButtonToneNbn;
CButton m_cButtonVolumeNbn;
ON_BN_CLICKED(IDC_BUTTON_VOLUME_NBN, OnButtonVolumeNbn)
ON_BN_CLICKED(IDC_BUTTON_TONE_NBN, OnButtonToneNbn)
ON_BN_CLICKED(IDC_BUTTON_PITCH_NBN, OnButtonPitchNbn)
73
Capitolo 5
27 novembre 2008
void CEditParNotaDlg::OnButtonVolumeNbn()
{
CSLIDERDlg dlg;
min_range = 0;
max_range = 127;
p = p_volume;
if(dlg.DoModal() == ID_BUTTON_SLIDER_MODIFICA)
{
m_cEdVolumeNbn.For mat("% ld", *p);
UpdateData(FALSE);
}
return;
}
Si evidenzia il fatto che le varie funzioni membro risultano identiche a quelle già
illustrate per i pulsanti di EDIT presenti nella Dialog dei parametri generali
(Parametri Voce); l‟ unica differenza sta nell‟ assegnazione dei 3 puntatori
temporanei (p_volume, p_tone, p_pitch) a p in base al tipo di parametro che si
indende modificare.
void CEditParNotaDlg::OnButtonInviaModifiche()
{
MakeSysex (&g_dati_RAM[timbre][coupled][voice].volume_nbn[0] , 127);
MakeSysex (&g_dati_RAM[timbre][coupled][voice]. tone_nbn[0] , 127);
MakeSysex (&g_dati_RAM[timbre][coupled][voice].pitch_nbn[0] , 127);
74
Capitolo 5
27 novembre 2008
EndDialog(ID_BUTTON_INVIA_MODIFICHE);
}
75
Capitolo 5
27 novembre 2008
76
Capitolo 5
27 novembre 2008
(bianco)
(bianco)
Tasto rilasciato
Tasto Tasto in fase di Tasto
(effettuata la
non cliccato click (schiacciato) disabilitato
selezione)
Figura 5.7 - Caricamento di bitmap sulla superficie dei pulsanti relativi ai tasti bianchi
per la creazione e il funzionamento della virtual keyboard, sfruttando la proprietà
Owner Draw
Tasto rilasciato
Tasto Tasto in fase di Tasto
(effettuata la
non cliccato click (schiacciato) disabilitato
selezione)
Figura 5.8 - Caricamento di bitmap sulla superficie dei pulsanti relativi ai tasti neri per
la creazione e il funzionamento della virtual keyboard, sfruttando la proprietà Owner
Draw
77
Capitolo 5
27 novembre 2008
La modifica del valore numerico dei vari parametri ralativi alla voce selezionata
nella dialog principale, avviene attraverso il click sull‟ apposito pulsante
>EDITA< che opera l‟ apertura di una nuova finestra qui visualizzata:
Figura 5.9 – Dialog per la modifica del valore relativo al parametro in editing. L‟
elemento di tipo reattivo implementato è un cursore scorribile orizzontalmente definot
come Slider.
L‟ elemento principale della dialog risulta essere il cursore in alto che l‟ utente
può muovere orizzontalmente tramite il mouse. Si tratta di un nuovo oggetto
implementabile direttamente dal developer studio definito come slide r. Ai suoi
estremi sono sistemate 2 editbox (non modificabili dall‟ utente) cui vengono
fissatti i range massimo e minimo del parametro corrente in editing. Ciò
garantisce anche un„ ottima tolleranza verso gli errori dell‟ utente evitando l‟
inserimento di valori non validi. Nella parte centrale vi è posizionato un altro
editbox per la visualizzazione del valore attuale del parametro che risulta
aggiornato opportunamente ad ogni spostamento del cursore interno allo slider.
Per rendere effettiva la modifica apportata al valore, l‟ utente deve cliccare sul
78
Capitolo 5
27 novembre 2008
pulsante in basso. In tale modo viene aggiornato sia il valore del campo
corrispondente al parametro nella struttura voci in RAM, sia la quantità
visualizzata nella dialog di origine. Il funzionamento dettagliato di quanto
illustrato risulta definito nei file di progetto SLIDERDlg.cpp e .h .
BOOL C SLIDERDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_cEdSlider1.SetRangeMin(("% d", min_range), false);
m_cEdSlider1.SetRangeMax(("% d", max_range), false);
m_cEdSliderValue.For mat("% ld", *p);
m_cEdMinRange.For mat("% ld", min_range);
m_cEdMaxRange.For mat("% ld", max_range);
m_cButtonSlider.LoadBitmaps(IDB_SLIDER_UP, IDB_SLIDER_DOWN ,
IDB_SLIDER_UP, ID B_DISABLE);
…
}
La funzione membro interna alla dialog che gestisce le funzionalità dello slider è
la seguente:
if(nSBCode == SB_THUMBPOSITION) {
m_cEdSliderValue.For mat("% ld", nPos);
slider_value = 0;
slider_value = nPos;
UpdateData( false);
}
else {
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
80
Capitolo 5
27 novembre 2008
CSelezioneVociMultipleDlg dlg;
int i =0;
int sum ,ck ,w ;
ck = 0;
midi_voci[0] = 0xF0;
midi_voci[1] = 0x41;
midi_voci[2] = 0x10;
midi_voci[3] = 0x30;
midi_voci[4] = 0x12;
midi_voci[5] = 0x01;
midi_voci[6] = 0x00;
midi_voci[7] = 0x00;
midi_voci[8] = 0x00;
midi_voci[9] = 0x00;
midi_voci[10] = 0x00;
midi_voci[11] = 0x00;
midi_voci[12] = 0x00;
midi_voci[13] = 0x00;
midi_voci[14] = 0x00;
midi_voci[15] = 0x00;
midi_voci[16] = 0x00;
midi_voci[17] = 0x00;
midi_voci[18] = 0x00;
81
Capitolo 5
27 novembre 2008
midi_voci[19] = 0x00;
midi_voci[20] = 0x00;
midi_voci[21] = 0x00;
midi_voci[22] = 0x00;
midi_voci[23] = 0x00;
midi_voci[24] = 0x00;
midi_voci[25] = 0x00;
midi_voci[26] = 0x00;
midi_voci[27] = 0x00;
midi_voci[28] = 0x00;
midi_voci[29] = 0x00;
midi_voci[30] = 0x00;
midi_voci[31] = 0x00;
midi_voci[32] = 0x00;
midi_voci[33] = 0x00;
midi_voci[34] = 0x00;
midi_voci[35] = 0x00;
midi_voci[36] = 0x00;
midi_voci[37] = 0x00;
midi_voci[38] = 0x00;
midi_voci[39] = 0x00;
midi_voci[40] = 0x00;
midi_voci[41] = 0x00;
// Calcolo del Checksum
sum = 0;
for (w=7 ; w <=41 ; w++)
{
sum += midi_voci[w] ;
}
sum &= 0x7F;
ck = (128 - sum)&0x7F;
midi_voci[42] = ck;
midi_voci[43] = 0xF7;
dlg.DoModal();
return;
}
82
Capitolo 5
27 novembre 2008
83
Capitolo 5
27 novembre 2008
Nella lista ad ogni bottone corrisponde una voce; le voci selezionate hanno il
rispettivo led acceso (rosso) mentre le altre risultano spente.
I file di progetto per la costruzione e il funzionamento di questo dispositivo d‟
interfaccia sono: SelezioneVociMultipleDlg.cpp, LedButton.cpp, Led.cpp,
ButtonListBox.cpp e i rispettivi file header.
La creazione di ogni singolo bottone della lista è difinita dalla seguente classe
dichiarata nel file LedButton.h :
// Attr ibutes
private:
CRect m_LEDLocation;
COLORREF m_TextColour;
COLORREF m_ButtonColour;
CWnd* m_pParent;
CString m_ButtonText;
long m_ButtonId;
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CLedButton();
84
Capitolo 5
27 novembre 2008
CLed m_Led;
BOOL CreateLED();
DECLARE_MESSAGE_MAP()
};
La creazione di una nuova istanza all‟ interno della lista bottoni è data dal metodo
CLedButton* pAddedButton;
static int count = 0;
CRect rect;
CRect ButtonRect;
count++;
GetClientRect( rect );
BOOL C SelezioneVociMultipleDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_curr_indice=0;
InsertVoce("unused");
InsertVoce("16'Principal");
InsertVoce("16'Flute");
InsertVoce("8'Principal");
…
…
InsertVoce("_spare_");
InsertVoce("Test/Tune Mode");
InsertVoce("_spare_");
InsertVoce("_spare_");
InsertVoce("_spare_");
85
Capitolo 5
27 novembre 2008
void CLedButton::OnClicked()
{
HWND ParentHwnd = m_pParent->m_hWnd;
::PostMessage(ParentHwnd,UM_BUTTON_CLICK,0,(DWORD)this);
}
86
Capitolo 5
27 novembre 2008
acceso = false;
acceso = pButton->GetLed()->GetLedMode()==CLed::LED_ON;
CString sel = pButton->GetButtonText();
long idSel = pButton->GetButtonId();
if(Parent)
{
::PostMessage(Parent->
m_hWnd,WM_SEND_PARAM,idSel,(DWORD) this);
87
Capitolo 5
27 novembre 2008
}
}
return CListBox::PreTranslateMessage(pMsg);
}
Nella parte finale importante è l‟ assegnazione del valore dell‟ ID, relativo al
bottone selezionato tramite il metodo della classe CButton definito GetButtonId(),
alla variabile idSel. Successivamente viene richimata la funzione membro di
windows PostMessage() di cui verranno approfondite le sue specifiche.
Il suo costrutto base è dato da:
BOOL PostMessage(
HWND hWnd,
UINT Msg,
WPARAM w Param,
LPARAM lParam
);
88
Capitolo 5
27 novembre 2008
param_ 1 = (idSel/7) + 7;
param_ 2 = idSel%7;
param_ 3 = 0;
switch(param_2) {
Tale metodo riceve come parametro l‟ id del bottone cliccato e lo assegna alla
variabile locale idSel. Effettua poi il calcolo dei parametri 1 e 2. Sfruttando il
fatto che le voci risultano disposte in gruppi di 7 (ogni gruppo identifica 1 byte),
si possono calcolare facilmente il byte e il bit corrispondenti alla voce selezionata.
Il param_1 indica il numero del byte a cui appartiene la voce e viene calcolato con
una semplice divisione incrementato poi di 7 in quanto i primi 6 elementi dell‟
array sono occupati dall codifica del messaggio esclusivo. Il param_2 indica il
numero del bit da settare ad 1, ed è ottenuto come resto della divisione precedente.
89
Capitolo 5
27 novembre 2008
90
Capitolo 6
27 novembre 2008
91
Capitolo 6
27 novembre 2008
Figura 6.1 – Midi-Monitor software in grado di creare una connessione midi virtuale del
sistema operativo interfacciandosi (virtualmente) con l‟ applicativo d‟ interfaccia
sviluppato per la verifica dei messaggi midi inviati.
Il software crea una connessione midi virtuale all‟ interno del sistema operativo
in cui è installato (8 device di I/O denominati MIDI Yoke 1 – 8). Quindi
lanciando l‟ eseguibile dell‟ interfaccia grafica del Rodgers i538 nella combo box
relativa alla scelta del Device Midi da utilizzare per la comunicazione, si
seleziona il MidiDevice0 corrispondente al canale MIDI Yoke 1. Risulta quindi
possibile visualizzare i messaggi midi in “uscita” dall‟ interfaccia verificandone la
correttezza compositiva.
Nel primo esempio si esegue la verifica del messaggio inviabile dalla prima
interfaccia di editing (PARAMETRI VOCE). Dopo aver selezionato una voce
principale semplicemente cliccando sul pulsante SEND SYSEX (senza effettuare
alcuna modifica ai 23 parametri visualizzati) la GUI invierà il messaggio midi
standardizzato (par. 5.3.3) sul canale di comunicazione indicato.
92
Capitolo 6
27 novembre 2008
93
Capitolo 6
27 novembre 2008
94
Capitolo 6
27 novembre 2008
Tale finestra di dialogo, come già visto, è caratterizzata dal particolare dispositivo
dì interazione grafica di tipo tastiera virtuale. Il messaggio esclusivo relativo ai
suoi 3 parametri editabili è esaminabile nell‟ interfaccia del midi- monitor in
Figura 6.2 . Le 3 sequenze mostrano una stessa lunghezza complessiva dei
messaggi esclusivi inviati dall‟ interfaccia; ciò riflette la prerogativa di
inserimento e formattazione dei blocchi midi conformemente alla natura dai
parametri rappresentati, che in questo caso hanno una strutturazione vettoriale
monodimensionale costituita di 128 elementi ciascuno.
95
Capitolo 6
27 novembre 2008
Nel terzo ed ultimo esempio si esegue la verifica del messaggio inviabile dall‟
interfaccia di multi selezione timbrica nell‟ insieme delle voci strutturanti
l‟ organo Rodgers i538.
I blocchi in sequenza inoltre non sono contemporanei come nei due esempi
precedenti; ma risultano ottenuti in più interazioni consecutive con la lista di
bottoni eseguendo le seguenti operazioni:
96
Capitolo 6
27 novembre 2008
Da notare come in questo caso non vi sia una creazione dinamica del messaggio
esclusivo come avviene invece negli esempi precedenti. All‟ apertura di tale
finestra si inizializza un vettore di 44 elementi la cui lunghezza rimane costante
nell‟ intera fase di interazione con l‟ utente in quanto il numero di voci rimane
costante; varia sol il numero di quelle effettivamente attive.
97
Capitolo 7
27 novembre 2008
98
Capitolo 7
27 novembre 2008
Elenco delle funzionalità dell‟ interfaccia adibite all‟ invio dei messaggi
esclusivi garantendo anche l‟ apertura e il corretto utilizzo delle componenti API
del sistema:
individuazione dei 3 indici di accesso alla voce desiderata
invio multiplo dei messaggi (più sequenze di blocchi racchiusi dai byte
F0 – F7)
inserimento dei nuovi valori nei relativi campi della struttura parametri
per ogni livello di sottovoci a cui si riferisce
99
Capitolo 7
27 novembre 2008
francese
barocca
inglese
americana
100
Capitolo 7
27 novembre 2008
101
Capitolo 7
27 novembre 2008
Organi a 2 MANUALI
Organi a 3 MANUALI
Organi a 4 MANUALI
Organi a 5 MANUALI
102
Capitolo 7
27 novembre 2008
EDITING EDITING
PARAMETRI PARAMETRI
VOCE NOTA
103
27 novembre 2008
104
APPENDICE A
27 novembre 2008
- APPENDICE A -
Caratteristica Descrizione
Definibile anche come politimbricità : si intende la
MULTITIMBRICITÀ capacità di generare simultaneamente diverse
timbriche, assegnando a ciascuna di esse un numero
variaile delle voci polifoniche a disposizione.
E‟ defininibile come un dispositivo hardaware (ma
oggi è molto utilizzato anche la tipologia software)
SEQUENCER che permette di creare e produrre delle sequenze di
segnal idi controllo per comandare uno strumento
elettronico
105
APPENDICE B
27 novembre 2008
- APPENDICE B -
106
APPENDICE C_1
27 novembre 2008
- APPENDICE C_1-
Files di progetto per la costruzione della dialog relativa alle voci della lista
bottoni del par. 5.6.
InsertVoce("8'Voce Umana");
InsertVoce("8' Gemshorn Celeste II");
InsertVoce("8' Flute Harmonique");
InsertVoce("8' Rohrflote");
InsertVoce("8' Gemshorn");
InsertVoce("8' Flauto Dolce");
InsertVoce("8' Flute Celeste");
InsertVoce("8' Unda Maris II");
InsertVoce("4' Octave");
InsertVoce("4' Gedacktflote");
InsertVoce("2' 2/3 Nasat");
InsertVoce("2' Superoctave");
InsertVoce("2' Waldflote");
InsertVoce("1' 1/3 Quint");
InsertVoce("Sesquialtera II");
InsertVoce("1' 3/5 Terz");
InsertVoce("IV - V Mi xture");
InsertVoce("III Sharf");
InsertVoce("16' Posaune");
InsertVoce("8' Trompete");
InsertVoce("8' Trompette Harmonique");
InsertVoce("8' Krummhorn");
InsertVoce("8' French Horn");
InsertVoce("8' Klarine");
InsertVoce("Harp");
InsertVoce("Carillon");
InsertVoce("Harpsichord");
InsertVoce("Piano");
InsertVoce("Great Tremulant");
InsertVoce("16' Great to Great");
InsertVoce("4' Great to Great");
InsertVoce("4' Flauto Dolce");
InsertVoce("4' Flauto Celeste");
InsertVoce("_spare_");
InsertVoce("8' Prestant");
InsertVoce("8' Gedackt");
InsertVoce("4' Principal");
InsertVoce("4' Koppeflote");
InsertVoce("2' 2/3 Nasard");
InsertVoce("2' Oktave");
InsertVoce("1' 1/3 Spitzquinte");
InsertVoce("1' Sifflote");
InsertVoce("III -IV Sharf");
InsertVoce("16' Dulzian");
InsertVoce("8' Krummhorn");
InsertVoce("Harpsichord");
InsertVoce("Positiv tremulant");
InsertVoce("positiv Unisson Off");
InsertVoce("_spare_");
InsertVoce("_spare_");
InsertVoce("16' Bourdon Doux");
InsertVoce("String");
InsertVoce("8' Viola Pomposa");
InsertVoce("8' Viola Celeste");
InsertVoce("8' Viola Celeste II");
InsertVoce("8' Muted Viols II");
107
APPENDICE C_1
27 novembre 2008
InsertVoce("8' Bourdon");
InsertVoce("8' Flauto Dolce");
InsertVoce("8' Flute Celeste");
InsertVoce("8' Flute Celeste II");
InsertVoce("8' Gamba");
InsertVoce("8' Echo Gamba");
InsertVoce("4' Principal");
InsertVoce("4' Nachthorn");
InsertVoce("2' 2/3 Nasard");
InsertVoce("2' Doublette");
InsertVoce("2' Blockflote");
InsertVoce("1' 3/5 Tierce");
InsertVoce("1' Sifflote");
InsertVoce("Sesquialtera II");
InsertVoce("IV Plein jeu");
InsertVoce("III C ymbale");
InsertVoce("Contre Basson");
InsertVoce("8' Festival Trumpet");
InsertVoce("8' Trompette");
InsertVoce("8' Hautbois");
InsertVoce("8' Voix Humaine (mf)");
InsertVoce("8' Voix Humaine (mp)");
InsertVoce("4' Clairon");
InsertVoce("Swell Tremulant");
InsertVoce("16' swell to swell");
InsertVoce("Swell Unison off");
InsertVoce("4' swell to swell");
InsertVoce("_spare_");
InsertVoce("_spare_");
InsertVoce("_spare_");
InsertVoce("Pedal Chamade");
InsertVoce("Choir Chamade");
InsertVoce("Great Chamade");
InsertVoce("Swell Chamade");
InsertVoce("Solo Chamade");
InsertVoce("_spare_");
InsertVoce("_spare_");
InsertVoce("_spare_");
InsertVoce("16' Contre Erzahler");
InsertVoce("8' Salicional");
InsertVoce("8' Viola Celeste");
InsertVoce("8' Hohflote");
InsertVoce("8' Echo Celeste II");
InsertVoce("4' Spitzpincipal");
InsertVoce("4' Lieblichflote");
InsertVoce("4' Octave Erzahler");
InsertVoce("2' 2/3 Nasard");
InsertVoce("2' Octave");
InsertVoce("2' Flachflote");
InsertVoce("1' 1/3 Quintflote");
InsertVoce("1' Sifflote");
InsertVoce("Mouted Cornet III");
InsertVoce("III Mi xture");
InsertVoce("8' Troumpette Harmonique");
InsertVoce("8' Major Tuba");
InsertVoce("8' Krummhorn");
InsertVoce("8' Harpsichord");
InsertVoce("8' Harp");
InsertVoce("Choir Tremulant");
InsertVoce("16' choir tp choir");
InsertVoce("Choir Unison off");
InsertVoce("4' choir tp choir");
InsertVoce("8' Concert Flute");
InsertVoce("8' Erzhler");
108
APPENDICE C_1
27 novembre 2008
109
APPENDICE C_1
27 novembre 2008
110
APPENDICE C_2
27 novembre 2008
- APPENDICE C_2 -
FIles di progetto per la costruzione della dialog relativa alla lista di bottoni (par.
5.6)
FILE ButtonListBox.cpp
#include "stdafx.h"
#include "ButtonListBox.h"
#include "Global.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
bool acceso;
/////////////////////////////////////////////////////////////////////////////
// CButtonListBox
CButtonListBox::CButtonListBox()
{
}
CButtonListBox::~CButtonListBox()
{
for(int i=0; i<= m_ButtonArray.GetUpperBound();i ++)
delete m_ButtonArray.ElementAt(i);
}
///////////////////////////////////////////////////////////////////
/////Creazione di un nuovo elemento (bottone) all' interno/////////
/////della lista bottoni inserendo la stringa e l' id relativi/////
///////////////////////////////////////////////////////////////////
void CButtonListBox::AddItem(LPCTSTR ButtonText,long idButton)
{
CLedButton* pAddedButton;
static int count = 0;
CRect rect;
CRect ButtonRect;
count++;
GetClientRect( rect );
111
APPENDICE C_2
27 novembre 2008
//Adds a string and assigns nIndex the index of the current item
int nIndex = AddString( "" );
/////////////////////////////////////////////////////////////////////////////
// CButtonListBox message handlers
void CButtonListBox::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
CListBox::PreSubclassWindow();
}
if(!pLedButton)
return;
pLedButton->MoveWindow(LedButtonRect);
pLedButton->CentreLED();
pLedButton->ShowWindow( SW_SHOW );
//////////////////////////////////////////////////////////////////
////Gestione evento di attivazione o disattivazione di una////////
////singola voce (accensione o spegnimento led corrispondete)////
///all' interno della listbox////////////////////////////////////
112
APPENDICE C_2
27 novembre 2008
/////////////////////////////////////////////////////////////////
BOOL CButtonListBox::PreTranslateMessage(MSG* pMsg)
{
CLedButton* pButton = NULL;
Parent = GetParent();//(?????)
//Se ricevo un messaggio di click su una voce verifico se tale voce deve
//essere spenta o accesa (a seconda dello stato iniziale)
if(pMsg->message == UM_BUTTON_CLICK)
{
pButton = (CLedButton*)pMsg->lParam;
//spegnimento voce
}
else
{
pButton->GetLed()-
>SetLed(CLed::LED_COLOR_RED,CLed::LED_ON,CLed::LED_ROUND);
//accensione voce
}
acceso = false;
acceso = pButton->GetLed()->GetLedMode()==CLed::LED_ON;
if(Parent)
{ //In vio alla finestra di un messaggio definito WM_SEND_PARAM
// e il secondo messaggio (idSel) relativo all' ID del bottone
//cliccato
::PostMessage(Parent-
>m_hWnd,WM_SEND_PARAM,idSel,(DWORD)this);
}
}
return CListBox::PreTranslateMessage(pMsg);
}
FILE Led.cpp
#include "stdafx.h"
#include "resource.h"
#include "Led.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
113
APPENDICE C_2
27 novembre 2008
/////////////////////////////////////////////////////////////////////////////
// CLed
#define TIMER_ID_PING 1 // Timer Ping ID
#define TIMER_ID_FLASH 2 // Flash Timer ID
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
CLed::CLed()
{
m_LedBitmap.LoadBitmap(IDB_LEDS);
m_nLedColor = LED_COLOR_RED;
m_nLedMode = LED_OFF;
m_nLedShape = LED_ROUND;
m_Flashing = FALSE;
CLed::~CLed()
{
VERIFY(m_LedBitmap.DeleteObject());
}
/////////////////////////////////////////////////////////////////////////////
// CLed message handlers
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void CLed::OnPaint()
{
CPaintDC dc(this); // device context for painting
DrawLed(&dc,m_nLedColor,m_nLedMode,m_nLedShape);
///////////////////////////////////////////////////////////////////////////////
// Name: SetLed
// Description: This method will draw the LED to the specified DC.
//
// Entry:
// CDC *pDC - DC to draw to
//
// int iLedColor - Where color is defined by:
// LED_COLOR_RED
// LED_COLOR_GREEN
// LED_COLOR_YELLOW
// LED_COLOR_BLUE
//
// int iMode - where mode is defined by:
114
APPENDICE C_2
27 novembre 2008
// LED_ON
// LED_OFF
// LED_DISABLED
//
// int iShape - where shape is defined by:
// LED_ROUND
// LED_SQUARE
///////////////////////////////////////////////////////////////////////////////
void CLed::DrawLed(CDC *pDC,int nLEDColor, int nMode, int nShape)
{
CRect rect;
GetClientRect(&rect);
//
// Center led within an oversized window
//
if(rect.Width() >= LED_SIZE && rect.Height() >= LED_SIZE)
{
int nWidth = rect.Width();
int nHeight = rect.Height();
rect.left += (nWidth - LED_SIZE)/2;
rect.right -= (nWidth - LED_SIZE)/2;
rect.top += (nHeight - LED_SIZE)/2;
rect.bottom -= (nHeight - LED_SIZE)/2;
}
//
// Prepare temporary DCs and bitmaps
//
CBitmap TransBitmap;
TransBitmap.CreateBitmap(LED_SIZE,LED_SIZE,1,1,NULL);
CBitmap bitmapTemp;
CBitmap* pBitmap = &m_LedBitmap;
CDC srcDC;
CDC dcMask;
CDC TempDC;
TempDC.CreateCompatibleDC(pDC);
srcDC.CreateCompatibleDC(pDC);
dcMask.CreateCompatibleDC(pDC);
//
// Work with tempDC and bitmapTemp to reduce flickering
//
CBitmap *pOldBitmapTemp = TempDC.SelectObject(&bitmapTemp);
TempDC.BitBlt(0, 0, LED_SIZE, LED_SIZE, pDC, rect.left, rect.top, SRCCOPY);
//
// Create mask
//
COLORREF OldBkColor = srcDC.SetBkColor(RGB(255,0,255));
dcMask.BitBlt(0, 0, LED_SIZE, LED_SIZE,&srcDC, nMode*LED_SIZE,
nLEDColor+nShape, SRCCOPY);
TempDC.SetBkColor(OldBkColor);
//
// Using the IDB_LEDS bitmap, index into the bitmap for the appropriate
// LED. By using the mask color (RGB(255,0,255)) a mask has been created
// so the bitmap will appear transparent.
//
115
APPENDICE C_2
27 novembre 2008
//
// Since the actual minipulation is done to tempDC so there is minimal
// flicker, it is now time to draw the result to the screen.
//
pDC->BitBlt(rect.left, rect.top, LED_SIZE, LED_SIZE, &TempDC, 0, 0,
SRCCOPY);
//
// House cleaning
//
srcDC.SelectObject(pOldBitmap);
dcMask.SelectObject(pOldMaskbitmap);
TempDC.SelectObject(pOldBitmapTemp);
VERIFY(srcDC.DeleteDC());
VERIFY(dcMask.DeleteDC());
VERIFY(TempDC.DeleteDC());
VERIFY(TransBitmap.DeleteObject());
VERIFY(bitmapTemp.DeleteObject());
}
///////////////////////////////////////////////////////////////////////////////
// Name: SetLed
// Description: This method will draw and set led parameters.
//
// Entry: int iLedColor - Where color is defined by:
// LED_COLOR_RED
// LED_COLOR_GREEN
// LED_COLOR_YELLOW
// LED_COLOR_BLUE
//
// int iMode - where mode is defined by:
// LED_ON
// LED_OFF
// LED_DISABLED
//
// int iShape - where shape is defined by:
// LED_ROUND
// LED_SQUARE
///////////////////////////////////////////////////////////////////////////////
void CLed::SetLed(int nLedColor, int nMode, int nShape)
{
m_nLedColor = nLedColor;
m_nLedMode = nMode;
m_nLedShape = nShape;
CDC *pDC;
pDC = GetDC();
DrawLed(pDC,m_nLedColor,m_nLedMode,m_nLedShape);
ReleaseDC(pDC);
}
///////////////////////////////////////////////////////////////////////////////
// Name: Ping
// Description: This method will turn the led on for dwTimeout milliseconds and
// then turn it off.
//
// Entry: DWORD dwTimeout - Time out in milliseconds
///////////////////////////////////////////////////////////////////////////////
116
APPENDICE C_2
27 novembre 2008
m_bPingEnabled = TRUE;
SetLed(m_nLedColor,CLed::LED_ON,m_nLedShape);
SetTimer(TIMER_ID_PING,dwTimeout,NULL);
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void CLed::OnTimer(UINT nIDEvent)
{
if(nIDEvent == TIMER_ID_PING)
{
SetLed(m_nLedColor,CLed::LED_OFF,m_nLedShape);
KillTimer(nIDEvent);
m_bPingEnabled = FALSE;
}
else if(nIDEvent == TIMER_ID_FLASH)
{
if(GetLedMode() == LED_OFF)
SetLed(m_nLedColor,CLed::LED_ON,m_nLedShape);
else
{
if(GetLedMode() == LED_ON)
SetLed(m_nLedColor,CLed::LED_OFF,m_nLedShape);
}
KillTimer(nIDEvent);
SetTimer(TIMER_ID_FLASH,m_FlashRate,NULL);
}
CStatic::OnTimer(nIDEvent);
}
///////////////////////////////////////////////////////////////////////////////
117
APPENDICE C_2
27 novembre 2008
///////////////////////////////////////////////////////////////////////////////
BOOL CLed::OnEraseBkgnd(CDC* pDC)
{
// No background rendering
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
FILE SelezioneVociMultiple.Dlg
#include "stdafx.h"
#include "RODGERS_i385_GUI.h"
#include "SelezioneVociMultipleDlg.h"
#include <stdio.h>
#include "conio.h"
#include "windows.h"
#include "mmsystem.h"
#include "voicedata.h"
#include "SLIDERDlg.h"
#include "Global.h" //mdr_par
#include "ButtonListBox.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSelezioneVociMultipleDlg dialog
118
APPENDICE C_2
27 novembre 2008
ON_WM_PAINT()
//}}AFX_ MSG_ MAP
END_MESSAGE_ MAP()
///////////////////////////////////////////////////////////////////////////////////////
///////////////////SETTAGGIO BIT DELLE VOCI SELEZIONATE////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
LRESULT CSelezioneVociMultipleDlg::OnSendParam(WPARAM wParam, LPARAM
lParam)
{
long idSel=wParam;//id del pulsante selezionato
int param_1,param_2;
unsigned char param_3;
switch(param_2) {
if(acceso)
{
midi_voci[param_1] = midi_voci[param_1] | param_3;//Settaggio del bit
corrisondente a 1.Si effettua l' OR col byte corrispondente in modo di lasciare a 0 (o a 1)
gli altri bit già eventualmente impostati.
}
else
119
APPENDICE C_2
27 novembre 2008
{
midi_voci[param_1] = midi_voci[param_1] - param_3;//Settaggio del bit
corrispondente a 0.
}
return 0;
}
/////////////////////////////////////////////////////////////////////////////
// CSelezioneVociMultipleDlg message handlers
////////////////////////////////////////////////////////////////////////////
///Fun zione membro di creazione e inserimento di un nuovo elemento/////////
///all' interno della lista di bottoni dove ognuno identifica una voce/////
///Con la InsertVoce passo la stringa "name" con cui AddItem crea una //////
///nuova instanza contraddistinta da quel nome a cui assegna (in modo)/////
///progressivo un indice che rappresenta l' idButton. Tale indi ce /////////
//risulta necessario per identificare il bottone spento o acceso dall//////
///utente. ////////////////////////////////////////////////////////////////
void CSelezioneVociMultipleDlg::InsertVoce(LPCSTR name)
{
m_ButtonListBox.AddItem(name,m_curr_indice);
m_curr_indice++;
}
BOOL CSelezioneVociMultipleDlg::OnInitDialog()
{
CDialog::OnInitDialog();
120
APPENDICE C_2
27 novembre 2008
return TRUE;
}
//////////////////////////////////////////////////////
////FOR MATTAZIONE E IN VIO MESSAGGIO ESCLUSIVO/////////
////Alla pressione di un qualsiasi pulsante della/////
//Lista bottoni (sia per accensione sia per //////////
//spegnimento di una voce) viene inviato il //////////
//messaggio midi_voci[44] contenete i bit settati/////
//ad 1 delle voci accesse ////////////////////////////
void CSelezioneVociMultipleDlg::SendSysex()
{
int i =0;
int sum ,ck ,w ;
ck = 0;
short offset=0;
int midiport;
//int rc;
HMIDIOUT device; //MIDI de vice interface for hold data for Midi messages;
midiport = midi_device;
MIDIHDR* pHeader = new MIDIHDR;
pHeader->lpData = (char *) &midi_voci[0];
pHeader->dwBufferLength = 44;
pHeader->dwBytesRecorded = 44;
pHeader->dwFlags=0;
midiOutClose(device);
}
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
121
APPENDICE C_2
27 novembre 2008
void CSelezioneVociMultipleDlg::OnOK()
{
// TODO: Add e xtra validation here
CDialog::OnOK();
}
////////////////////////////////////////////////////
////BackGround BITMAP///////////////////////////////
////////////////////////////////////////////////////
void CSelezioneVociMultipleDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
CDC memdc;
BITMAP bmp;
bitmap.GetBitmap( &bmp );
memdc.CreateCompatibleDC( &dc );
memdc.SelectObject( &bitmap );
CRect rect;
GetClientRect(rect);
122
APPENDICE D
27 novembre 2008
- APPENDICE D-
41 5 6 4' Koppeflote
42 6 0 2' 2/3 Nasard
43 6 1 2' Oktave
44 6 2 1' 1/3 Spitzquinte
45 6 3 1' Sifflote
46 6 4 III -IV Sharf
47 6 5 16' Dulzian
48 6 6 8' Krummhorn
49 7 0 Harpsichord
50 7 1 Positiv tremulant
51 7 2 positiv Unisson Off
52 7 3 spare_
53 7 4 spare_
54 7 5 16' Bourdon Doux
55 7 6 String
56 8 0 8' Viola Pomposa
57 8 1 8' Viola Celeste
58 8 2 8' Viola Celeste II
59 8 3 8' Muted Viols II
60 8 4 8' Bourdon
61 8 5 8' Flauto Dolce
62 8 6 8' Flute Celeste
63 9 0 8' Flute Celeste II
64 9 1 8' Gamba
65 9 2 8' Echo Gamba
66 9 3 4' Principal
67 9 4 4' Nachthorn
68 9 5 2' 2/3 Nasard
69 9 6 2' Doublette
70 10 0 2' Blockflote
71 10 1 1' 3/5 Tierce
72 10 2 1' Sifflote
73 10 3 Sesquialtera II
74 10 4 IV Plein jeu
75 10 5 III Cymbale
76 10 6 Contre Basson
77 11 0 8' Festival Trumpet
78 11 1 8' Trompette
79 11 2 8' Hautbois
80 11 3 8' Voix Humaine (mf)
81 11 4 8' Voix Humaine (mp)
82 11 5 4' Clairon
83 11 6 Swell Tremulant
84 12 0 16' swell to swell
85 12 1 Swell Unison off
86 12 2 4' swell to swell
87 12 3 spare_
88 12 4 spare_
124
APPENDICE D
27 novembre 2008
89 12 5 spare_
90 12 6 Pedal Chamade
91 13 0 Choir Chamade
92 13 1 Great Chamade
93 13 2 Swell Chamade
94 13 3 Solo Chamade
95 13 4 spare_
96 13 5 spare_
97 13 6 spare_
98 14 0 16' Contre Erzahler
99 14 1 8' Salicional
100 14 2 8' Viola Celeste
101 14 3 8' Hohflote
102 14 4 8' Echo Celeste II
103 14 5 4' Spitzpincipal
104 14 6 4' Lieblichflote
105 15 0 4' Octave Erzahler
106 15 1 2' 2/3 Nasard
107 15 2 2' Octave
108 15 3 2' Flachflote
109 15 4 1' 1/3 Quintflote
110 15 5 1' Sifflote
111 15 6 Mouted Cornet III
112 16 0 III Mixture
113 16 1 8' Troumpette Harmonique
114 16 2 8' Major Tuba
115 16 3 8' Krummhorn
116 16 4 8' Harpsichord
117 16 5 8' Harp
118 16 6 Choir Tremulant
119 17 0 16' choir tp choir
120 17 1 Choir Unison off
121 17 2 4' choir tp choir
122 17 3 8' Concert Flute
123 17 4 8' Erzhler
124 17 5 8' Erzhler CelesteII
125 17 6 8' Flauto Mirabilis
126 18 0 8' Gross Gamba
127 18 1 8' Gamba Celeste
128 18 2 4' Doppelflute
129 18 3 2' 2/3 Flute twelfth
130 18 4 2' Piccolo
131 18 5 Grand jeu VIII
132 18 6 16' Contre Bombarde
133 19 0 8' Fanfare Trumpet
134 19 1 8' Tube Mirabilis
135 19 2 8' English horn
136 19 3 8' French horn
125
APPENDICE D
27 novembre 2008
126
APPENDICE D
27 novembre 2008
127
APPENDICE D
27 novembre 2008
233 33 2 _spare_
234 33 3 _spare_
235 33 4 _spare_
236 33 5 _spare_
237 33 6 _spare_
238 34 0 _spare_
239 34 1 _spare_
240 34 2 _spare_
241 34 3 Test/Tune Mode
242 34 4 _spare_
243 34 5 _spare_
244 34 6 _spare_
128
27 novembre 2008
129
BIBLIOGRAFIA
27 novembre 2008
9. - BIBLIOGRAFIA
1
Mike Blaszczak, “Professional MFC with Visual C++ 6”, Asad Altimeemy , Sep 2000.
2
Microsoft Press and Microsoft Corporation, “Microsoft Visual C++: C Language
Reference (Microsoft Visual C++)”, Paperback, Jul 1996.
3
Richard P. Braden, “C to C++ Conversion: For Users of Microsoft Visual C++
Development System for Windows (Hands-on Windows Programming Series/Richard
P. Braden, Bk 8)”, Paperback, 1996.
4
Richard M. Jones, “Introduction to MFC Programming with Visual C++ (Microsoft
Technologies Series)”, Paperback, 2000.
5
Harvey M. Deitel, Paul J. Deitel, Tem Nieto, and Edward Strassberger, "Getting Started
with Microsoft Visual C++ 6 with an Introduction to MFC (2nd Edition)", Paperback,
2000.
6
Microsoft Corporation, "Microsoft Visual C++ 6.0 Reference Library (Microsoft
Professional Edition)", Paperback, 1998.
7
Microsoft Corporation, "Mastering - MFC Development Using Microsoft Visual C++
6.0", Mondadori Informatica, 2000.
8
Robert Guérin, “L'interfaccia digitale per gli strumenti musicali”, Apogeo, 2003.
9
SWANKE JOHN E., “VISUAL C++ MFC PROGRAMMING BY EXAMPLE”, CMP BOOKS,
1999
10
Jeff Prosise, "Programming Windows® with MFC, Second Edition", Microsoft Press,
1999.
11
M. Mattioli, M. Matteuzzi, "Fare Musica con il PC", Hoepli, 1999).
12
Enrico Cosimi, “Analog & Virtual Analog. Come funziona un sintetizzatore”, Il
Musichiere, 2003.
13
Roland Europe S.p.a ,C.D. Gelatt, M.P. Vecchi, “Manuele interno all’ azienda:
implementazione MIDI”, 2000.
14
Roland Europe S.p.a , “Manuele interno all’ azienda: caratteristiche tecniche di
funzionamento dell’ organo liturgico RODGERs i538”, 2006.
130
27 novembre 2008
131
NOTE
27 novembre 2008
10. - NOTE
132
27 novembre 2008
133