Category Archives: tech notes

Noise Source Transistor — Conclusion

DSC00098_2I have been working for a while to determine which transistor to use for noise source in noise generator.  I was using 2SC3311 which was obsoleted recently.

I did several tests, mainly by listening, and chose BC547.  The reasons are:

  • It has good taste as a noise source.  Easy to find sweet spots when using it with a filter and VCA.
  • Noise level was close to 2SC3311, so my previous design works with simple replacement.
  • Availability is good.
  • Unlikely to get obsoleted soon.

I started the test with listening “raw” noise without any modification and filtering.  However, it didn’t work well.  Many of the candidates sounds similarly.  However, I found characteristics of transistors are so different when I also used a VCF and a VCA driven by an envelope generator.

Also, it was hard to determine “which sounds better” when I conducted A/B comparison test.  So I changed the strategy and just played with synth using each candidates, and chose one I felt the most fun to play with.  Thus I gave up “measuring” eventually.

Demo using the chosen transistor.


Reading Keypress with Python

This works for windows.

http://stackoverflow.com/questions/12175964/python-method-for-reading-keypress

However, you cannot use this feature from cygwin.  You need to invoke python script directly from Windows.  Double-clicking the python script works, but you need to catch exceptions in the case (otherwise, you don’t know what happened when an exception was raised).

Here is the sample program to read arrow keys.

#!c:\Python32\python

from msvcrt import getch
import sys

print("press ESC to exit")

while True:
    try:
        key = ord(getch())
        if key == 27: #ESC
            break
        elif key == 224: # special keys (arros, f keys, ins, del, etc.)
            key = ord(getch())
            if key == 75:
                print("left")
            elif key == 77:
                print("right")
            elif key == 80:
                print("down")
            elif key == 72:
                print("up")
    except:
        print(sys.exc_info()[0])

Dragon’s Tail

dragons_tailAs mentioned in my previous post, AVI Dragon’s SPI pins in debugWire interface have to be disconnected during debug run in order to properly run an application that uses SPI / USI.  I also noticed that the Dragon dominates RESET pin, too.  In my project, I’m resetting target chip from Arduino.  The Dragon is killing this functionality as well.  This makes me quite uncomfortable with my development work, so I’ve enhanced the switch I made on bread board previously, and made a helper device.  It’s nicely working.  I named it “Dragon’s Tail”.

Continue reading

About AVR Dragon

Memo about AVR Dragon basics.

What can be done with AVR Dragon:

  • Run the program in the target device in debug mode.
  • Stop at break points.
  • Do step execution.
  • Examine processor internals, such as memory and registers (capable only in stop mode).
  • Program the target device.

Tips

  • The doc provided by Atmel worked best for me for “getting started” document.
    http://www.atmel.no/webdoc/avrdragon/index.html
  • There are several ways to connect Dragon to the target device for debugging.  However, only debugWire is available for ATTiny* chips.
  • debugWire commonly utilizes 6-pin header for ISP (In Circuit Programming).
  • Dragon can be used both as OCD (On Chip Debugging) and ISP devices.  However, these modes cannot be run simultaneously.  The device is modal.  AtmelStudio has capability to switch modes.  In order to close debug mode and return to normal, do debug -> disable debugWire and close from AtmelStudio.  This functionality is available only when running debug execution.
  • AVR Dragon interferes Arduino over USB hub.  If you connect both into the same USB hub, serial interface of Arduino eventually freezes.  Connect different USB ports to avoid this problem.

Candidates for Noise Source Transistor

Typical analog noise generators make signal by amplifying AC component coming out from zener current of transistors reversely biased between emitter and base (here’s an example circuit).

Any bipolar transistor would work as such a noise source, but noise quality in listening is different from part numbers.  2SC828A is well known as good noise source, but it’s been obsolete for long.  So for Analog2.0, I have been recommending 2SC3311 instead.  But this part becomes obsolete as well.  Now I have to find another one.

Continue reading

Latency of Serial.println() with Arduino UNO

As a part of my current experiment, I’m running following piece of code:

   if (digitalRead(pinDeviceReadReady) == HIGH) {
    Serial.println("DATA READY");
    spiSend(0x20); // command "read request"
    readBuffer.deviceId = spiReceive();
    Serial.println(readBuffer.deviceId);
    readBuffer.wireId = spiReceive();
    Serial.println(readBuffer.wireId);
    readBuffer.length = spiReceive();
    Serial.println(readBuffer.length);
    for (int i = 0; i <= readBuffer.length; ++i) {
       readBuffer.data[i] = spiReceive();
       Serial.println(readBuffer.data[i]);
    }
  }

where

inline void spiSend(uint8_t data)
{
  // wait for device ready to write
  while (digitalRead(pinDeviceWriteReady) == LOW);
  SPI.transfer(data);
}

inline uint8_t spiReceive()
{
  while (digitalRead(pinDeviceReadReady) == LOW);
  uint8_t data = SPI.transfer(0);
  return data;
}

Continue reading

Inter Module Communication

I’m going to try making a digital communication bus for synthesizer modules.

Analog synth has a very simple control language which is voltage.  Any message is translated to voltage that can be read by any modules that accept voltage input. So for example, VCO output is basically audio output but also can be used as control voltage of some other modules, such as VCO cross modulation.

This simple data exchange methodology makes analog synthesizer very versatile and flexible.  However, as a drawback, patch wiring would become too complicated as you make complex module network.

One solution for making the wiring simple is to use a single common data bass where all modules are connected, and exchange data selectively using some software.  Apparently, making such a bass for analog signals is impossible or extremely difficult. So I’m going to try making it using a digital bass.

Continue reading