Jplay-sndfile
Introducció
Aquesta tecnologia és bàsica per poder desenvolupar Reconeixement_real_de_gestos_amb_la_wacom_i_síntesi_d'àudio i Històries_amb_la_Wacom, i concretament els seus projectes/performances associats: Històries_amb_la_Wacom#Projectes.
Es tracta de treballar amb la llibreria libsndfile per tal de poder llegir les mostres d'un fitxer wav i posar-les en un buffer, i fer un playback de les mostres, alhora que es pot variar la freqüència i fer un escombrat de freqüències. És un projecte bàsicamente didàctic, en què un es pot trobar amb efectes com l' aliasing
Treballs previs
Per aconseguir els efectes desitjats he fet proves amb la Synthesis ToolKit in C++ (STK), concretament una classe de síntesi granular. Funciona molt bé aquest toolkit, es poden aconseguir efectes interessants amb la classe Grain, però no veig que es puguin canviar els paràmetres de la síntesi granular a temps real i associar-los, per exemple, al moviment X,Y del ratolí. O sigui que he de canviar de llibreria. Crec que toolkit que sí que respondria a les espectatives de programació realtime d'audio i síntesi granular seria el projecte SuperCollider (TBD).
Desenvolupament
Guardaré tots els fitxers del projecte a la carpeta projeces/jplay-sndfile, i el projecte l'anomeno jplay-sndfile (jplay-sndfile-simple és la versió simplificada, només permet fer playback i té finalitats didàctiques).
Bàsicament per fer el projecte em baso en la llibreria libsndfile. Aquesta és la llibreria bàsica per treballar amb fitxers wav (llegir i escriure). Ho tinc documentat a Libsndfile_library. Concretament el meu desenvolupament és una barreja de dos codis:
- readWav.c. M'ensenya com llegir un fitxer wav i ficar totes les mostres en un buffer
- sndfile-jackplay.c. És un exemple de les sndfile-tools (http://www.mega-nerd.com/libsndfile/tools/), concretament és un client de JACK que toca un fitxer wav, una altra tros de codi que jo necessito.
La idea que es desenvolupa i que es pot anar seguint en les diferents versions del projecte és:
- volcar el contingut d'un fitxer wav a un buffer de memòria.
- després... el contingut del buffer de memòria volcar-lo sobre el port de sortida del client JACK, directament als ports d'entrada de system:playback_1 i _2.
- després... en comptes de fer tot el bolcat en bloc, fer el bolcat mostra a mostra.
- després... ara que sé treballar mostra a mostra, es pot modificar les mostres individuals, i així es pot aconseguir fer atenuació, amplificació o modulació del senyal.
- després... ara vull fer un canvi de pitch: més agut o més greu. Ara la cosa ja es complica, doncs no hi ha una equivalència entre mostres d'entrada i de sortida, sinó que m'he de menjar mostres (per fer un to més agut), o m'he d'inventar mostres (per fer un to més greu). Apareixen efectes d'aliasing.
- després... aconseguir parametritzar el canvi de pitch, de manera que es pugui aconseguir un canvi de pitch continu. Aquesta és la part difícil, doncs el canvi de l'amplitud del senyal és la part fàcil
- després... versió definitiva del projecte, v1.0.0. El mateix codi serveix per fer playback, per poder canviar la freqüència (amb un factor que va de .5 a 2), i poder fer un escombrat de freqüènices (també entre aquests factors).
El desenvolupament es farà bàsicament amb un sinus (hellosine.wav), però també és interessant treballar amb altres mostres, mostres de veu, i mostres samplejades a diferents freqüències de mostreig.
Tant per fer les mostres com per gravar la sortida de jplay-sndfile s'ha utilitzat jack_capture (Jack_capture#Exemple_pr.C3.A0ctic:_jplay-sndfile_.28febrer_2012.29).
Per compilar: (l'únic fitxer que s'ha de copiar a la carpeta del projecte és sndfile-tools-1.03/src/config.h)
$ cd /home/joan/projectes/jplay-sndfile Codi C: $ gcc -o jplay-sndfile -ljack -lsndfile jplay-sndfile-0.0.1.c Codi C++ $ g++ -o jplay-sndfile -ljack -lsndfile jplay-sndfile-1.0.0.cpp
Per executar:
$ ./jplay-sndfile samples/hellosine.wav numFrames: 120000 Channels: 1 Sample rate : 44100 Hz Length: 2.721088s Duration: 00:02.72
$ jplay-sndfile -h jplay-sndfile 1.00 Created by Joan Quintana Compte (joanillo) joanqc arroba gmail.com - www.joanillo.org Licensed under GPL v.3 jplay-sndfile is a JACK client intended for playing audio files (wav) and pitch shifting, written basically for learning, testing and educational purposes, and the first stage for future developments. A part of playing an audio file, you can change the pitch (between *0.5 and *2) of your audio file, you can play the audio file combing the pitch between two ranges. For testing is useful a sine wave, but remember that you can use any mono (one channel) audio files. This Jack Audio client connects automatically to system:playback_1 and system:playback_2 usage: jplay-sndfile [-h] [[pitch-shift] | [pitch-shift-start pitch-shift-end]] <wav-file> -h --help: this usage information [pitch-shift] (0.5,2): shifting pitch [pitch-shift-start] (0.5,2): shifting pitch start range [pitch-shift-end] (0.5,2): shifting pitch end range <wav file>: mono channel audio file Examples: ./jplay_sndfile samples/hellosine.wav ./jplay_sndfile 0.65 samples/hellosine.wav ./jplay_sndfile 0.5 2 samples/hellosine.wav
Càlculs
Ha sigut especialment difícil la part de calcular el que dura el playback quan hi ha escombrat de freqüències. Per fer-ho ben fet s'ha de recórrer al càlcul integral. Jo he fet un sumatori de 25 termes. Els sumands són de tipus 1/n i el sumatori final seria de tipus logarítmic. Veure càlculs apart. (Ficar fórmula final, TBD).
Download
- Fitxer:Jplay-sndfile-simple-1.0.0.tar.gz (versió simplificada. Només fa playback sense canvi de freqüència. Amb finalitat didàctica)
- Fitxer:Jplay-sndfile-1.0.0.tar.gz
Blog
- entrada blog: http://www.joanillo.org/?p=588&lang=ca
creat per Joan Quintana Compte, febrer 2012