summaryrefslogtreecommitdiffstats
path: root/doc/xilofono.tex
diff options
context:
space:
mode:
Diffstat (limited to 'doc/xilofono.tex')
-rw-r--r--doc/xilofono.tex376
1 files changed, 0 insertions, 376 deletions
diff --git a/doc/xilofono.tex b/doc/xilofono.tex
deleted file mode 100644
index d8b06ed..0000000
--- a/doc/xilofono.tex
+++ /dev/null
@@ -1,376 +0,0 @@
-\documentclass[a4paper, 10pt]{report}
-
-% 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.14}
-
-% tables
-\usepackage{array}
-\usepackage{booktabs}
-
-% code
-\usepackage{xcolor}
-\usepackage{listings}
-
-\lstdefinestyle{customc}{
- belowcaptionskip=1\baselineskip,
- breaklines=true,
- frame=none,
- % margin
- xleftmargin=\parindent,
- % numbers
- numbers=left,
- numbersep=5pt,
- numberstyle=\footnotesize\color{gray},
- %
- language=C,
- showstringspaces=false,
- % font
- basicstyle=\ttfamily\normalsize,
- keywordstyle=\color{green!40!black},
- commentstyle=\color{gray},
- identifierstyle=\color{black},
- stringstyle=\color{orange},
-}
-\lstset{escapechar=@,style=customc}
-
-% parskip
-\setlength{\parskip}{1em}
-
-% metadata
-\title{Xilofono MIDI}
-\author{Naoki Pross, \textit{SAM Bellinzona}}
-
-% layout
-\usepackage[margin=3cm]{geometry}
-\usepackage{titlesec}
-
-\titleformat{\chapter}[hang]{\Huge\bfseries}
- {\thechapter.}{.8em}{\Huge}
-\titlespacing*{\chapter}{0pt}{-30pt}{10pt}
-
-
-\begin{document}
-\maketitle
-
-%\begin{abstract}
-%\end{abstract}
-
-% ---------------------------------------------------
-\chapter{Introduzione}
-\section{Requisiti}
-Lo Xilofono MIDI \`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 dei circuiti di misura.
-
-% ---------------------------------------------------
-\chapter{Hardware}
-\section{Elemento piezoelettrico}
-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}[
- ylabel={Tensione $u_x(t)$[V]},
- xlabel={Tempo $t$ [s]},
- xmin=-0.05, xmax=0.4,
- 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{
- Tensione sull'elemento piezolettrico quando viene colpito.
- \label{fig:piezo-waveform}
-}
-\end{figure}
-
-\section{Circuito di misura}
-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=.5\linewidth]{figures/reduced-circ.tikz}
- \caption{Circuito di misura}
-\end{figure}
-
-% ---------------------------------------------------
-\chapter{Software}
-\section{Misurazione del piezoelettrodo}
-Non volendo utilizzare dei circuiti analogici per filtrare il segnale la correzione della misura viene effettuata dal microcontroller. Con una frequenza di campionamento regolabile tra gli 1 e i 4 kHz (attualmente impostata al massimo, 4kHz) il programma utilizza un sistema di maschere e shift, operazioni idealmente poco costose in performance, per determinare se una misura \`e un rimbalzo di una nota precedente o una nuova nota.
-
-Il microcontroller tiene una cronologia di 32 campioni per ogni nota salvando le misurazioni nei bit di un \texttt{uint32\_t}. Per aggiungere una nuova misura dunque \`e sufficiente un left shift ed un bitwise OR.
-\begin{lstlisting}
-key_data = (key_data << 1) | PORTXbits.PX0;
-\end{lstlisting}
-Per controllare che una misura non sia un rimbalzo, al dato contenente la cronologia (\texttt{key\_data}) viene applicata una maschera che controlla se ci sono gi\`a stati dei campioni validi in precedenza. In altre parole la maschera nasconde i campioni recenti e controlla che non ci siano campioni pi\`u vecchi al valore logico 1. Il valore della maschera viene impostato sperimentalmente.
-\begin{lstlisting}
-#define NOTE_MASK 0xFFFFF000
-int is_pressed = key_data && !(key_data & NOTE_MASK);
-\end{lstlisting}
-
-% TODO write stuff
-\begin{figure}[H] \centering
-\begin{tikzpicture}
-\begin{axis}[
- ylabel={Tensione $u_x(t)$ [V]},
- xlabel={Tempo $t$ [s]},
- % xmin=-0.02, xmax=0.02,
- grid=major,
- grid style=dotted,
- width=\linewidth,
- height=6.5cm
-]
- % source
- \addplot [color=blue!70, smooth] table [
- mark=none,
- each nth point=2,
- x=Time, y=Voltage,
- col sep=semicolon
- ] {data/piezo-filter-2/piezo-filter-waveform-ch1.csv};
-
- % not filtered
- \addplot [color=gray!70, smooth] table [
- mark=none,
- each nth point=2,
- x=Time, y=Voltage,
- col sep=semicolon
- ] {data/piezo-filter-2/piezo-filter-waveform-ch3.csv};
-
- % filtered
- \addplot [color=black, smooth, thick] table [
- mark=none,
- each nth point=2,
- x=Time, y=Voltage,
- col sep=semicolon
- ] {data/piezo-filter-2/piezo-filter-waveform-ch2.csv};
-\end{axis}
-\end{tikzpicture}
-\caption{
- Tensione sul piezoelettrodo, il segnale misurato e il segnale filtrato.
- \label{fig:piezo-filter-waveform}
-}
-\end{figure}
-
-
-
-\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=2]
- \timing at (0,1) {L4D{Status}4D{D0}4D{D1}4D{D2}4D{...}};
- \timing at (0,.5) {L4D{0x90}4D{0x3C}4D{0x7F}4L4L};
-\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{lstlisting}
-typedef struct {
- unsigned status :4;
- unsigned channel :4;
- uint8_t data[];
-} midi_message_t;
-\end{lstlisting}
-
-Sono definite in oltre le seguenti enumerazioni per migliorare la leggibilit\`a del codice.
-
-\begin{lstlisting}
-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{lstlisting}
-
-\begin{lstlisting}
-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{lstlisting}
-
-\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 allocare 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{lstlisting}
-typedef struct {
- unsigned status :4;
- unsigned channel :4;
- size_t data_size;
- uint8_t data[MIDI_DATA_MAX_SIZE];
-} midi_message_t;
-\end{lstlisting}
-
-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{lstlisting}
-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{lstlisting}
-
-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.
-A seguire un esempio abbastanza generico per le piattaforme che implementano la funzione \texttt{putch}.
-
-\begin{lstlisting}
-int eusart_write_midi(midi_message_t *pkt)
-{
- size_t lenght;
- uint8_t *data;
-
- if (pkt == NULL) {
- return -1;
- }
-
- length = pkt->data_size;
- data = pkt->data;
-
- putch((pkt->status<<4) | pkt->channel);
-
- while (length--) {
- putch(*(data++));
- }
-
- return 0;
-}
-\end{lstlisting}
-
-\chapter*{Allegati}
-\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*}
-
-\listoffigures
-\listoftables
-
-\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}