50 ways... DIY punched card Music Box

De Wikijoan
Dreceres ràpides: navegació, cerca
Diy music box.jpg

Contingut

Abstract

Abstract in English

I bought a DIY Music Box in ThinkGeek.com, and I want to automatize the process of punching the card (the card has holes with the music codified). My music scores are in lilypond format (the software that I use and I love to edit music). The advantage of lilypond is that is plain text format. So I made a C++ script that parses the lilypond file and the output is a bitmap image that represents the template that is going to be pierced. After piercing the card, you can play any tune (with the limitations of this music box: 15 notes, no sharps). In particular, I play Una Plata d'Enciam, the song of the project.

Resum

He comprat la DIY Music Box a ThinkGeek.com, i vull automatitzar el procés de perforar la targeta (la targeta té forats que codifiquen la informació musical). Jo treballo amb partitures amb format de lilypond (el software que utilitzo per editar partitures i música). L'avantatge de Lilypond és que treballa amb un format de text pla. Així doncs, he fet un programa amb C++ que parseja el fitxer de lilypond, i com a sortida obtenim un bitmap (imatge) que és la plantilla que em diu on he de perforar, on aniran els forats. Després de perforar, ja puc tocar la cançó (amb les limitacions d'una caixa de música. En aquest cas són 15 notes que no admeten sostinguts). Concretament, toco la cançó Una Plata d'Enciam, que és la canço del projecte.

Referències

Objectius

Es tracta d'automatitzar la feina de punxar les targetes perforades. La idea és fer un aplicatiu per convertir fitxers de lilypond a imatges bitmap per a ser impreses i que siguin el patró per punxar una cartolina.

La idea és començar amb la caixa de música de ThinkGeek, però reprendre la idea per a d'altres caixes de música.

Desenvolupament

He desenvolupat l'aplicatiu C++ lilypond2musicbox (vaig per la versió 1.05), per convertir fitxers de lilypond a un bitmap que es correspon al patró necessari per punxar un cartró i tocar-lo amb la DIY Music Box.

codi font versió 1.05: Fitxer:Lilypond2musicbox 1 05.cpp.zip

g++ -o lilypond2musicbox lilypond2musicbox_1_05.cpp EasyBMP.cpp
./lilypond2musicbox -i una_plata_denciam_v7.ly
./lilypond2musicbox -i una_plata_denciam_v7.ly -s 2 -p 2 -o una_plata -d kikkerland

Opcions:

Scores

Fitxer de lilypond: una_plata_denciam_v7.ly:

\version "2.12.1"
\header {
  title = "Una Plata d'Enciam"
  composer = "tradicional catalana"
  opus = ""
}

melodia =
<<
%staff1
\new Staff = "veu 1"
\relative c''
{
  \clef treble
  \key a \minor
  \time 2/4
  \tempo 4=80
%pag1
e8 f g g a a g4 a8 a16 g f8 f f f16 f g8 e e f g g a a g4 a8 a16 g f8 e f g e4
%pag2
e8 f g g a a g4 a8 a16 g f8 f f f16 f g8 e e f g g a a g4 a8 a16 g f8 e f g e4
}

%staff2
\new Staff = "veu 2"
\relative c''
{
%pag1
c8 d e e f f e4 f8 e16 d b8 c d f16 f e8 c c d e e f f e4 f8 e16 d b8 c d e c4
%pag2
c8 d e e f f e4 f8 e16 d b8 c d f16 f e8 c c d e e f f e4 f8 e16 d b8 c d e c4
}

%staff3
\new Staff = "veu 3bis"
\relative c'
{
%pag1
c8 d e g f e d4 d8 e f a g f g e c d e g f e d4 d8 e f f e d c4
%pag2
c8 d e g f e d4 d8 e f a g f g e c d e g f e d4 d8 e f f e d c4
}

%staff4
\new Staff = "veu 4"
\relative c'
{
%pag1
e8 f g g a a g4 a16 g f e d8 e f g f e e f g g a a g4 a16 g f e d8 e f g e4
%pag2
e8 f g g a a g4 a16 g f e d8 e f g f e e f g g a a g4 a16 g f e d8 e f g e4
}
>>


\score {
  \melodia
  \layout { }
  \midi { }
}

Video

Transcripció català

DIY punched card Music Box

Hola. Aquest és el segon video del projecte "50 maneres de tocar Una Plata d'Enciam", un projecte d'art multimèdia, música electrònica i software lliure. Aquí tenim un instrument molt petitó que he comprat a Thinkgeek.com, i que està fabricat per kikkerland.com. M'agrada aquest tipus de joguines! Es tracta d'una caixa de musica mini, on la música està codificada mitjançant una targeta perforada. La targeta perforada té una estructura bidimensional on es practiquen uns foradets que són les notes que es tocaran. La longitud del paperet representa el temps. Amb la manivela podrem tocar més ràpid o més a poc a poc la cançó. L'amplada de la targeta representa la capacitat polifònica d'aquesta caixa de música. En aquest cas, podem tocar 15 notes simultànies.

De seguida que vaig veure aquest gadget vaig pensar en la manera d'automatitzar la creació de partitures. La idea és senzilla. S'ha de programar una aplicació que, partint d'una partitura realitzada amb un software d'edició de partitures, obtinguem com a resultat una plantilla que ens digui on hem de fer els foradets. Per a mi, el millor editor de partitures és lilypond. Primer perquè és software lliure. Segon perque la qualitat de les partitures pot arribar a ser molt alta, professional. I tercer perquè tens l'opció d'entrar les notes i tota la codificació musical en format text pla, i amb l'editor de text més bàsic. Aquí tenim la cançó Una Plata d'Enciam en format lilypond. Tenim 4 veus, que aquí podem veure ben diferenciades, i totes aquestes lletres i números és la informació de les notes i la seva durada. Aquest és l'aspecte general d'un fitxer de notació musical fet amb Lilypond, en el qual hem tret tota la informació de lligadures, fortes, stactatos, ritardandos,... Tots aquests conceptes no interessen per a res en una caixa de música.

Aleshores fem un programa per convertir el fitxer de lilypond a una imatge on s'han dibuixat els punts a perforar. Mirem com s'executa... i aquí obtenim el resultat. Un fitxer bitmap és relativament fàcil de programar. Aleshores l'imprimim, i abans de passar a la fase de punxar, a mi m'agrada posar-li un petit toc personal amb una mica de colors i aquarel.les.

Ara estic fent els foradets. És una feina una mica entretinguda, depèn de la longitud de la cançó. No tinc ni pressupost ni espai per a comprar-me una màquina de control numèric per fer els forats automàticament. Això sí que seria fantàstic. Bé, ja tenim la cançó finalitzada. Anem a veure com sona

[]

Aquest és el projecte "50 maneres de tocar Una Plata d'Enciam", una cançó infantil que es canta a Catalunya. De moment encara no hem fet res de música electrònica: el so que hem produït en aquest video amb aquest catxarro és un so natural i metàl.lic. Tanmateix, ja hem anat introduint conceptes de software lliure, com per exemple l'editor de partitures lilypond, un software realment fantàstic.

Transcripció castellà

DIY punched card Music Box

Hola. Este es el segundo video del proyecto "50 maneras de tocar Una Plata d'Enciam", un proyecto de arte multimedia, música electrónica y software libre. Aquí tenemos un instrumento muy pequeñito que he comprado en Thinkgeek.com, y está fabricado por kikkerland.com. Me gusta este tipo de juguetes! Se trata de una caja de música mini, en que la música está codificada mediante una tarjeta perforada. La tarjeta perforada tiene una estructura bidimensional en la cual se practican unos agujeritos que son las notas que se tocarán. La longitud del papelito representa el tiempo. Con la manivela podremos tocar más rápido o más poco a poco la canción. La anchura de la tarjeta representa la capacidad polifónica de esta caja de música. En este caso, podemos tocar 15 notas simultáneamente.

En seguida que vi este cacharrito pensé en la manera de automatizar la creación de partituras. La idea es simple. Se tiene que programar una aplicación que, partiendo de una partitura realizada con un software de edición de partituras, obtingamos como resultado una plantilla que nos diga donde hemos de hacer los agujeros. Para mi, el mejor editor de partituras es lilypond. Primero porque es software libre. Segundo porque la calidad de las partituras puede ser muy alta, profesional. Y tercero porque tienes la opción de entrar las notes y toda la codificación musical en formato texto plano, utilizando el editor de textos más básico. Aquí tenemos la canción Una Plata d'Enciam en formato lilypond. Tenemos 4 voces, que aquí podemos ver bien diferenciadas, y todas estas letras y números es la información de las notas y su duración. Este es el aspecto general de un fichero de notación musical hecho con Lilypond, del que hemos quitado toda la información de ligaduras, fortes, stacatos, ritardandos,... Todos estos conceptos no interesan para nada en una caja de música.

Así pues, hacemos un programa para convertir el fichero de lilypond en una imagen donde se habrán dibujado los puntos. Miramos cómo se ejecuta... y aquí obtenemos el resultado. Un fichero bitmap es relativamente fácil de programar. Lo imprimimis, y antes de pasar a la fase de pinchar, a mi me gusta darle un pequeño toque personal con un poco de colores y acuarelas.

Ahora estoy haciendo los agujeros. Es una tarea un poco entretenida, depende de la longitud de la canción. No tengo ni presupuesto ni espacio para comprarme una máquina de Control Numérico para hacer los agujeros automáticament. Esto sí que sería fantástico. Bien, ya tenemos la canción finalizada. Vamos a ver cómo suena.

[]

Este es el proyecto "50 maneras de tocar Una Plata d'Enciam", una canción infantil que se canta en Catalunya. De momento no hemos hecho nada todavía de música electrónica: el sonido que hemos producido en este video con este cacharro es sonido natural y metálico. Sin embargo, ya hemos visto como se han introducido conceptos de software libre, como por ejemplo el editor de partituras lilypond, un software realmente fantástico.

Transcripció anglès

DIY punched card Music Box

Hello. Here is the second video of the project "50 ways to play Una Plata d'Enciam", a project about media art, electronic music and free software. Here is a small instrument that I found at thinkgeek.com, but the provider is kikkerland.com . I like this sort of gadgets! It is a very tiny music box, where music is codified in a punched card. This punched car have holes that represent the notes we are going to play and the timing of these notes. With this crank you can play slow or fast. The poliphonic range is 15, it means that you can play 15 notes at the same time, two whole musical scales.

The same day that I saw this gadget in thinkgeek.com, I thought how to automate the creation of punched cards with your favourite songs. The idea is not difficult to understand. We must to code a script that converts a musical score made with a score editor application, to a bitmap image template that show us where to punch the card. Among the musical score editors, lilypond is my preferred for various reasons. First, lilypond is free software. Second: the quality of the printable scores is fantastic, developers have been making a huge effort in the engraving system. And third, if you want, you can edit all the notes and all the musical information in plain text, with a simple word processor. Here you can see the song Una Plata d'Enciam in lilypond format. We have 4 staffs, and all this letters and numbers represent the musical information: the notes and their length. This is the general aspect of a lilypond file, where I have removed all the secondary musical information like legatos, fortes, stacatos,... all this musical information has no translation in a music box.

So, I have coded a script to convert a lilypond file to a bitmap image with the points to pierce. You can see how I run this script... and here is the resulting bitmap image. A bitmap image is not really difficult to understand and to program. (...) So, we print this image, and before punching the card, I like to put a personal touch, a little of artwork with watercolors.

Now I'm punching the small holes. It is a tiring job, it depends of the length of the song. I don't have nor budget nor room to buy a control numeric machine to automatize the punching job. That would be really cool! (...) Well, we have the song finished, and we can see now how does it sound.

[]

This is the project "50 ways to play Una Plata d'Enciam", a children song that we sing in Catalonia. At this moment I didn't made nothing about electronic music. The sound that you have listened with this gadget is a natural and metallic sound. However, we have seen concepts related with computers and free software like lilypond, a really fantastic score editor.

Notes tècniques

$ cd /home/joan/50_ways/way2/video/
$ PS1="$ "
$ recordmydesktop --no-sound -delay 3 -fps 25 --overwrite -o lilypond2musicbox.ogv
$ ffmpeg -y -i lilypond2musicbox.ogv -s 852x480 -aspect 16:9 -r 25 -sameq lilypond2musicbox.avi
$ ffmpeg -y -i lilypond2musicbox.avi -s 852x480 -aspect 16:9 -r 25 -sameq p4a_sv.avi -ss 00:00:3.000 -t 00:00:34.00
$ ffmpeg -y -i b.avi -s 852x480 -aspect 16:9 -r 25 -sameq p4b_sv.avi -ss 00:00:00.000 -t 00:00:15.00
$ avimerge -o p4_sv.avi -i p4a_sv.avi p4b_sv.avi
$ recordmydesktop --no-sound -delay 3 -fps 25 --overwrite -o lilypond_file.ogv
$ ffmpeg -y -i lilypond_file.ogv -s 852x480 -aspect 16:9 -r 25 -sameq lilypond_file.avi
$ ffmpeg -y -i lilypond_file.avi -s 852x480 -aspect 16:9 -r 25 -sameq p3_sv.avi -ss 00:00:2.000 -t 00:01:01.00

fem acidrip de tots els videos que hem grabat (si ho fem tot de cop ens estalviem molt de temps...)

Seguiré la filosofia de fer cada tros de video amb el seu audio, i al final ajuntar tots els trossos.

$ ffmpeg -y -i f.avi -s 852x480 -aspect 16:9 -r 25 -sameq p2a.avi -ss 00:00:6.000 -t 00:00:28.000
$ ffmpeg -y -i g.avi -s 852x480 -aspect 16:9 -r 25 -sameq p2b.avi -ss 00:00:2.000 -t 00:00:31.000
$ ffmpeg -y -i i.avi -s 852x480 -aspect 16:9 -r 25 -sameq p2c.avi -ss 00:00:3.000 -t 00:00:30.000
$ avimerge -o p2.avi -i p2a.avi p2b.avi p2c.avi

$ ffmpeg -y -i h.avi -s 852x480 -aspect 16:9 -r 25 -sameq p7.avi -ss 00:00:5.000 -t 00:00:28.000

$ avimerge -o p2.avi -i p2a.avi p2b.avi p2c.avi
$ ffmpeg -y -i p2.avi image_inici%d.png

obtinc image_inici.png

$ ffmpeg -y -i p7.avi -s 852x480 -aspect 16:9 -r 25 -sameq p7_final.avi -ss 00:00:27.000
$ ffmpeg -y -i p7_final.avi image_final%d.png

obtinc image_final.png

$ dvd-slideshow -n p1a.avi -p -w -o /home/joan/50_ways/way2/video -w -f fade_inici.cfg
$ dvd-slideshow -n p8a.avi -p -w -o /home/joan/50_ways/way2/video -w -f fade_final.cfg

i obtinc p1a.avi.vob i i obtinc p8a.avi.vob

ara faig acidrip per convertir p1a.avi.vob a p1.avi, amb les següents característiques:

obtinc portada2.avi

$ ffmpeg -y -i p1a.avi -s 852x480 -aspect 16:9 -r 25 -sameq p1.avi

fem acidrip de p8a.avi.vob tal com hem dit, i obtenim p8a.avi, que convertim a p8.avi

$ ffmpeg -y -i p8a.avi -s 852x480 -aspect 16:9 -r 25 -sameq p8.avi
$ ffmpeg -y -i d.avi -s 852x480 -aspect 16:9 -r 25 -sameq p5_sv.avi -ss 00:01:00.000 -t 00:00:27.000
$ ffmpeg -y -i e.avi -s 852x480 -aspect 16:9 -r 25 -sameq p6.avi -ss 00:00:02.000 -t 00:00:29.000

Grabem les veus amb el micro dels videos que són captura de pantalla:

$ arecord -r 44100 -f cd -t wav -D plughw:0 p3_so.wav
$ aplay -D plughw:0 p3_so.wav

$ arecord -r 44100 -f cd -t wav -D plughw:0 p4_so.wav
$ aplay -D plughw:0 p4_so.wav

$ arecord -r 44100 -f cd -t wav -D plughw:0 p5_so.wav
$ aplay -D plughw:0 p5_so.wav

NOTA a posteriori: fallo! he de grabar a 48000 perquè aquest és el format que em dóna la videocàmera. Com que hauré d'ajuntar els videos, han d'estar mostrejats de la mateixa forma.

el que he de fer ara és amplificar el so d'aquests wavs per tal que tinguin el mateix nivell de senyal que el so que ve de la videocàmera. Amb audacity vaig a Efeto > Amplificado. Per defecte hi ha 9.1. He d'escollir un valor adequat. La part que no té so no l'amplifico. Aprofito per eliminar soroll i per retallar el audio si és que cal i que la longitud del audio i del video sigui la mateixa (aprox). Ho faig seleccionant la part que vull esborrar, i Editar > Borrar

Ara he d'ajuntar p3_sv.avi amb p3_so.wav, que ja tenen la mateixa longitud (no cal ajustar-ho a la centèssima)

$ ffmpeg -y -i p3_so.wav -i p3_sv.avi -s 852x480 -aspect 16:9 -r 25 -sameq p3.avi
$ ffmpeg -y -i p4_so.wav -i p4_sv.avi -s 852x480 -aspect 16:9 -r 25 -sameq p4.avi
$ ffmpeg -y -i p5_so.wav -i p5_sv.avi -s 852x480 -aspect 16:9 -r 25 -sameq p5.avi

i ja podem ajuntar-ho tot:

$ avimerge -o way2.avi -i p1.avi p2.avi p3.avi p4.avi p5.avi p6.avi p7.avi p8.avi

NOTA. Amb aquest video he solucionat aspectes que encara no tenia clares, concretament ajuntar so amb un video que ve de la captura de la pantalla; i ajuntar parts de video que vénen de l'escriptori i d'altres que vénen de la videocàmera. He de tenir present que els nivells de volum de la videocàmera i de fer arecord han de ser similars (ho poc solucionar amb el audacity). D'altra banda, la qualitat del so grabant amb el micròfon i arecord és molt superior al so que ve de la videocàmera, amb un micro més dolent i que agafa el so ambiental. Per tant, puc plantejar-me grabar el so amb un micro i rebutjar el so de la videocàmera. Amb la manera que he procedit fixem-nos que queden resolts els problemes de sincronia de la veu, etc. Per tant, ja estem davant d'una solució quasi-definitiva d'editar videos amb una qualitat força acceptable.

Ho passem al format del YouTube:

$ ffmpeg -i way2.avi -s 852x480 -pass 1 -passlogfile log-file -ar 44100 -sameq -y way2.flv

Ara pengem el video a www.youtube.com (JoanilloMediaArt/jq********)

Etiquetes possibles en el projecte: 50 ways to play Una Plata d'Enciam, electronic music, free software, Linux, arduino, android, new instruments, interface design, sound synthesis, electronic engineering, music box

hi ha un problema amb la sincronització. El problema està en què els videos 3.avi i 4.avi estan a 44100 en comptes de 48000, i el fallo és meu a què he fet servir arecord amb aquest paràmetre.

arreglem el que no funciona (desincronització)

resum de ffmpeg:

Getting info from a video file: $ ffmpeg -i video.avi

Miro les característiques de tots els videos per detectar on està el problema:

$ ffmpeg -i p1.avi
Input #0, avi, from 'p1.avi':
  Duration: 00:00:08.28, start: 0.000000, bitrate: 1081 kb/s
    Stream #0.0: Video: mpeg4, yuv420p, 852x480 [PAR 1:1 DAR 71:40], 25 tbr, 25 tbn, 25 tbc
    Stream #0.1: Audio: mp2, 48000 Hz, stereo, s16, 64 k

$ ffmpeg -i p2.avi
Input #0, avi, from 'p2.avi':
  Duration: 00:01:29.00, start: 0.000000, bitrate: 3024 kb/s
    Stream #0.0: Video: mpeg4, yuv420p, 852x480 [PAR 1:1 DAR 71:40], 25 tbr, 25 tbn, 25 tbc
    Stream #0.1: Audio: mp2, 48000 Hz, stereo, s16, 64 kb/s
 

$ ffmpeg -i p3.avi
Input #0, avi, from 'p3.avi':
  Duration: 00:01:01.07, start: 0.000000, bitrate: 2145 kb/s
    Stream #0.0: Video: mpeg4, yuv420p, 852x480 [PAR 1:1 DAR 71:40], 25 tbr, 25 tbn, 25 tbc
    Stream #0.1: Audio: mp2, 44100 Hz, stereo, s16, 64 kb/s


$ ffmpeg -i p4.avi
Input #0, avi, from 'p4.avi':
  Duration: 00:00:44.01, start: 0.000000, bitrate: 2859 kb/s
    Stream #0.0: Video: mpeg4, yuv420p, 852x480 [PAR 1:1 DAR 71:40], 25 tbr, 25 tbn, 25 tbc
    Stream #0.1: Audio: mp2, 44100 Hz, stereo, s16, 64 kb/

$ ffmpeg -i p5.avi
Input #0, avi, from 'p5.avi':
  Duration: 00:00:27.00, start: 0.000000, bitrate: 2814 kb/s
    Stream #0.0: Video: mpeg4, yuv420p, 852x480 [PAR 1:1 DAR 71:40], 25 tbr, 25 tbn, 25 tbc
    Stream #0.1: Audio: mp2, 48000 Hz, stereo, s16, 64 kb

$ ffmpeg -i p6.avi
Input #0, avi, from 'p6.avi':2, 44100 H
  Duration: 00:00:29.44, start: 0.000000, bitrate: 2921 kb/s
    Stream #0.0: Video: mpeg4, yuv420p, 852x480 [PAR 1:1 DAR 71:40], 25 tbr, 25 tbn, 25 tbc
    Stream #0.1: Audio: mp2, 48000 Hz, stereo, s16, 64 kb/s

$ ffmpeg -i p7.avi
Input #0, avi, from 'p7.avi':
  Duration: 00:00:28.46, start: 0.000000, bitrate: 2258 kb/s
    Stream #0.0: Video: mpeg4, yuv420p, 852x480 [PAR 1:1 DAR 71:40], 25 tbr, 25 tbn, 25 tbc
    Stream #0.1: Audio: mp2, 48000 Hz, stereo, s16, 64 kb/s

$ ffmpeg -i p8.avi
Input #0, avi, from 'p8.avi':
  Duration: 00:00:08.28, start: 0.000000, bitrate: 829 kb/s
    Stream #0.0: Video: mpeg4, yuv420p, 852x480 [PAR 1:1 DAR 71:40], 25 tbr, 25 tbn, 25 tbc
    Stream #0.1: Audio: mp2, 48000 Hz, stereo, s16, 64 kb/s

Veiem doncs que el problema de la desincronització del so està en els videos p3 i p4 que estan a 44100 en comptes de 48000 Hz.

El fallo ha estat meu, que amb arecord he grabat a 44100 i ho havia de fer a 48000. Això és fàcil de solucionar amb el audacity: Pistas > Remuestrerar, i remostrejo a 48000. La longitud del audio no canvia. Ara bé, segurament no cal remostrejar amb el audacity perquè amb l'opció -ar 48000 del ffmpeg n'hi ha d'haver prou:

$ ffmpeg -y -i p3_so_48000.wav -i p3_sv.avi -s 852x480 -aspect 16:9 -r 25 -ar 48000 -sameq p3.avi
$ ffmpeg -y -i p4_so_48000.wav -i p4_sv.avi -s 852x480 -aspect 16:9 -r 25 -ar 48000 -sameq p4.avi
$ ffmpeg -y -i p5_so_48000.wav -i p5_sv.avi -s 852x480 -aspect 16:9 -r 25 -ar 48000 -sameq p5.avi

El que hem de tenir present és que la videocàmera graba el so a 48000. Per tant, amb arecord he de grabar el so a 48000 per tal de no tenir problemes quan ajunti els vídeos. Una altra cosa és que quan converteixi a format .flv utilitzo l'opció -ar 44100, doncs aquest és el format d'audio que demana youtube.

Finalment: http://www.youtube.com/watch?v=aGRuwT1NHf8

Enllaços


creat per Joan Quintana Compte, gener 2010

Eines de l'usuari
Espais de noms
Variants
Accions
Navegació
Institut Jaume Balmes
Màquines recreatives
CNC
Informàtica musical
joanillo.org Planet
Eines