<< ICの一覧へ戻る

YM2203・YMZ294・SP0256を使ったハードウエアMIDI音源の製作
SP0256-AL2について

SP0256-AL2 speak

読み方はSPゼロ256です。海外サイトではSPオー256と言っているところもあるようですが、0が細いのでゼロで正解だと思います。 製造メーカーはAY-3-8910を作ったあのGI製で、Microchip Technologyの前身です。 事実SP0256Bというデータシート(DS50018A)がMicrochip Technologyから発行されています。
このICはSpeak & Spellのような英語の音声を出すためのスピーチシンセサイザーで、いわゆるボーカロイドのIC版という感じです。

(wikipediaより)

話声信号は管の端にあるブザーにより生成され(有声音)、そこに時折こすれる音や破裂する音が加わる(歯擦音や破裂音)という仮定の下、LPCが考案された。 このモデルは非常に粗雑ではあるが、実際の話声生成に極めて近いものである。声門がブザーのような音を生成し、その特性は強さ(大きさ)と周波数(高さ)で決まる。 声道(咽喉と口)は管を形成し、フォルマントを生み出す共鳴や生成した音の倍音周波数帯で特徴付けられる。歯擦音や破裂音は舌や唇や咽喉の動きによって生み出される。

このICでは母音・子音など細かなフレーズが収録されていて、それらを組み合わせて言葉の「ような」音を作り出すことができます。 SP0256シリーズには-AL2という英語の基本的な発音が収録されているものや、-012・-017・-019という枝番号でゲーム機、喋る時計などに使用されていました。

今回使用するAL2は、英和辞書に載っている「発音記号」ごとに音が用意されていると思えばわかりやすいと思います。 なので、日本語を話そうとすると英語圏の人が日本語を喋ったような感じになり、とても面白いことになります。
また、AL2はそのまま使うと英語は話せるものの音の高さを変えることができません。 Speak & Spell のように自然な喋り方をさせるために専用の外部ROMを付けられるようですが、すでに流通していませんし、 単なるPCMのデータが入っているわけでもないので使いこなすのは難しいのではないでしょうか。


コントロール方法

制御の肝とも言えるインターフェース部分です。
Interface

右側のHANDSHAKE CONTROLでSP0256の状態をチェックしてデータを送ります。 たとえば、SP0256がLoad Request(/LRQ・ロード可能)している場合にアドレスラインにフレーズ番号をセットして、/ALD(Address Load)を有効にすると音が出て/LRQとSBYが変化します。 その時、内部に1フレーズ分のFIFOを持っているので/LRQはすぐに復帰するのですが、SBY(Standby・Notビジーの意味)が実際に発音を終えた時に元に戻ります。 ただしその間隔が非常に長く、「アウト」の「あぅ」を喋るのと同じ時間待たされます。そのため次々来るMIDIメッセージを如何に処理するのかが肝になってきます。 まぁ、FIFOを実装するだけなんですけど。

このICのクロックはデータシートによると3.12MHzを使えと書いてあるのですが、共立で聞いたところ「そんな周波数見たことない」とのことで、 EXO3の12.8MHzを4分周して3.20MHzとして供給することにしました。実際鳴らしてみると、うまく音は出るものの音の高さが変わらないためなんだか物足りません。 そこで、19.66MHzのEXO3を8分周した2.458MHzや4MHzのクロックを加えてみたところ、普通に音程が変わって動いてしまいました。 さらに、3.20MHzではA(445Hzあたり)、4MHzではC#ととほぼ同じ音程で発音することが分かりました。しめしめ、あとはクロックを切り替えるだけ…
★ 予備に買ったチップでは4MHzで駆動させると暴走しました。オーバークロックのギリギリのラインだと思うので、うまく動かない場合は少し低い3.805463MHzにするとCの音で鳴らすことができます。


供給クロックの切り替え回路

74HC157 speak
クロックの切り替えには74HC157を使いました。 SELECTにLを入れると、1Aが1Yに出る。SELECTにHを入れると、1Bが1Yに出る。1Aと1Bにクロックを入れて1YにSP0256をつなぐだけです。結構強引ですがこれがうまく動くんですよ。 ただし2つのクロックが同期していないので切り替える時にSP0256が誤動作するのを防ぐため、SP0256のリセット信号を有効にしながら切り替えます。ブッって言う音が瞬間的に入るんですよ。
ちなみにSP0256のリセットパルスは100us以上待たないといけません。20MHzのPICで1サイクル0.2usなので結構長めのタイマーを入れる必要があります。

<< ICの一覧へ戻る