Analog3: 最初の設計例

DSC02688

Analog 3 の開発を休止してから1年が経ってしまいました。そろそろ再開しようと考えて、最初の設計例として作りたいシンセのパネルの粗案をかいてみました。パラメータ数は多いし、VCF のパラメータの例のように、伝統的なパラメータと考え方の違うものも多々あります。作って行くうちに更新や調整が必要になってくる可能性があります。ハードウェアの作り直しを避けるために、以下のような道筋で開発を進めようと考えています。

  • 最初に動くことがわかっているシンセから出発する。
  • このシンセを改造してゆくことで開発を進める。
  • 改造は、モジュールを1個ずつ Analog 3 のものに置き換えることで行う。
  • 新しいモジュールはソフトウェアパネルを使う。
  • 古いモジュールはハードウェアパネルを使い続ける

このようにして、常に完全なセットで音が出る状態で開発を進めようと考えています。

ということで、最初にする作業は、Analog2.0 の基本セットを組み立てることです。

 

今何を作っているのか

analog3もうここ数年ろくに新しい製作の記事を書いてないのですが、作るのをやめてしまったわけではなく、単に手こずっているのであります。あと、自分でも何を作っているのかよくわかっていなかったためなんとなく記事にしづらかったのであります。

作っては失敗し、やり方を変えてまた作り、を繰り返しはや数年、ここ一ヶ月ぐらいでやっと動く様が見られるようになってきました。動くものを見たら自分が何を作っているのかやっと少しずつわかるようになってきました。

今やっているのは、Analog3 というアナログシンセサイザー作りの新しいプロジェクトです。でも今の所アナログ回路はほとんど組んでいません。大半がソフトウェアです。まだもうしばらくソフトウェアばかり組むことになりそうです。

ソフトウェアの進捗はブログにまとめづらいのですがソースコードは GitHub で管理していてそちらから見られます。

https://github.com/naokiiwakami/analog3

何でアナログシンセなのにソフトウェアばっかりになっているかというと、以前していた Analog2.0 プロジェクトは一旦開発終了として(サポートは現在も続けてます!)、次のシンセを作ろうと思った時にこんな葛藤があったからです。

  • アナログシンセ、細かい所に不満が多すぎる。もっと細かいところをしっかりたくさん作り込みたい。
  • でも、こまこまと作り込むと、設定パラメータが増えてしまう。
  • アナログシンセには操作パネルが付いていて、パラメータ一個につきツマミが一個必要。
  • パラメータが増えたら、ツマミの数が大変なことになるよ。ツマミ100個とかになったら作るのは大変な手間だし、作ったとしてもごちゃごちゃしてて操作できないよ。
  • しかも、回路をちょっと変えただけでパネルの作り直しが必要になったらいつまでたっても完成しないよ。
  • こまった…

しばらく色々考えて、こんな風に考えるようになってきました。

  • パネルがなければ回路を変えてもあんまり困らないんじゃね?
  • パネルはソフトウェアで作っちゃう?
  • パネルがソフトなら、律儀にパラメータ一個にツマミ一個つけなくてもいいんじゃね?減らしたりまとめたりできるよね?操作楽だよね?
  • いいかも
  • でもツマミをくりくり回せないアナログシンセなんてアナログシンセじゃないよ。作る意味ないじゃん?

そんなわけで、色々試行錯誤してゆくうちに、Analog3 はこんな風なシンセになってきました。

  • あくまでもアナログシンセサイザー
  • でもパネルを作らなくてもいい
  • でもパネルを作りたくなったら作ってもいい

冒頭の写真の試作では、LFO モジュールを PSoC で実装して、アナログシンセを揺らしています。LFO のパネルはなくて、そのかわりにパネル情報が PSoC のモジュールに入っています。これを Raspberry Pi を経由して Mac から読んで、Mac の画面に描いています。ただ描くだけじゃなくてちゃんと操作もできます。まだ実装中ですけれども。ツマミを回すぐらいのことはできるようになってきました。

組み込み向け exp() 関数の実装方法

楽器系の作り物をマイクロプロセッサでするときには、指数関数が必要になる場合が頻繁にあります。汎用の実装は遅くてでかいので、組み込みには向きません。正確さが必要な場合は少ないですが、スピードと小ささは重要です。

組み込み向けの実装をいくつか探したので忘れないようにここにリンクをはっておきます。

http://www.convict.lu/Jeunes/ultimate_stuff/exp_ln_2.htm

http://www.quinapalus.com/efunc.html

今の所、過去に試作したエンベロープジェネレータの指数関数計算部分を流用していて、まだでかくて遅いですがとりあえず今やっているプロジェクトで使っている PSoC 4200 に収まってちゃんと走っているので困るまでこのままにしておくのではあります。

Memo: Maven

Installation

How to install Maven on Windows

Maven is a Java application, so we are just fine with expanding product zip package and setting environment variables M2_HOME and JAVA_HOME and set PATH.

Creating a Maven Project

Maven in 5 Minutes

Maven in 5 seconds… dothis:

mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Stub Synth Module for MOM Development

MOM (Master Of Modules) manages synthesizer modules to make them work as a single musical instrument.  The main responsibilities of MOM are

  • Control patching.
  • Control parameters.
  • Organize voices.
  • (possibly) Organize modules such as device ID management.

Designing and implementing MOM and synth module data model is yet another challenge out of building CAN network.  Basically, the inter-module communication depends on CAN physical layer, but it’s a pain to dragging such a dependency during the MOM development.  I’m sure the CAN network would be quite unstable at first and I don’t want to stop and troubleshoot CAN while I’m working on MOM.

So, in order to remove dependency on CAN network, I’ll build the initial version of MOM based on TCP/IP with dummy (stub) synth modules that are purely software oriented and talk TCP/IP.  Once the MOM design is fixed, I can replace the TCP/IP driver by CAN driver later.  It will not ruin the module data model.

MCP2515 CAN Controller

As I mentioned in the previous article, I’ll use MCP2515 CAN controller for inter-module communication (initially, at least) for the Analog3 Project.

Datasheet of this device is available at the product page.

MCP2515 consists of CAN protocol engine, data buffers,  controller, and SPI interface as illustrated in the picture below.

MCP2515_block_diagram

a3_networkYou need to attach a processor to make this device functional.  In early phase of the project, I’m thinking of using a Raspberry Pi as the Master Of Modules (mom) and Arduino’s for dummy synthesizer modules.  Arduino is not a realistic solution for Analog3 both in terms of cost and performance.  So, I’m thinking of implementing a common synthesizer module driver based on PSoC or CAN enabled AVR.  MCP2551 is CAN transceiver.

It may take a while to get used to MCP2515.  Here are several links that are useful for getting started:

MCP2515 Linux Device Driver (probably for Raspberry Pi)

Arduino Example Sketch

https://gist.github.com/rechargecar/4177820

AVR Example Code (C)

Changing the Strategy for Analog3

I’ve been trying for a year to make my own serial interface protocol to exchange data among synth modules.  Though it showed some progress, I kind of giving up this approach.  The problem is complexity of serial interface controller.  A controller for multi-master serial interface is complex.  Implementing using a generic device is more costly in many sense than I expected.  I started with Arduino.  This was the easiest approach but channel was too slow.  I could only achieve 50kbps.  Then I tried implementing it into AVR using assembler language.  It went 100kbps but it was about the limit.  The most serious problem with MPU was that the processing is always on single thread.  Some data processing has to be done in parallel during data reception, but it was pretty inefficient to run such concurrent tasks on 8-bit simple processor.  Overhead for such multi-tasking killed the speed.  Then, I moved onto PSoC.  It achieves bit rate 400kbps easily and it might go higher if it’s tuned well.  However, the logic to handle collision is so complex that I eventually am suffered from lack of resources in PSoC.

So at this point, it seems more practical to use a ready-made implementation of an existing protocol, which is CAN.

The reason I didn’t go for CAN at first was speed.  I wanted to use the interface even for synching oscillators.  I was not sure if 44bit-at-shortest message from at 1 Mbps is short enough for that usage.  (I’m not sure yet.  It’s about 22kHz rate if you keep repeating shortest CAN message at the highest rate.  That’s pretty close to audio frequency.  If an oscillator keeps sending such messages, the communication channel would be pretty much occupied.)  So probably I need to give up some usage of the common data bus.  I will go with following approach:

  • Use cheap CAN controller and transceiver: MCP2515 and MCP2551.
  • MCP2515 is controlled by SPI.  Most processors can use it.
  • I’ll use Raspberry Pi for the master synth controller module.
  • Synth modules can be based on PSoC or AVR.  These two are ones I am familiar with.
  • I’ll give up some features such as oscillator sync network.

Raspberry Pi Setup Memo

Search engine helps, but I’m so lazy that I don’t like to do the same search repeatedly.

Wireless LAN setup:

Use application “Wifi Configuration” from GUI menu.

Common WIFI dongle problem of falling of network:

Power management feature is enabled in default for device 8192cu.  Having following file resolves the issue:

See https://github.com/xbianonpi/xbian/issues/217

CAP/CTRL swap:

See http://raspberrypi.stackexchange.com/questions/5333/how-to-map-caps-lock-key-to-something-useful

Set static address to wifi interface:

Edit /etc/network/interfaces.  If the setup for wlan looks like following,

modify as follows:

 Install Inconsolata font:

http://www.raspberryconnect.com/raspbian-packages-list/item/64-raspbian-fonts

Set timezone:

% sudo dpkg-reconfigure tzdata

Raspberry Pi B+ Pinout

Picture in Pi4J Project:

Raspberry Pi I2C clock-stretching problem

The I2C slave that I’m developing has been failing intermittently.  I finally noticed this was a known bug in Raspberry Pi that mishandles clock stretching.

I2C slave may delay response by holding SCL low.  However, when the slave does it, the I2C master in Raspberry Pi gives very short clock for the first bit of the next byte.  The symptom can be seen as following picture.

10678616_689709434441211_7585444260259589843_n

More detail explanation can be read in this link:

http://www.advamation.com/knowhow/raspberrypi/rpi-i2c-bug.html

In order to workaround this, I set data rate in I2C slave module higher.  The communication rate is 400 kbps, but I set the data rate 1000 kbps.  It worked for me.  Here is the setup of I2C slave module.

I2Cslave

 

Eagle 5 と Eagle 6 を混在して使う (Windows)

Analog2.0 を含め、今までのプロジェクトは CadSoft Eagle を使って回路図・基板レイアウトの設計をしています。最新のバージョンは 6.5 あたりですが、ライセンスの関係でいまだに  ver. 5 を使っています。バージョン6での大きな変更点として、データファイルの形式がバイナリからXMLに変わったことがあります。データがテキストですと、バージョン管理ソフトとの相性がよく、今まで苦しんでいた履歴管理がぐっと楽になる可能性が高いです。ですが、古いプロジェクトは「データファイルを変更せずに」参照できないといけません。なので、Eagle 5 と Eagle 6 の混在環境を作ってみることにしました。今まで混在環境を長く維持できたことないんですが、どうなることやら

Continue reading “Eagle 5 と Eagle 6 を混在して使う (Windows)”