Twitter Weekly Updates for 2012-05-04

  • hernia+黒電話666! http://t.co/vyn6dMwe #
  • Trash Sugar! http://t.co/Av8Vgk4H #
  • On my way to gallery AMP in Koenji. And guess what? Keio line is late! #keiosucks #
  • Guess what ? Keio line is late again #keiosucks #
  • Now really drunk… #
  • On my way to denoise 4! After an amazing opening party of the DIY Musicians exhibition. Already a bit drunk… #
  • Guess what? Keio line late again. There are about 5 persons in the train, how could it be? #
  • DIY Musicians => Opening party tonight 5pm~8pm! http://t.co/ahfdi0nG #
  • DIY Musicians exhibition is started! Great instruments to see! Please come if you some time: http://t.co/EiGHKkKM #

Powered by Twitter Tools

Twitter Weekly Updates for 2012-04-27

  • Thank you Keio line: yesterday 30min. late, today 15 min. late. May be soon trains will be on time. #
  • Les Belles Noiseuses no.20:
    http://t.co/2BG7jHIK #
  • Les Belles Noiseuses no.19:
    http://t.co/yQ8cgeA1 #
  • Lick the Silence just started, there is still plenty of time to come by! http://t.co/rpSEj4iI #
  • "Lick the Silence"
    is today ! http://t.co/PRV3Vu8u #
  • 今日!「静寂を舐めて」
    http://t.co/PRV3Vu8u #
  • It takes place in a wooden house on the outskirts of Tokyo. A perfect location for a lazy afternoon and brunch in a relaxed atmosphere! #
  • Lick the Silence is an exploration of the quieter side of electronic and acoustic improvised music. #
  • 明日だよ!静寂を舐めて@ merdre, 府中。http://t.co/PRV3Vu8u #
  • Want to spend a relaxed Sunday afternoon of quiet music and more? Come to "Lick the Silence", tomorrow 22/04 @ merdre: http://t.co/K3OEmjbv #

Powered by Twitter Tools

Twitter Weekly Updates for 2012-04-20

Powered by Twitter Tools

Twitter Weekly Updates for 2012-03-30

  • Tomorrow, I'll be pedaling to produce some electricity for the 帝王切開 feat.Utako performance!
    http://t.co/XGn1TL0z #
  • Tomorrow/明日!遊∞PLAY∞ASOBU∞ →
    http://t.co/ONWdOSBm #
  • Now on my way to garigari for the monthly obakeyashiki. #
  • Played with "charlieplexing", a great and easy way to get a lot more digital outputs on your microcontroller! #
  • 11 future "belles noiseuses". http://t.co/g1EsNyvs #

Powered by Twitter Tools

Charlieplexing

Recently, I needed to have a lot of digital outputs on my microcontroller. I needed more than what was available on the microcontroller and didn’t have any multiplexer nearby. After some thinking, I got the idea of using the digital pins in three states (HIGH OUTPUT, LOW OUTPUT and INPUT) instead of two (HIGH and LOW OUTPUT).

Of course, I quickly discovered that this idea is far from being an original one and is known as “charlieplexing”. Not need to go more in details as the wikipedia page has pretty much everything you need to start charlieplexing.

Thanks to charlieplexing, I could drive 8 modulated IR LEDs and 8 visible light LEDs without problem.

PCM audio on attiny85 (code example)

Setting of the registers for PCM audio on attiny85 (8MHz).

// Timer 0 for sampling rate (8kHz)
 TCCR0A = (1 << WGM01); // CTC mode
 TCCR0B = (1 << CS01); // prescaler 8, frequency is 1MHz (cpu is 8MHz)
 TIMSK = (1 << OCIE0A); // COMPA interrupt
 OCR0A=125; // 1MHz/125 = 8kHz, the sampling rate.
// Timer 1 for PWM
// PWM mode (250kHz) with duty cycle by OCR1A / toggle output on OC1A=PB1 / prescaler=1 (8MHz)
DDRB = (1 << PB1); // PB1 as output
TCCR1 = (1 << PWM1A)|(1 << COM1A1)|(1 << CS10);

Then, in the interrupt, the analog value is set through OCR1A. This is similar to reading from a wavetable in the case of DDS.

PCM audio on AVR

After playing a while with DDS (Direct Digital Synthesis), let’s see what we can do with PCM (Pulse-Code Modulation). Simply said, PCM is just a way to digitally encode analog signal (in our case, sound). PCM has two parameters, sampling rate and bit depth (resolution).
So what is the difference between DDS and PCM when it comes to generate sound with an AVR ? Basically nothing, as in both cases the signal is represented digitally and then a DAC (Digital Analog Converter) is used to generate the analog signal itself (for example, a sound).
The difference is mostly in the nature of the sound to be generated. PCM is used to represent any analog signal digitally. The longer the signal the more samples are necessary. In the case of AVRs, it means that the length of the signal that can be represented with PCM is rather limited as the memory is relatively small.
DDS is particularly adapted to periodic signals. That is why it is mostly used to generate waveforms. So if one wants to play sound samples (voice for example), PCM would be more adapted. If one wants to do a synthesizer, DDS is the way to go.
The other difference is that PCM has a sampling rate that can be changed to vary the pitch. While in the case of DDS , the sampling rate is basically constant. To change the frequency of a waveform, more or less samples are read but at a constant sampling rate. This technic is not adapted for PCM as for example, to read only one sample every two samples (increased frequency) means a loss of information that can make the original signal unrecognizable (especially in the case of voice).
In the case of DDS, the sampling rate is usually high (higher than the largest frequency in a typical sound signal) and thus, a single timer to generate both the sampling rate and the PWM (Pulse-Width Modulation) can be used to generate the analog signal (one cycle of PWM for one sample, the sampling rate and the PWM frequency are the same). In the case of PCM the sampling rate is usually low (a lower sampling rate means less samples per second, that is less samples in memory, but a lower sound quality) so using PWM at the same frequency that the sampling rate to generate the analog signal is not possible as one would “hear” the PWM signal. In this case two timers are necessary, one to generate the sampling rate and a second one to generate the PWM signal at a much higher frequency. That is for one sample, there will be significantly more PWM cycles. To play a PCM sound sample, you just have to encode it at a low sampling rate (8kHz for example) and with 8 bits resolution (this is the resolution of the PWM on attiny85 and a lot of other AVRs). Next time I’ll post an example of PCM code for the attiny85. In the meantime, you can check this example or this tutorial.

Twitter Weekly Updates for 2012-02-24

Powered by Twitter Tools

Simple (and dirty) DDS on attiny85

For my noisy dolls (Les Belles Noiseuses), I was using a slightly modified Atari Punk Console circuit. It’s nice but after building a dozen of dolls, I wanted to enlarge the variety of sounds the dolls could make.
For this, I decided to go digital and use a microcontroller (in my case an ATTINY85) instead of the previous 555 timer ICs. In addition to be able to generate more various sounds, the advantages of the ATTINY is its smaller size (8 pins instead of 14 for a 556 IC) and the need for less discrete components.

The question was then of how to generate a waveform with a microcontroller. Of course, you can easily generate a square waveform from PWM, but what if you want other waveforms (like a sine for example) ? In this case DDS (Direct Digital Synthesis) comes in handy. It is actually quite simple to implement and results are pretty nice as long as you don’t care about noisy results (which is what I’m aiming for anyway).

To show you how simple it is, here is the code to generate 4 types of waveforms. The frequency is selected with a pot and the type of waveform with a second one.


#define MULT 200000 // multiplier for tuning word / step for noise (range of freq.)
#define MMIN 2000000 // minimal value of tuning word
byte waveform=0; // waveform
unsigned long M,Mraw,C=0;
// M is the tuning word, Mraw is tuning word before processing
// C is the 32bits counter

const unsigned char sine256[] PROGMEM= { // sine wavetable
127,130,133,136,139,143,146,149,150,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240,
242,243,244,245,246,247,248,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,
221,219,217,215,212,210,208,206,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,138,115,111,108,105,102,99,96,93,90,87,84,81,78,
76,73,70,67,64,62,59,50,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,2,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31,
33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,75,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124};

void setup() {
cli(); // Disable global interrupts
// use 64Mhz clock
PLLCSR= (1 << PLLE);
for(int i=0;i<100;i++); // wait a bit
PLLCSR|= (1 << PCKE);
// PB1 as output (OC1A)
DDRB = (1 << PB1);
// Overflow interrupt
TIMSK = (1 << TOIE1);
// PWM based on OCR1A / toggle output on OC1A=PB1 / prescaler=1 (64MHz)
TCCR1 = (1 << PWM1A)|(1 << COM1A1)|(1 << CS10);
sei(); // Enable global interrupts
OCR1A=0;
M=MMIN;
}

ISR(TIMER1_OVF_vect) // Interrupt Service Routine
{
switch(waveform) {
case 1: // sawtooth
OCR1A=((C+=M)>>24);
break;
case 0: // sine
OCR1A=pgm_read_byte(&amp;sine256[((C+=M)>>24)]);
break;
case 2:// square
if(((C+=M)>>24)<128) OCR1A=0; else OCR1A=255;
break;
case 3: // random
if (C>Mraw) {
OCR1A=random(256);
C=0;
}
C+=MULT;
break;
}
}

void loop() {
Mraw=analogRead(3)*MULT;// Frequency pot
M=max(MMIN,Mraw);
waveform=floor(analogRead(0)/256); // // Waveform pot, 4 choices
}

Some comments about the code:

- MMIN gives the lower frequency you can get for a waveform (not including the random noise).
- MULT gives the highest frequency you can get as well as the steps in frequency. There is a trade-off here. Either you have a smaller range of frequencies but with finer steps or a larger range with bigger steps.
- The random noise has a higher frequency when M/Mraw is getting smaller while the other waveforms have a higher frequency when M/Mraw is getting larger.
- There is exactly one PWM cycle per sample.
- In theory, the sampling rate is 64M/256 that is approximately 250kHz. It is a bit lower because of the time needed to execute the interrupt.
- Why a 32bits counter if I use only 8bits ? It is to have a better resolution (and range) for the frequency without using floats that take to much of the CPU time.
- This is a very basic code. Each doll will have a different code with for example, random choice of the waveform, mix of waveforms, other custom waveforms defined as wavetables (instead of only a sine), other functions for the pots, …
- For the DAC, I’m using a simple RC low pass filter. It is sufficient for this application.

SQUIRM 2.5

w/ HUH+野本直輝, いちろう, HALBACH, disk-3, 人間ドッグオーケストラ (The Ningen Dogs Orchestra), ASTRO+ROHCO, scum

人間ドッグオーケストラ は23N! + super utako + HIKOです。今回は ジャイアント人間ドッグ マサミもでるよ‼‼‼

The Ningen Dogs Orchestra is 23N! + super utako + HIKO. This time, Masami the giant ningen dog will participate too !!!!

 

Twitter Weekly Updates for 2012-02-17

  • 2/25: http://t.co/0jHNsiS7 #
  • EROS-TEN: http://t.co/9r685aoI #
  • For example, not running trains because they feel lazy. #
  • Keio line is the typical example of capitalism. Because investment to build a concurent line is too high, it can do whatever it wants. #
  • Once again, keio line proves to be the worst line in Japan. #
  • From today: EROS-TEN http://t.co/cbqbDzEK
    Erotic artworks by TARZAN KICK,
    PeroPero Ojiichan(aka Kitaura Eroko),S. Shibatsuji-Perrin,芝辻ペラン詩子 #

Powered by Twitter Tools

Twitter Weekly Updates for 2012-01-27

  • エロス展!
    http://t.co/7SbdbHqB #
  • Tomorrow (28 Jan.), 17:00~, at artist-run-space merdre (http://t.co/rZNC2maG), "HarshNoiseKo-chan"+"Ningen Dogs Orchestra" live ! 700yens. #
  • 「ハーシュノイズ子ちゃん」と「人間ドッグ・オーケストラ」ライブ:あや野企画展 「危ゃわゆい王国」1月28日(Sat)17:00〜 Charge ¥700 at artist-run-space merdre (http://t.co/rZNC2maG) #
  • Tonight at Ance (Yoyogi), I'm playing with Kelly and Misako. We should play around 22:00. Not too late to come by! #

Powered by Twitter Tools

Twitter Weekly Updates for 2012-01-20

Powered by Twitter Tools