Sintetitzador MeeBlip

De Wikijoan
Dreceres ràpides: navegació, cerca

Contingut

Referències

Em registro en el grup de Meeblip: joanillo/jq****

Documentació:

Funcionament

Finalment ha sortit la documentació de com funcionen tots els botons i interruptors:

DCO

DCA

DCF

Note that in the current revision of the MeeBlip, to avoid confusion and performance issues, we do not have separate Attack, Decay, Sustain, and Release controls for the filter envelope. These only control amplitude. (There is a filter envelope, but it’s set by default to track to key input, not the knobs.)
It currently has a DCA envelope (make sure the DCA gate switch is up). Filter envelope modulation is driven by key velocity. The harder you play, the more the envelope drives the filter.

El comportament del filtre evidentment està descrit en el codi font, i les fórmules que surten del 2-pole low pass filter estan extretes de:

LFO

LFO sync restarts the LFO when a key is pressed. That’s all. :)

Patches

Oscillator A & B slightly detuned, square wave on A and sawtooth on B. FM turned all the way up, distortion on.
The filter resonance turned way up (hence the chirpy squeal) and the filter cutoff knob is initially open, 
then twiddled a bit to help the filter chirp. At the end, I just slowly turn the cutoff down. the VCF envelope 
modulation is mapped to MIDI velocity, which adds some sonic movement.

Actualitzar el firmware

Fixed USB Noise Problem

la foto es pot veure a:

100 Ohm 1% resistor serial with the inductor, 470uF electrolytic across the output of the inductor and ground

La inductància està marcada com a L1 en l'esquemàtic i és de color vermell en la foto (a la vora del diode 1N4001). En cas de dubtes, xequejar la foto amb l'esquemàtic.

Nota: és possible que jo no tingui problemes de soroll, depèn de la font USB (de l'ordinador)

Instal.lació d'un ensamblador per compilar el AVR i el programa meeblip.asm

avra

$ sudo apt-get install avra
$ avra --devices
...

Device name | Flash size | RAM start | RAM size | EEPROM size |  Supported
            |  (words)   | (bytes)   | (bytes)  |   (bytes)   | instructions
------------+------------+-----------+----------+-------------+--------------
 (default)  |    4194304 |    0x0060 |  8388608 |       65536 |          137
 AT90S1200  |        512 |    0x0000 |        0 |          64 |           89
 ATtiny10   |        512 |    0x0000 |        0 |           0 |           90
 ATtiny11   |        512 |    0x0000 |        0 |           0 |           90
 ATtiny12   |        512 |    0x0000 |        0 |          64 |           90
 ATtiny13   |        512 |    0x0060 |       64 |          64 |          123
 ATtiny15   |        512 |    0x0000 |        0 |          64 |           90
 ATtiny28   |       1024 |    0x0000 |        0 |           0 |           90
 ATtiny22   |       1024 |    0x0060 |      128 |         128 |          118
 ATtiny26   |       1024 |    0x0060 |      128 |         128 |          120
 ATtiny2313 |       1024 |    0x0060 |      128 |         128 |          123
 AT90S2313  |       1024 |    0x0060 |      128 |         128 |          118
 AT90S2323  |       1024 |    0x0060 |      128 |         128 |          118
 AT90S2333  |       1024 |    0x0060 |      128 |         128 |          118
 AT90S2343  |       1024 |    0x0060 |      128 |         128 |          118
 AT90S4414  |       2048 |    0x0060 |      256 |         256 |          118
 AT90S4433  |       2048 |    0x0060 |      128 |         256 |          118
 AT90S4434  |       2048 |    0x0060 |      256 |         256 |          118
 AT90S8515  |       4096 |    0x0060 |      512 |         512 |          118
 AT90C8534  |       4096 |    0x0060 |      256 |         512 |          118
 AT90S8535  |       4096 |    0x0060 |      512 |         512 |          118
 ATmega8    |       4096 |    0x0060 |     1024 |         512 |          131
 ATmega161  |       8192 |    0x0060 |     1024 |         512 |          131
 ATmega162  |       8192 |    0x0100 |     1024 |         512 |          131
 ATmega163  |       8192 |    0x0060 |     1024 |         512 |          131
 ATmega16   |       8192 |    0x0060 |     1024 |         512 |          131
 ATmega323  |      16384 |    0x0060 |     2048 |        1024 |          131
 ATmega32   |      16384 |    0x0060 |     2048 |        1024 |          131
 ATmega603  |      32768 |    0x0060 |     4096 |        2048 |          120
 ATmega103  |      65536 |    0x0060 |     4096 |        4096 |          121
 ATmega104  |      65536 |    0x0060 |     4096 |        4096 |          134
 ATmega128  |      65536 |    0x0100 |     4096 |        4096 |          134
 AT94K      |       8192 |    0x0060 |    16384 |           0 |          129
 ATmega48   |       2048 |    0x0100 |      512 |         256 |          131
 ATmega88   |       4096 |    0x0100 |     1024 |         512 |          131
 ATmega168  |       8192 |    0x0100 |     1024 |         512 |          131
 ATmega8515 |       8192 |    0x0060 |      512 |         512 |          131
$ avra -o hola meeblip.asm
...
meeblip.asm(60) : Error   : Cannot find include file: m32def.inc
...

Instal.lo el AVR Studio

Is anyone interested in running AVRStudio on Linux? Version 4.12.490 Service Pack 3 runs perfectly using Fedora Core 5 with Wine 0.9.19. It also works along with WINAVR 20050214.

AVR-AS (forma part de AVR-GCC)

D'aquest enllaç (llegir) em descarrego "AVR Assembler User Guide"

Per instal.lar AVR-GCC (AVR-AS en forma part), segueixo l'enllaç:

Allò important és fer primer:

$ sudo apt-get install avr-libc
$ sudo apt-get install avrdude

però finalment faig:

$ sudo apt-get install gcc-avr

i efectivament, també s'instal.la avr-as:

$ man avr-as

AS(1)                        GNU Development Tools                       AS(1)

NAME
       AS - the portable GNU assembler.

SYNOPSIS
       as [-a[cdghlns][=file]] [--alternate] [-D]
        [--debug-prefix-map old=new]
        [--defsym sym=val] [-f] [-g] [--gstabs]
        [--gstabs+] [--gdwarf-2] [--help] [-I dir] [-J]
        [-K] [-L] [--listing-lhs-width=NUM]
        [--listing-lhs-width2=NUM] [--listing-rhs-width=NUM]
        [--listing-cont-lines=NUM] [--keep-locals] [-o
        objfile] [-R] [--reduce-memory-overheads] [--statistics]
        [-v] [-version] [--version] [-W] [--warn]
        [--fatal-warnings] [-w] [-x] [-Z] [@FILE]
        [--target-help] [target-options]
        [--|files ...]

...

però en el man, si miro els targets, no hi ha cap opció de AVR. Crec que hauré de compilar els binutils amb l'opció de AVR.

La última versió disponible és la binutils-2.21.tar.gz

descomprimeixo i instal.lo:

$ ./configure --target=avr --program-prefix="avr-"
$ make
$ sudo make install

ara sí.

Step 3. Download & install gcc (the C compiler)

És important tornar a instal.lar el gcc des de les fonts perquè ho he de fer amb compatibilitat amb els processadors AVR:

$ mkdir avrgcc-4.5
$ ../gcc-4.5.2/configure --target=avr --enable-languages=c --disable-libssp

configure: error: Building GCC requires GMP 4.2+, MPFR 2.3.1+ and MPC 0.8.0+.

soluciono aquest error (buscar paquets al synaptic, el primer no l'he trobat, els altres dos sí, però he fer configure amb OK final)

$ make  //l'opció CC="cc -no-cpp-precomp" jo la trec, tal com diu el link
triga molt!
$ sudo make install 

OK!!

Step 4. Download and install avr-libc (an essential C library for AVR chips)

avr-libc (http://savannah.nongnu.org/projects/avr-libc/) i avrdude (http://download.savannah.gnu.org/releases/avrdude/) els instal.lo a partir de les fonts, i així tinc les últimes versions.

$ ./configure --host=avr 
./configure --build=`./config.guess` --host=avr
$ make

em dóna un error, agafaré una altra versió...

cc1: error: unrecognized command line option "-mno-tablejump"

Si dóna problemes s'instal.la com a paquet.

Step 5. Download and install avrdude (the software that loads programs from your machine onto the chips) Primer de tot instal.lo libusb and libusb-dev (no ho troba amb apt-get, ho faig amb el synaptic)

./configure
make
$ sudo make install

Finalment, sembla ser que ja ho tinc tot instal.lat.

Ara he d'aconseguir compilar el fitxer meeblip.asm

$ avr-as meeblip.asm -> molts errors
$ avr-as --help
$ avr-as -mmcu=atmega32 meeblip.asm 

El que està clar és que en la línia 60 posa

.INCLUDE "m32def.inc"

que és propi del AVR Studio, i això vol dir que els desenvolupadors fan servir aquest sistema

de moment, no ho he aconseguit

Instal.lació avra

El Meeblip funciona amb un ATMega16

Support for some extra preprocessor directives.              
includes: .define, .undef, .ifdef, .ifndef, .if, .else, .endif, .elif, .warning
$ avra --devices

Device name | Flash size | RAM start | RAM size | EEPROM size |  Supported
            |  (words)   | (bytes)   | (bytes)  |   (bytes)   | instructions
------------+------------+-----------+----------+-------------+--------------
...
 ATmega163  |       8192 |    0x0060 |     1024 |         512 |          131
 ATmega16   |       8192 |    0x0060 |     1024 |         512 |          131
..

Amb el avra, per tal que reconegui el dispositiu, és posar:

.DEVICE atmega16
;.INCLUDE "m32def.inc"

però ara dóna uns altres errors:

$ avra meeblip.asm 
...
Pass 1...
Pass 2...
meeblip.asm(684) : Error   : Found no label/variable/constant named SREG
meeblip.asm(1044) : Error   : Found no label/variable/constant named PORTD
...

i és que la definció de SREG deu estar en el fitxer m32def.inc

Instal.lació del AVR Studio a Linux

Com a inconvenient, funciona amb wine i són més de 100 MB. Com avantatge, té una interfície gràfica.

AVR Studio 4.18 (build 684) (116 MB, updated 11/09) (m'he de registrar), i també em baixo el SP3


Command line version For the MS-DOS command line version the Assembler is invoked by the command

AVRASM [-m | -i | -g][-w] input.asm output.lst output.rom

AVRASM will now read source from input.asm, produce the listfile output.lst, output.rom
and the object file input.obj. The objectfile '*.obj' is used by the MS-Windows simulator.
The user can select which output format to generate by using one of the options -m
(Motorola S-record), -i (Intel Hex) or -g (Generic). The Generic file format is used by
default.
The -w option tells the Assembler to use wrapping of addresses. This feature is only
used when assembling for devices with 4K words of program memory. Using this switch
on these devices, the relative jump and call instructions will reach the entire program
memory.

Tinc problemes per instal.lar-ho sobre wine. Cercant a Google "AVR Studio Wine", hi ha un pdf que explica com fer-ho i ho segueixo (l'enllaaç és http://www.avrfreaks.net/index.php?module=FreaksArticles&func=downloadArticle&id=601):

PDF-file of AVR Studio on Linux - AVR Studio on Linux

install:

$ wine AvrStudio4Setup.exe

falla NTGraph.ocx

launch:

$ wine ~/.wine/drive_c/Program\ Files/Atmel/AVR\ Tools/AvrStudio4/AVRStudio.exe

Estem en les mateixes

$ ln -s /dev/ttyUSB0 /home/joan/.wine/dosdevices/com1

No me n'he ensortit, de moment... en el disc de producció... i en l'altre disc, SI! Finalment, després de moltes penúries, he aconseguit fer funcionar el AVR Studio a Linux amb wine, i compilar el fitxer original meeblip.asm.

He utilitzat el mètode descrit en el pdf:

$wget http://www.kegel.com/wine/winetricks
$~

i les opcions que he marcat (que recordi), són:

corefonts
dcom98 -> no hi és
gdiplus
gecko-dbg -> l'afegeixo jo
gecko
mdac28
msxml3 -> em sembla que marco msxml6, la última versió disponible
vcrun2005 -> marco tots els checks de vcrun, des de vcrun2003 fins a vcrun6sp6
allfonts
fakeie6 -> no hi és

No tinc cap garantia de què sigui una recepta que funcioni, però almennys m'ha funcionat.

Instal.lació del AVR Studio a Windows

No dóna problemes, és la manera com treballen els desenvolupadors.

Llenguatge ensamblador

label:  .EQU var1=100    ; Set var1 to 100 (Directive)
        .EQU var2=200    ; Set var2 to 200

test:    rjmp test       ; Infinite loop (Instruction)

Anem comentant tot allò que trobem en el codi meeblip.asm a mida que ho anem trobant.

.NOLIST
.INCLUDE "m32def.inc"
.LIST

El header file es diu xxxxdef.inc, on xxxx es el tipus de xip, en aquest cas un Mega32. Això ho podem veure precisament en el fitxer m32def.inc (http://avr.8b.cz/inc/m32def.inc), on una de les primeres instruccions és la directiva .DEVICE:

.device ATmega32

En l'esnsamblatge, un dels fitxers de sortida és el llistat. Per tal de no incloure totes les instruccions del fitxer de capçalera, fiquem .NOLIST i després .LIST

                    .INCLUDE "m32def.inc"
                    .LIST
                    .LISTMAC
                    .SET cpu_frequency = 16000000

Definició dels registres. els definim amb mnemotècnics:

;current phase of DCO A:
.DEF PHASEA_0	    = 	R2
.DEF PHASEA_1	    = 	R3
.DEF PHASEA_2	    = 	R4

Hi ha 32 registres en el AVR: R0...R31

Després del fitxer de capçalera i les definicions inicials, el programa comença amb el reset i el vector d'interrupcions (.CSEG):

;-------------------------------------------------------------------------------------------------------------------
;			V E C T O R   T A B L E
;-------------------------------------------------------------------------------------------------------------------
            .CSEG

		    jmp	RESET		            ; RESET

		    jmp	IRQ_NONE	            ; INT0
		    jmp	IRQ_NONE	            ; INT1
		    jmp	IRQ_NONE	            ; INT2
...

IRQ_NONE:
            reti
...
RESET:
            cli				            ; disable interrupts

on la instrucció reti és Interrupt Return, PC <- STACK, posar el valor de la pila al program counter.

La instrucció cli: Global Interrupt Disable, I<-0


El programa principal comença sempre amb la inicialització del punter de pila, posar els registres al valor per defecte, i inicialitzar els components hardware,

PULSE_ZERO:
			ldi		R17, 0

ldi: LoaD Immediate, fica el valor 0 en el registre R17. ldi carrega un número fix o una constant.

Only the registers from R16 to R31 load a constant immediately with the LDI command, R0 to R15 don't do that. This restriction is not very fine, but could not be avoided during construction of the command set for the AVRs.

En totes aquestes comandes els registres també han de ser R16...R31: ANDI Rx,K ; CBR Rx,M ; CPI Rx,K ; SBCI Rx,K ; SBR Rx,M ; SER Rx ; SUBI Rx,K

CALC_DCOA:
		    mov	    R17, PHASEA_2		; sawtooth ramp for OSCA

mov: moure el contingut d'un registre a un altre. El primer registre (R17) sempre és el destí.

MOV Rd, Rr        Copy Register Rd <- Rr 
<pre>

<pre>
clr 	r17

CLR: posar un registre a 0. Això ho podem fer amb els 32 registres.

video

Vull fer un video demostratiu de com funciona el Meeblip (no és el video de 50 ways...). Amb lilypond he creat el fitxer oxygenIV_v1.midi (Jean-Michel Jarre, tinc el score, un midi i el mp3 a /home/joan/musica).

Per tenir les mans lliures mentre el seqüenciador va enviant missatges midi al Meeblip, vull que el seqüenciador faci un loop sobre el midi. i així despreocupar-me de tocar la música. Com a seqüenciador utilitzo el seq24, i aconsegueixo l'objectiu de la següent manera.

El seq24 té aquestes cosetes una mica críptiques, tinc indexat el video aquell tan aclaridor.

gravació del video

Meeblip setup.jpg

Solució 1. Meeblip + UA25EX + Axiom25: Incorrecte

Allò lògic seria utilitzar el UA-25EX per enviar missatges MIDI al Meeblip. Però això vol dir que he de treballar en mode avançat, i no puc treballar en mode avançat i full duplex amb el portàtil (degut a problemes amb el USB controller com ja s'ha comentat...). I per què necessito full-duplex? doncs per fer el video vull gravar l'audio amb qualitat, i això implica ficar la sortida del Meeblip a l'Ardour per gravar el so amb qualitat (treballant amb full-duplex o record-only). Aleshores, com ho puc fer?

La solució passa per arrencar el JACK en mode duplex i mode avançat=Off (sense MIDI). Aleshores, com puc utilitzar el MIDI per enviar missatges al Meeblip. Doncs a través del Axiom 25, que té un mode que fa de interfície USB-MIDI. Mirem el manual del Axiom 25:

Llegim en la pag 5:

It is also possible to stream data from your computer to external MIDI gear connected to the MIDI OUT port of your Axiom—
effectively a USB to MIDI interface. To do this, you should select the Axiom output device in your software. Note that some other
steps are necessary to make this work that will be fully explained later in this manual.

i està explicat en la pag 32:

Section 4.1. MIDI Out from USB Function (pag 32)

MIDI Out from USB can be used to switch the source of the MIDI data seen at the MIDI Out port of your Axiom.
On initial power up, MIDI Out from USB mode is off. This means that as you play your Axiom, MIDI data will be sent to the MIDI
Out port.
If you turn MIDI Out From USB mode on, playing your Axiom will no longer send data to the MIDI Out port. The data is instead
streamed from the computer. So, as long as you have selected your Axiom as the active output port in your computer’s sequencer,
this is the data that will be sent the MIDI Out port.
For example, if you want to control a sound module from your Axiom, you should ensure MIDI Out from USB remains off. If you want
the sound module to play data streamed from your computer however, then you should turn MIDI Out from USB on and ensure that
the output port for your Axiom is selected as the computer’s MIDI output device (this is done in your computer software).
The following diagrams clarify the routing of MIDI data when MIDI out from USB mode is both off and when it is on:

Mirar els dos diagrames, que són clarificadors. I per fer que MIDI Out from USB mode = ON, senzillament:

El que jo vull és enviar els missatges midi provinents del seqüenciador seq24 al Meeblip, i la sortida gravar-la per l'Ardour. La cadena del flux de dades és: 1. seq24 (tinc carregat el midi oxigene4_v1.midi) 2. en el seq24 escullo com a port el Axiom25, que vol dir que redirigeix cap al Axiom (important, ho fa via USB) 3. en el Axiom24 tinc configurat MIDI Out from USB mode = ON, que vol dir que el que rebi per l'USB ho redirigeix a MIDI OUT (ara el teclat del Axiom no té cap efecte) 4. Connecto el MIDI OUT del Axiom 25 al MIDI IN del Meeblip 5. La sortida del Meeblip la conencto al Edirol UA25Ex, per tal de gravar el so per l'Ardour (connectar el Meeblip a la UA25EX amb un cable mono-mono), i gravar una pista mono.

Recordem que tot això es complica perque no pic arrencar la UA25EX en mode duplex i mode avançat, degut al buggy USB controller del portàtil. Però amb el servidor del local i la Terratec sí que seria més fàcil, i no necessitaria per res el Axiom25.

Solució 2. Meeblip + UA25EX: Correcte

No puc treballar en mode fullduplex i mode avançat, però sí amb Only recording i mode avançat. Per tant, engego el JACK amb aquest mode i ja puc connectar la sortida MIDI OUT de la UA25EX al Meeblip (MIDI), i la sortida del Meeblip a l'entrada de la UA-25EX (audio), per tal de gravar amb el Ardour. El que no puc fer és plauback, però això no vol dir que no pugui monitoritzar el que estic gravant amb els cascs. No s'ha de confondre playback amb monitoring, són coses diferents.

Per tant, aquesta és la solució més correcta i elegant (tenint en compte que tinc un buggy USB controller), i no necessito per a res el Axiom 25.

Havia fet proves d'arrencar el recording amb la UA25EX, el playback amb la tarja interna (Intel HDA) i mode avançat, però malauradament això tampoc funciona.

Guió video: experimentant amb el Meeblip

  1. Començar amb el DCOB disabled, i buscar un so que sigui bastant mel.lòdic, sense filtres i sense LFO, sense distorsió i sense soroll.
  2. Provar d'afegir soroll i distorsió, i tornar a deshabilitar.
  3. Ara jugo amb el filtre: normalment utilitzo el LP filter per aconseguir un efecte mel.lòdic. el HP filtre fa això: un efecte amb més soroll. Un efecte interessant amb el LF és DCF cutoff 0 0 4. i DCF Rez a tope (clar que això queda molt modificat amb els envelopes, per tant, he de jugar amb ADSR per tal d'aconseguir l'efecte desitjat).
  4. Ara introdueixo el LFO (LFO Depth, LFO Speed i LFO Wave)
  5. Fins ara he treballat amb DCO B disablet. Ara l'habilito i jugo amb DCOB wabe, DCOA/B mix, detune i DCOB octave.
Eines de l'usuari
Espais de noms
Variants
Accions
Navegació
IES Jaume Balmes
Màquines recreatives
CNC
Informàtica musical
joanillo.org Planet
Eines