From 18abece8f8a8af17a3b5e80dc1baf61457409600 Mon Sep 17 00:00:00 2001
From: Nao Pross <naopross@thearcway.org>
Date: Fri, 2 Feb 2018 12:12:18 +0100
Subject: 2 February 2018

Documentation:
  - new API documentation
  - datasheets for new components
  - update BOM
  - update documentation data

Hardware:
  - update schematic for MIDI connector

Software:
  - new MIDI API
  - update prject target to PIC18F45K22
---
 doc/xilofono.tex | 240 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 232 insertions(+), 8 deletions(-)

(limited to 'doc/xilofono.tex')

diff --git a/doc/xilofono.tex b/doc/xilofono.tex
index a2b473e..0ad9ddc 100644
--- a/doc/xilofono.tex
+++ b/doc/xilofono.tex
@@ -2,17 +2,34 @@
 
 % language / document
 \usepackage[italian]{babel}
+
+% font
 \usepackage{lmodern} % font
 \usepackage{anyfontsize}
+
+% urls 
+\usepackage{url}
+\urlstyle{tt}
+
 % figures
 \usepackage{float} % place figures
 \usepackage{pgfplots} % plts
+\usepackage{tikz-timing}
 \usepackage[european]{circuitikz} % circuiti elettrici
 \usepackage{tikzscale} % scale tikz images
+\pgfplotsset{compat=1.15}
 
+% tables
+\usepackage{array}
+\usepackage{booktabs}
 
-\pgfplotsset{compat=1.15}
+% code
+\usepackage{listings}
 
+% parskip
+\setlength{\parskip}{1em}
+
+% metadata
 \title{Xilofono MIDI}
 \author{Naoki Pross, \textit{SAM Bellinzona}}
 
@@ -25,10 +42,10 @@
 
 \section{Requisiti}
 Lo Xilofono digitale \`e un dispositivo in grado di rilevare le note suonate dall'utente per poi salvarle in un dispositivo esterno in formato MIDI.
-Esso \`e costruito utilizzando parti da uno Xilofono ``Sonor Tag 25'' modificato con dell'elettronica esterna.
+Esso \`e costruito utilizzando parti da uno Xilofono ``Sonor Tag 25'' modificato con dei circuiti di misura.
 
 \section{Elemento piezoelettrico}
-Il sensore piezoelettrico quando colpito genera una tensione oscillante come mostrato nella figura \ref{fig:piezo-waveform}. La tensione generata dal piezo \`e pi\`u che sufficiente per entrare direttamente in un circuito digitale di misura CMOS; l'unica correzione necessaria \`e la parte negativa dell'oscillazione che deve essere smorzata.
+Il sensore piezoelettrico quando colpito genera una tensione oscillante come mostrato nella figura \ref{fig:piezo-waveform}. La tensione generata ha bisogno solamente di una correzzione minimale per poter entrare in un circuito di misura CMOS. \`E necessario quindi rimuovere o smorzare la parte negativa dell'oscillazione.
 \begin{figure}[H] \centering
 \begin{tikzpicture}
 \begin{axis}[
@@ -38,14 +55,12 @@ Il sensore piezoelettrico quando colpito genera una tensione oscillante come mos
 	grid=major,
 	grid style=dotted
 ]
-
 	\addplot [color=black, smooth, thick] table [
 		mark=none,
 		each nth point=2,
 		x=Time, y=Smooth,
 		col sep=semicolon
 	] {data/piezo-waveform.csv};
-
 \end{axis}
 \end{tikzpicture}
 \caption{
@@ -55,16 +70,225 @@ Il sensore piezoelettrico quando colpito genera una tensione oscillante come mos
 \end{figure}
 
 \section{Circuito di misura}
-Per ogni listello della tastiera dello strumento \`e presente un circuito di misura composto da un elemento piezoelettrico, che rileva il colpo, ed un comparatore per digitalizzare il segnale per il microcontroller.
+Per ogni listello della tastiera dello strumento \`e presente un circuito di misura composto dall'elemento piezoelettrico, per rilevare il colpo, e dei diodi che limitano la tensione tra \(V_{cc}\) (5V) e \(V_{ss}\)(0V).
+
+Il piezoelettrodo utilizzato \`e un Murata 7BB-20-06 con una frequenza di risonanza di \(6.3\pm 0.6~\mathrm{kHz}\).
 \begin{figure}[H] \centering
 	\includegraphics[width=\linewidth]{figures/reduced-circ.tikz}
+	\caption{Circuito di misura}
 \end{figure}
 
 \section{Microcontroller}
 Per gestire i segnali forniti dai circuiti di misura \`e presente un PIC18F44K22, che esporta le informazioni delle note suonate in formato MIDI via seriale.
 
-\section{Software}
-\subsection{Formato MIDI}
+\section{Protocollo MIDI}
+L'acronimo MIDI (Musical Instrument Digital Interface) indica il protocollo standard per l'interazione degli strumenti musicali elettronici, anche tramite un computer\cite{wiki:midi}.
+
+\subsection{Specifiche hardware}
+Il protocollo MIDI \`e composto da pi\`u parti per il trasporto, i file e per l'hardware. Per questo progetto \`e utilizzato unicamente il protocollo di trasporto, le informazioni sono trasmesse attraverso una porta seriale RS232 a due fili, utilizzando il connettore di uscita DIN 5 Pin (DIN 41524).
+
+\begin{figure}[H]
+\centering
+\begin{tikzpicture}[scale=1.5]
+	\timing at (0,1)  {L4D{Status}4D{D0}4D{D1}4D{D2}4D{...}};
+	\timing at (0,.5) {L4D{0x90}4D{0x3C}4D{0x7F}4L4L};
+	%\timing at (0,0)  {
+\end{tikzpicture}
+\caption{Esempio di trasmissione MIDI}
+\end{figure}
+
+Il formato originale per la trasmissione seriale MIDI \`e un \emph{current loop} a cui il valore logico 0 \`e assegnato al passaggio di una corrente di 5 mA\cite{gweep}.
+
+\subsection{Specifiche software}
+La trasmissione seriale MIDI \`e definita come standard a \(31'250\pm 1\%\) baud con 1 start bit, frame da 8 bit e 1 stop bit. Un messaggio (o pacchetto)\footnote{In questo documento i due termini sono utilizzati intercambiabilmente.} MIDI incomincia con uno \emph{Status Byte} (vedi tabella \ref{tab:status-bytes}) seguito se necessario da altri byte di dati.
+Per migliorare le prestazioni \`e definito che se il byte di status viene omesso, il dispositivo ricevente assume che lo status sia uguale all'ultimo messaggio ricevuto (running status).
+
+\subsection{Protocollo -- Messaggi di canale}
+Il nibble (4 bit) basso del byte di status viene utilizzato per la selezione del canale. I 16 canali disponibili sono controllati mandando dei pacchetti di tipo \emph{channel voice} o di tipo \emph{channel mode}.
+
+\subsubsection{Channel mode}
+Un messaggio con status \texttt{0xBn} se il primo dato \(D_0 \geq 120\) \`e detto un pacchetto \emph{channel mode}. Il pacchetto viene interpretato come un impostazione del \emph{base channel}, ossia modifica le impostazioni dell'intero canale.
+\begin{figure}[H]
+\centering
+\begin{tikzpicture}[scale=2]
+	\timing at (0, 0) {L5D{1000 nnnn}5D{0111 1011}5D{ 0000 0000 }L};
+\end{tikzpicture}
+\caption{Esempio di messaggio channel mode ANO (all notes off) che ha \(D_0 = 123\) (\(\geq 120\))} 
+\end{figure}
+	
+\subsubsection{Channel voice}
+I messaggi con status tra \texttt{0x8n} e \texttt{0xEn}, esclusi i pacchetti channel voice, sono detti pacchetti \emph{channel voice} e servono per indicare al dispositivo come deve suonare una nota (controllo della voce).
+\begin{figure}[H]
+\centering
+\begin{tikzpicture}[scale=2]
+	\timing at (0, 0) {L5D{1000 nnnn}5D{ 0111 0xxx }L};
+\end{tikzpicture}
+\end{figure}
+
+\subsection{Protocollo -- Messaggi di sistema}
+I messaggi di sistema generalmente sono utilizzati per impostare la configurazione del dispositivo ricevente e non sono quindi utilizzati per riprodurre suoni o note.
+I messaggi di sistema sono a loro volta suddivisi in 3 tipi.
+
+\subsubsection{System Exclusive}
+\subsubsection{System Common}
+\subsubsection{System Real Time}
+
+\subsection{Messaggi di interesse per il progetto}
+
+\section{Implementazione dell'API MIDI}
+\subsection{API multipiattaforma}
+Per il progetto \`e stato implementato un API (Application Programming Interface) che permette di generare in maniera conveniente dei messaggi MIDI.
+La struttura dati \texttt{midi\_message\_t} \`e allineata con dei bit-fields\cite[P.150]{xc8} ed un flexible array member (\texttt{data[]}) in modo da poter essere mandata direttamente come \texttt{void*} (void pointer) attraverso la seriale.
+
+% replace with lstings?
+\begin{minipage}{\linewidth}
+\begin{verbatim}
+typedef struct {
+    unsigned status :4;
+    unsigned channel :4;
+    uint8_t data[];
+} midi_message_t;
+\end{verbatim}
+\end{minipage}
+
+Sono definite in oltre le seguenti enumerazioni per migliorare la leggibilit\`a del codice.
+
+\begin{minipage}{\linewidth}
+\begin{verbatim}
+typedef enum {
+    C = 0, 		// Do
+    D = 1, 		// Re
+    E = 2, 		// Mi
+    F = 3, 		// Fa
+    G = 4, 		// Sol
+    A = 5, 		// La
+    B = 6, 		// Si
+} midi_note_t;
+\end{verbatim}
+\end{minipage}
+
+\begin{minipage}{\linewidth}
+\begin{verbatim}
+typedef enum {
+    NOTE_ON             = 0x8,
+    NOTE_OFF            = 0x9,
+    POLYPHONIC_KEYPRESS = 0xA,
+    CONTROLLER          = 0xB,
+    PROGRAM_CHANGE      = 0xC,
+    CHANNEL_PRESSURE    = 0xD,
+    PITCH_BLEND         = 0xF
+} midi_status_t;
+\end{verbatim}
+\end{minipage}
+
+\subsection{API per dispositivi senza allocazione di memoria dinamica}
+Purtroppo alcuni microcontrollori, tra cui il PIC18F45K22 non supportano l'allocazione di memoria dinamica necessaria per instanziare il flexible array member della struttura \texttt{midi\_message\_t}. Dunque la libreria MIDI \`e stata modificata per utilizzare la struttura dati come segue.
+
+\begin{minipage}{\linewidth}
+\begin{verbatim}
+typedef struct {
+    unsigned status :4;
+    unsigned channel :4;
+    size_t data_size;
+    uint8_t data[MIDI_DATA_MAX_SIZE];
+} midi_message_t;
+\end{verbatim}
+\end{minipage}
+
+Nello specifico, nel file header si presenta nel seguente modo.
+La macro \texttt{MIDI\_DYNAMIC\_MEMORY\_ALLOC}, normalmente non definita, indica all'API che pu\`o usufruire dell'allocazione dinamica. Quindi che le funzioni \texttt{malloc} e \texttt{free} siano implementate.
+
+\begin{minipage}{\linewidth}
+\begin{verbatim}
+typedef struct {
+    unsigned status :4;
+    unsigned channel :4;
+    
+#ifdef MIDI_DYNAMIC_MEMORY_ALLOC
+    uint8_t data[];
+#else
+    size_t data_size;
+    uint8_t data[MIDI_DATA_MAX_SIZE];
+#endif
+} midi_message_t;
+\end{verbatim}
+\end{minipage}
+
+Lo svantaggio di questa interfaccia \`e che non rende possibile mandare direttamente i pacchetti MIDI come un qualsiasi buffer. \`E necessario infatti implementare una funzione specifica per ogni piattaforma.
+
+\begin{minipage}{\linewidth}
+\begin{verbatim}
+int eusart_write_midi(midi_message_t *pkt)
+{
+  if (pkt == NULL) {
+    return -1;
+  }
+    
+  if (pkt->data == NULL) {
+    return -2;
+  }
+    
+  size_t length = pkt->data_size;
+  uint8_t *data = pkt->data;
+    
+  putch((pkt->status<<4) | pkt->channel);
+    
+  while (length--) {
+    putch(*(data++));
+  }
+    
+  return 0;
+}
+\end{verbatim}
+\end{minipage}
+
+
+\begin{table*}[ht]
+\caption{Sommario degli status bytes\label{tab:status-bytes}}
+\centering
+\begin{tabular}{>{\tt}c >{\tt}c c l}
+	\toprule
+	\multicolumn{2}{c}{\bfseries Status Byte} & \bfseries Data size & \bfseries Descrizione \\
+	\footnotesize Hex & \footnotesize Bin & & \\
+	\midrule
+	8n & 1000 nnnn & 2 & Note off \\
+	9n & 1001 nnnn & 2 & Note on \\
+	An & 1010 nnnn & 2 & Polyphonic key (Aftertouch) \\
+	Bn & 1011 nnnn & 2 & Controller \( D_0 < 120 \) \\
+	Cn & 1100 nnnn & 1 & Program change \\
+	Dn & 1101 nnnn & 1 & Channel pressure (Aftertouch) \\
+	En & 1110 nnnn & 2 & pitch bend \\
+	\midrule
+	Bn & 1011 nnnn & 2 & Select channel mode \(D_0 \geq 120 \) \\
+	\midrule
+	F0 & 1111 0000 & variable & System exclusive \\
+	Fx & 1111 0xxx & 0 to 2 & System common \\
+	Fx & 1111 1xxx & 0 & System real time \\	
+	\bottomrule
+\end{tabular}
+\end{table*}
+
+\begin{thebibliography}{9}
+\bibitem{wiki:midi}
+	\textit{Musical Instrument Digital Interface},
+	[online], (visitato il 18.01.2018) \\
+	\url{https://it.wikipedia.org/w/index.php?title=Musical_Instrument_Digital_Interface}
+
+\bibitem{somascape}
+	\textit{Guide to the MIDI Software Specification},
+	[online], (visitato il 18.01.2018) \\
+	\url{http://www.somascape.org/midi/tech/spec.html}
+	
+\bibitem{gweep}
+	\textit{The MIDI Specification},
+	[online], (visistato il 22.01.2018) \\
+	\url{http://www.gweep.net/~prefect/eng/reference/protocol/midispec.html}
 
+\bibitem{xc8}
+	\textit{MPLAB® XC8 C Compiler User’s Guide},
+	2012 Microchip Technology Inc,
+	ISBN: 978-1-62076-375-9,
+	http://ww1.microchip.com/downloads/en/DeviceDoc/52053B.pdf
+\end{thebibliography}
 
 \end{document}
\ No newline at end of file
-- 
cgit v1.2.1

