diff options
Diffstat (limited to 'doc/xilofono.tex')
-rw-r--r-- | doc/xilofono.tex | 376 |
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} |