音源ICの使い方一覧へ
HD43517 の使い方
注意:このサイトの内容を鵜呑みにし、事故や損失を招いた場合でも当方は一切の責任は負いかねます。自己責任でお願いします。
HD43517は主にCASIOの電子オルガンのCasiotoneシリーズなどに用いられていた波形合成音源LSIです。(LSIですが便宜上ICと呼びます。)
このICは日立のCMOS LSI HD43000シリーズの一つだと思われます。
Casiotone以外に使用されている機器は、今のところ見つからないので、CASIOの特注品である可能性が高いです。そのため、データシートの入手は現時点でできません。
入手には、該当ICが乗ったCasiotoneを分解するのが確実です。
・Casiotone 601
・Casiotone 602
・Casiotone 701
・Casiotone 1000P
・Casiotone MT-70
上記あたりの機種は確実にHD43517を使用しているようです。これ以外のCasiotoneシリーズにも使われているかもしれません。
HD43517単体では音を出すことはできず、AM6012などのDACまたはESK-S10L-0025CなどのR2RラダーDACとアナログシフタ回路が必要です。
***********************************************************
HD43517データシートの入手ができないため、この記事ではICの解析したものをまとめています。
そのため、未知の仕様や本来の使い方とは異なる使い方をしている場合があります。
この記事の内容をもとに実験してみる場合、ICの破損などをはじめとする事故や損害はすべて自己責任です。
***********************************************************
回路解析では、各種Casiotoneのサービスマニュアルをもとに行い、レジスタ解析では「Casiotone 602」の実機のレジスタ書き込みの状態の変化の情報を元に行いました。
・HD43517の特徴
解析により判明した特徴をまとめます。
・5つの正弦波をADSR+SV(スタートレベル)+AL(アタックレベル)+DR(ディレイ)の7種類のエンベロープパラメータで合成(SV、DR、ALは倍音ごとに設定可能)
・5つの正弦波の周波数比は4種類から選択可能(整数倍、非整数倍)
・同時発音数 : 4
・42ピンDIP
・ハードウェアエンベロープ
・最大4つのHD43517を外部チップセレクト回路なしにアドレス空間に配置可能(アドレスbit6~bit3がチップセレクトbitとして割り当て)
・複数のHD43517を1つのDAC回路でまとめることが可能(仕様が複雑そうなので解析を省略)
HD43517は汎用音源ICとしてよりは電子オルガン用として開発されたようです。
回路をできるだけ簡略化できるように工夫がみられます。
・ピン配置
Casiotone-1000P、Casiotone-701のサービスマニュアルを参考にピンを予想しました。
(Casiotone-1000Pサービスマニュアル内の回路図のHD43517のVssとVccは、逆になっているので注意)
ピン番号 | 名称 | I/O | 機能 |
---|---|---|---|
1 | DB0 | I | データピンです。 |
2 | DB1 | I | データピンです。 |
3 | DB2 | I | データピンです。 |
4 | DB3 | I | データピンです。 |
5 | DB4 | I | データピンです。 |
6 | DB5 | I | データピンです。 |
7 | DB6 | I | データピンです。 |
8 | DB7 | I | データピンです。 |
9 | DAD | I/O | HD43517を複数接続する時のシリアルデータ入出力端子です。 複数のHD43517のDAD端子同士を接続することで、1つのDAC回路で同時発音数を増やすことができるようです。 使い方、データフォーマットは不明。 未使用時には開放またはプルアップ抵抗を接続します。 MSO端子=H、I-4端子=Hのときのみ、この端子は入力となります。 |
10 | SYNC | I/O | HD43517を複数接続する時の同期入出力端子です。 複数のHD43517のSYNC端子同士を接続することで、1つのDAC回路で同時発音数を増やすことができるようです。 使い方、タイミングは不明。 未使用時には開放またはプルアップ抵抗を接続します。 MSO端子=H、I-4端子=Hのときのみ、この端子は出力となります。 |
11 | EVD | I/O | HD43517を複数接続する時のエンベロープデータ入出力端子です。 複数のHD43517のDAD端子同士を接続することで、1つのDAC回路で同時発音数を増やすことができるようです。 使い方、データフォーマットは不明。 未使用時には開放またはプルアップ抵抗を接続します。 MSO端子=H、I-4端子=Hのときのみ、この端子は入力となります。 |
12 | CS | I | チップセレクト端子です。 この端子がHの期間、「~WE」端子がLの時、 書き込みができます。 |
13 | ~WE | I | ライト端子です。 この端子がLでかつ、「CS」がHの期間、 DB0~DB7端子の状態が内部レジスタへラッチされます。 |
14 | ~A/D | I | アドレス / データセレクト端子です。 この端子がLの場合、DB0~DB7はアドレス入力端子となります。 Hの場合、DB0~DB7はデータ入力端子となります。 |
15 | INT1? | O | 割り込み要求端子です。 詳細不明 基本的に開放しておきます。 サンプリング周波数の1/4の周波数のDuty比50%の矩形パルスを出力します。 入力クロック周波数が4MHzのとき、出力周波数は6.25kHzとなり、S/H端子の出力の立ち下がりから10μs後にこの端子の出力が立ち上がるような位相となります。 |
16 | INT2? | O | 割り込み要求端子です。 詳細不明 基本的に開放しておきます。 サンプリング周波数の1/64(INT1の1/16)の周波数のDuty比15/16の矩形パルスを出力します。 この端子の出力の立ち上がりとINT1端子の立ち上がりのタイミングが同一となります。 |
17 | I-4 | I | 詳細不明の入力端子です。 マスター・スレーブ選択入力端子2の可能性が高いです。 Casiotone-602の場合で3つの音源ICのうち、 HD43517-40の I-4 がGNDへ接続、MSOがOPENとなっています。 残り二つのHD43517-33、HD43517-21のI-4 がOPEN、MSOは切り替えできるようになっています。 この端子がHかつ「MSO」端子がHの場合、マスターモードとなります。 この端子はプルアップされています。 |
18 | MSO | I | マスター・スレーブ選択入力端子1です。 この端子がHかつ「MSO」端子がHの場合、マスターモードとなります。 この端子はプルアップされています。 |
19 | ~RES | I | リセット端子です。 この端子がLの期間、内部レジスタを初期化します。 |
20 | CLOCK | I | クロック入力端子です。 標準で4.00MHzを入力します。 |
21 | Vcc | - | 電源端子です。 +5Vの電源を用意してください。 ※Casiotone-1000Pのサービスマニュアル内の回路図の当端子名は「Vss」となっていますが、5V入力されているようなのでVccとしています。 |
22 | DA0 | O | パラレルサウンドデータ出力端子です。 一応音声データは出力していますが、DACへ接続してない場合が多いです。 |
23 | DA1 | O | パラレルサウンドデータ出力端子です。 |
24 | DA2 | O | パラレルサウンドデータ出力端子です。 |
25 | DA3 | O | パラレルサウンドデータ出力端子です。 |
26 | DA4 | O | パラレルサウンドデータ出力端子です。 |
27 | DA5 | O | パラレルサウンドデータ出力端子です。 |
28 | DA6 | O | パラレルサウンドデータ出力端子です。 |
29 | DA7 | O | パラレルサウンドデータ出力端子です。 |
30 | DA8 | O | パラレルサウンドデータ出力端子です。 |
31 | DA9 | O | パラレルサウンドデータ出力端子です。 |
32 | DA10 | O | パラレルサウンドデータ出力端子です。 |
33 | DA11 | O | パラレルサウンドデータ出力端子です。 |
34 | DA12 | O | パラレルサウンドデータ出力端子です。 |
35 | DAS0 | O | D/Aシフト出力端子です。 |
36 | DAS1 | O | D/Aシフト出力端子です。 |
37 | DAS2 | O | D/Aシフト出力端子です。 |
38 | S/H | I/O | サンプル・ホールド出力端子です。 スレーブモードの場合はグランドへ接続しているようです。 入力クロックの周波数が4MHzの時、25kHzの矩形波をDuty比50%で出力します。 この端子がHのときDA0~DA12およびDAS0~DAS2の値をサンプルし、 この端子がLのときホールドするような外部回路を接続します。 この端子がHになる約6.6μs前にDA0~DA12およびDAS0~DAS2の値が変化します。(CLK=4MHz時) |
39 | O-14 | 詳細不明な出力端子です。 基本的に開放しておきます。 |
|
40 | Vss2 | - | グランド端子です。 ※Casiotone-1000Pのサービスマニュアル内の回路図の当端子名は「Vcc2」となっていますが、5V入力されているようなのでVss2としています。 |
41 | Vss1 | - | グランド端子です。 ※Casiotone-1000Pのサービスマニュアル内の回路図の当端子名は「Vcc1」となっていますが、5V入力されているようなのでVss1としています。 |
42 | O-15 | 詳細不明な出力端子です。 基本的に開放しておきます。 音を出力している時、パルス的にHを出力。(要検証) 出力チャンネル数によって波形が変化します。 周波数はサンプリング周波数と同一となります。 1周期を1/4に分け、該当チャンネルが出力されているときにパルスがHとなります。 すべてのチャンネルが出力されているときは常にHとなります。 |
・HD43517のレジスタ(書き込み専用)
HD43517は数十バイトのレジスタを持っていますが、その正確な数はわかりません。
というのも、このICは複数のHD43517を連結して使用することを想定して設計されており、マスター・スレーブ端子によってアドレス空間内のどこに配置するかを選べるようになっているためです。
最大で4つのHD43517をチップセレクト端子の制御なしにレジスタの書き込みができます。
74139などのデコーダとは違い、同時に複数のHD43517に対してチップセレクト(この場合チップイネーブルというのが正しいでしょうか?)が行えるため、複数のHD43517の発音タイミングを合わせたり、エンベロープなどの共通する値を書き込むときにいちいちICごとに書き込まなくて済むようになっているようです。
HD43517が扱えるアドレス空間$00~$7Fのうち、bit6~bit3の4bitはこのチップイネーブルビットとなります。
残るアドレス3bit分、つまりデータ量で8バイト分が1つのHD43517が持てるレジスタとなるはずです。
しかし、これではPSG音源以上のエンベロープADSR設定や音色設定などに必要なレジスタ容量が明らかにが足りません。
ですのでHD43517は、データ領域の一部をレジスタアドレスとして使用しています。
以下の表はアドレスbit0~bit2の3bit分を示します。
実際のレジスタ名やビット名はわからないので、こちらが勝手に命名しています。
詳しく解析していないため、未知のレジスタや機能、間違いが多数あると思います。
アドレス (下位3bit分) |
レジスタ名 | 機能 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
$0 | CWM_KEY_OFF | 倍音比モードとキーオフレジスタです。 このレジスタに書き込みを行うと対象の内部レジスタの値が更新されます。 データのbit7=Lのとき倍音比選択レジスタへの書き込み、 bit7=Hのときキーオフレジスタへの書き込みとなります。 ・データのbit7=Lのとき データのbit7=Lにした場合、倍音比モードレジスタに対して値を書き込みます。
MUTE: (bit2) ミュート設定ビットです。 このビットをHにするとミュートとなります。 CWM: (bit1, bit0) 倍音比モード設定ビットです。
HD43517は、整数倍の倍音のほかに2種類の非整数倍の倍音比の音や最大25種の整数倍合成音も出力できます。 これによりオルガン系の音色以外にもベル系の音色の再現をしやすくなっています。 ・データのbit7=Hのとき データのbit7=Hにした場合、キーオフレジスタに対して値を書き込みます。 このレジスタへ書き込みを行うと、指定チャンネルがキーオフします。
KOFF_CH: (bit1, bit0) キーオフ対象チャンネルビットです。 KOFF_CH = 0 ~ 3 (チャンネル1~4) 対象のチャンネルがキーオンされていた場合、キーオフ動作へ移行します。 後述するリリース有効フラグが有効の場合、エンベロープ波形はリリースとなります。 リリースが無効の場合は、音量が0となります。 リリースが有効の状態でキーオフを行いリリースへ移行した後に、さらにこのレジスタに書き込んでキーオフを行うと強制的に発音が停止します。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$1 | KEY_ON_CWSW | キーオンレジスタとチャンネルごとの各倍音ON/OFF設定レジスタです。 このレジスタに書き込みを行うと対象の内部レジスタの値が更新されます。 データのbit7=Lのときキーオンレジスタへの書き込み、 bit7=Hのときチャンネルごとの各倍音ON/OFF設定レジスタへの書き込みとなります。 ・データのbit7=Lのとき データのbit7=Lにした場合、キーオンレジスタに対して値を書き込みます。 このレジスタへ書き込みを行うと、指定したエンベロープ・リリース条件をもとに指定チャンネルがキーオンします。
不明_1: (bit4) このビットをHにするとキーオフに関係なく爆音が出ます。 常にLをセットしておきます。 R_EN: (bit3) エンベロープ・リリース有効無効フラグビットです。 このビットをHにするとキーオフ後のリリースが有効となります。 R_MD: (bit2) エンベロープ・リリースモード設定ビットです。 このビットをHにすると、 [「倍音2」のディレイ設定値が0以外]かつ [該当倍音のディレイ設定値が0以外]かつ [リース有効無効フラグビットがH] の条件に合う倍音のみリリースが有効となります。 まだ仕様がよくわかりません。 基本的にLにしておくのが無難です。 KON_CH: (bit1, bit0) キーオン対象チャンネルビットです。 KON_CH = 0 ~ 3 (チャンネル1~4) 対象のチャンネルがキーオフされていた場合、キーオン動作へ移行します。 ・データのbit7=Hのとき データのbit7=Hにした場合、各倍音ON/OFF設定レジスタに対して値を書き込みます。 このレジスタへ書き込みを行うと、指定チャンネルの各倍音ON/OFF設定値が反映されます。
OT5 ~ OT1: (bit6 ~ bit2) このビットをHにすると指定倍音の出力が有効になります。 OT5(「倍音5」) ~ OT1(「基音」) = 0 or 1 OSW_CH: (bit1, bit0) 各倍音ON/OFF設定対象チャンネルビットです。 OSW_CH = 0 ~ 3 (チャンネル1~4) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$2 | STADSR_AL | エンベロープ、倍音ごとの音量関連レジスタ群です。 このレジスタに書き込みを行うと対象の内部レジスタの値が更新されます。(キーオン中に変更すると、反映されないパラメータもあるので必ずすべてのチャンネルをキーオフしてからこのレジスタに関する値を変更してください。) データの上位4bit(bit7~bit4)で対象レジスタを決定します。
・データのbit7~bit4=0x0~0x4のとき SV_W[N] : (bit3 ~ bit0) [N] : (1~5 : 基音~倍音5) このレジスタによって倍音ごと発音スタートレベルを決定します。 SV_W[N] = 0 ~ 15 (0x0 ~ 0xF) 設定値を"F"にセットした時の出力レベルを1とした場合、各設定値によるスタート出力振幅は以下のようになります。
基本的にはこのレジスタのbit3 ~ bit1の値を増やすと、スタートレベルは2の累乗で増加します。また、bit0をHにするとさらに音量は1.5倍となります。 SV_W[N]_OUT_LEVEL = 2^(WL-1) * (1 + WDL*0.5) :WL = SV_W[N](bit3 ~ bit1) 【SV_W[N](bit3 ~ bit1) = 1~7の時】 :WDL = SV_W[N](bit0) SV_W[N]_OUT_LEVEL :スタート時電圧振幅値 スタートレベルは、キーオン時の発音レベルです。よくあるエンベロープパラメータADSRの場合、キーオン時は0となっていることが多いですが、HD43517の場合キーオン時の最初のアタック開始時の発音レベルを0以外にできます。 アタック期間では、0レベル~設定したスタートレベルまでのアタックレートが∞となり、設定したスタートレベルに達してからは設定したアタックレートで音量がアタックレベル増加します。 基本的にはSV(スタートレベル) < AL(アタックレベル) となるようにパラメータをセットします。 音色を保持したまま音量を変更したい場合は、SV_W[N]のbit3 ~ bit1の値を変更すると良さそうです。 ・データのbit7~bit4=0x5のとき AR : (bit3 ~ bit0) データのbit7~bit4を0x5にした場合、エンベロープ・アタックレートレジスタに対して値を書き込みます。 AR = 0 ~ 15 (0x0 ~ 0xF) 実測値を元に予想した設定値と大まかなアタック時間の関係を以下の表に示します。 条件 : SV_W[N]=0x0 (入力クロックCLK = 4.0MHz時)
基本的に1.9sまではこのレジスタのbit3 ~ bit1の値を増やすと、アタック時間は2の累乗で増加します。 レジスタ設定値とアタック時間は次の式で求められます。 A_time = (2 ^ AR) * 3 * (5 ^ 4) / CLK [s] 【AR = 1~12の場合】 A_time = 1.3 * (AR - 12) + (2 ^ 12) * 3 * (5 ^ 4) / CLK [s] 【AR = 13~15の場合】 A_time [s] : アタック時間 CLK [Hz] : 入力クロック(標準4MHz) ・データのbit7~bit4=0x6のとき DR : (bit3 ~ bit0) データのbit7~bit4を0x6にした場合、エンベロープ・ディケイレートレジスタに対して値を書き込みます。 DR = 0 ~ 15 (0x0 ~ 0xF) 実測値を元に予想した設定値と大まかなディケイ時間の関係を以下の表に示します。 条件 : SV_W[N]=0x0, AL_W[N]=0xF, SL=0x0 (入力クロックCLK = 4.0MHz時)
例外が多少ありますが、このレジスタのbit3 ~ bit1の値を増やすと、ディケイ時間は2の累乗で増加します。 レジスタ設定値とディケイ時間は次の式で求められます。 D_time = (2 ^ (DR+16)) * 3 * (5 ^ 2) / CLK [s] 【DR = 0~3の場合】 D_time = (2 ^ DR) * 3 * (5 ^ 2) / CLK [s] 【DR = 9~15の場合】 D_time[s]: ディケイ時間 CLK [Hz]: 入力クロック(標準4MHz) ・データのbit7~bit4=0x7のとき SL : (bit3 ~ bit0) データのbit7~bit4を0x7にした場合、エンベロープ・サスティンレベルレジスタに対して値を書き込みます。 SL = 0 ~ 15 (0x0 ~ 0xF) 設定値を"F"にセットした時の出力レベルを100%とした場合、各設定値によるサスティン出力振幅比は以下のようになります。 条件 : SV_W[N]=0x0, AL_W[N]=0xF
ディケイ期間が終了し、サスティン期間中の電圧振幅値は、各倍音のAL(アタックレベル)とこのサスティンレベルの積となります。 SV(スタートレベル) >= AL(アタックレベル) となるように設定し、AL(アタックレベル)の値を倍音ごとに別の値を設定すると、 最大振幅はSVレジスタで、サスティンレベルはALレジスタで操作できます。 ・データのbit7~bit4=0x8~0xCのとき AL_W[N] : (bit3 ~ bit0) [N] : (1~5 : 基音~倍音5) このレジスタによって倍音ごとアタックレベルを決定します。 AL_W[N] = 0 ~ 15 (0x0 ~ 0xF) 設定値を"F"にセットした時の出力レベルを1とした場合、各設定値によるアタック出力振幅は以下のようになります。
基本的にはこのレジスタのbit3 ~ bit1の値を増やすと、アタックレベルは2の累乗で増加します。また、bit0をHにするとさらに音量は1.5倍となります。 AL_W[N] _OUT_LEVEL = 2^(WL-1) * (1 + WDL*0.5) :WL = SV_W[N](bit3 ~ bit1) 【AL_W[N] (bit3 ~ bit1) = 1~7の時】 :WDL = SV_W[N](bit0) AL_W[N] _OUT_LEVEL :アタック期間終了時電圧振幅値 基本的にはSV(スタートレベル) < AL(アタックレベル) となるようにパラメータをセットします。 音色を保持したまま音量を変更したい場合は、SV_W[N]のbit3 ~ bit1の値を変更すると良さそうです。 ・データのbit7~bit4=0xDのとき RR : (bit3 ~ bit0) データのbit7~bit4を0xDにした場合、エンベロープ・リリースレートレジスタに対して値を書き込みます。 RR = 0 ~ 15 (0x0 ~ 0xF) 実測値を元に予想した設定値と大まかなリリース時間の関係を以下の表に示します。 条件 : AL_W[N]=0xF, SL=0xF (入力クロックCLK = 4.0MHz時)
例外が多少ありますが、このレジスタのbit3 ~ bit1の値を増やすと、リリース時間は2の累乗で増加します。 レジスタ設定値とリリースレートは次の式で求められます。 R_time = (2 ^ (RR+16)) * 3 * (5 ^ 2) / CLK [s] 【RR = 0~3の場合】 R_time = (2 ^ RR) * 3 * (5 ^ 2) / CLK [s] 【RR = 9~15の場合】 R_time[s]: リリース時間 CLK [Hz]: 入力クロック(標準4MHz) このレジスタで設定したディケイレートは、エンベロープ0とエンベロープ1に反映されます。 ・データのbit7~bit4=0xE,0xFのとき 不明なレジスタです。 通常使用しません。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$3 | DELAY | 倍音ごとの発音ディレイレジスタ群です。 このレジスタに書き込みを行うと対象の内部レジスタの値が更新されます。(キーオン中に変更すると、反映されないパラメータもあるので必ずすべてのチャンネルをキーオフしてからこのレジスタに関する値を変更してください。) データのbit6~bit4で対象レジスタを決定します。
・データのbit7~bit4=0x0~0x4または0x8~0xCのとき DLY_W[N] : (bit3 ~ bit0) [N] : (1~5 : 基音~倍音5) このレジスタによって倍音ごと発音ディレイ時間を決定します。 DLY_W[N] = 0 ~ 15 (0x0 ~ 0xF) 実測値を元に予想した設定値と大まかなディレイ時間の関係を以下の表に示します。 条件 : SV_W[N]=0xF (入力クロックCLK = 4.0MHz時)
基本的に1.9sまではこのレジスタのbit3 ~ bit1の値を増やすと、ディレイ時間は2の累乗で増加します。 レジスタ設定値とディレイ時間は次の式で求められます。 DLY_time = (2 ^ DLY_W[N]) * 3 * (5 ^ 4) / CLK [s] 【DLY_W[N] = 1~12の場合】 DLY_time = 1.3 * (DLY_W[N] - 12) + (2 ^ 12) * 3 * (5 ^ 4) / CLK [s] 【DLY_W[N] = 13~15の場合】 DLY_time [s] : ディレイ時間 CLK [Hz] : 入力クロック(標準4MHz) データのbit7の値は内部アドレスとして使用しません。 bit7がどちらの値でも書き込み対象アドレスは変化しません。 ・データのbit7~bit4=0x5~0x7または0xD~Fのとき 不明なレジスタです。 通常使用しません。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$4 | PITCH_C | ピッチ変更用のピッチ設定レジスタです。 このレジスタに書き込みを行うと、内部の一時保存レジスタの値が更新されます。 このレジスタの値を更新しただけでは反映されません。$6の「OCT_C_SET」レジスタに書き込むと、このレジスタの値が反映されます。
概要は$6の「OCT_C_SET」レジスタの項を見てください。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$5 | PITCH | ピッチ設定レジスタです。 このレジスタに書き込みを行うと、内部の一時保存レジスタの値が更新されます。 このレジスタの値を更新しただけでは反映されません。$7の「OCT_SET」レジスタに書き込むと、このレジスタの値が反映されます。
概要は$7の「OCT_SET」レジスタの項を見てください。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$6 | OCT_C_SET | ピッチ変更用のピッチセットレジスタです。 このレジスタへ書き込みを行うと、発音中の指定チャンネルのピッチが変更されます。 $4の「PITCH_C」レジスタとペアで使用します。必ず「PITCH_C」レジスタへの書き込み後にこのレジスタへ書き込み動作を行ってください。
不明_0: (bit7) 不明なビットです。 通常、Lをセットしておきます。 OCT: (bit6 ~ bit4) オクターブ設定レジスタです。 OCT = 0 ~ 7 TP: ($6「OCT_C_SET」のbit3, bit2 、$4「PITCH_C」のbit7 ~ bit0) ピッチ設定レジスタです。 $4の「PITCH_C」レジスタとセットで使用します。必ず「PITCH_C」レジスタへの書き込み後にこのレジスタへ書き込み動作を行ってください。 TP = 0 ~ 1023 (0x000 ~ 0x3FF) TP_CH: (bit1, bit0) ピッチ変更対象チャンネルビットです。 TP_CH = 0 ~ 3 (チャンネル1~4) 設定値による基音周波数は次の式で求められます。 f = CLK * (TP + 1) * (2 ^ OCT) *CWMK/ (5 * (2^25)) [Hz] f [Hz] : 発音周波数 CLK [Hz] : 入力クロック(標準4MHz) CWMK : 倍音比モード係数(CWM=0,3の時1、CWM=1の時5.998≃6、CWM=2の時4.998≃5) 発音したい基音周波数fによるTPは次の式(近似)で求められます。 TP = ( f * (5 * (2^25)) / (CLK * (2 ^ OCT) *CWMK) ) - 1 HD43517はピッチレジスとオクターブレジスタが分かれているため、音程テーブルを1オクターブ分作成しておけば容易に音程をセットできるようになっています。 (入力クロックCLK = 4.0MHz時)
このレジスタへ値を書き込むと"発音中"のチャンネルのみピッチが変更されます。 主にピッチベンドやビブラートでの使用を想定しているようです。 キーオン時のピッチセットは$7の「OCT_SET」を使用してください。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$7 | OCT_SET | ピッチセットレジスタです。 このレジスタへ書き込みを行うと、キーオン前の指定チャンネルのピッチが変更されます。 $5の「PITCH」レジスタとペアで使用します。必ず「PITCH」レジスタへの書き込み後にこのレジスタへ書き込み動作を行ってください。
音程の指定方法は$6の「OCT_C_SET」と同じです。 このレジスタへ値を書き込むと"キーオン前"のチャンネルのみピッチが変更されます。 発音中にこのレジスタの値を変更してもピッチは変化しません。 キーオン時のピッチセットとしての使用を想定しているようです。 |
・タイミング図
HD43517のデータシートが無いので、Casiotone602のタイミングを参考にしました。
アドレス・データの書き込みタイミングです。アドレスを書き込む場合は14番ピンの「~A/D」をLにします。データを書き込む場合は「~A/D」をHにします。
HD43517のレジスタへ値をセットする
HD43517は、アドレスバスとデータバスを共用しています。HD43517へアドレス値を書き込んでからデータ値を書き込むことで、任意の場所の内部レジスタへデータをセットできます。
HD43517のレジスタへデータを書き込むと、百数十μsの待機時間が必要です。
HD43517は、アドレスバスとデータバスを共用しています。
HD43517へアドレス値を書き込んでからデータ値を書き込むことで、任意の場所の内部レジスタへデータをセットできます。
-- HD43517のレジスタへのデータセット手順 --
①CSピンをH、~A/DピンをLにする
②500nsほど待機
③書き込み先アドレスをDB0~DB7へセットし、~WEピンをLにする
④500ns~600nsほど待機
⑤~WEピンをHにする
⑥20μsほど待機
⑦~A/DピンをHにする
⑧500nsほど待機
⑨書き込むデータをDB0~DB7へセットし、~WEピンをLにする
⑩500ns~600nsほど待機
⑪~WEピンをHにする
⑫300nsほど待機
⑬CSピンをLにする
・使い方(制御)
HD43517のレジスタはPSG系音源に比べると多いですが、FM音源ほど多くありません。
ですが、対象レジスタへデータを書き込む際、データの上位数ビットは書き込み先レジスタ選択用となっているため、多少ややこしくなっています。
-- レジスタの種類 --
大雑把に分けると、
・トーン出力・音程設定レジスタ
・エンベロープ系レジスタ
があります。
・トーン出力・音程設定レジスタ
・CWM_KEY_OFF($0)
MUTE($0、DATAbit7=L : bit2) ミュート設定ビット、Hでミュート
CWM_0 ~ CWM_1($0、DATAbit7=L : bit0~1) 倍音比モード設定ビット
KOFF_CH_0 ~ KOFF_CH_1($0、DATAbit7=H : bit0~1) チャンネル0~1キーオフ
・KEY_ON_CWSW($1)
R_EN($1、DATAbit7=L : bit3) エンベロープ・リリース有効無効フラグビット
R_MD($1、DATAbit7=L : bit2) エンベロープ・リリースモード設定ビット
KON_CH_0 ~ KOFF_CH_1($1、DATAbit7=L : bit0~1) チャンネル0~1キーオン
OT1 ~ OT5($1、DATAbit7=H : bit2~6) 倍音出力設定
OSW_CH_0 ~ OSW_CH_1($1、DATAbit7=H : bit0~1) チャンネル0~1各倍音ON/OFF設定
・PITCH_C($4)、OCT_C_SET($6)、PITCH($5)、OCT_SET($7)
TP_0 ~ TP_9($4,5 : bit0~7、$6,7 : bit2~3) ピッチ設定
OCT_0 ~ OCT_2($6,7 : bit4~6) オクターブ設定
TP_CH_0 ~ TP_CH_1($6,7 : bit0~1) チャンネル0~1ピッチセット・エンベロープ系レジスタ
・STADSR_AL($2)
SV_W[N]_0 ~ SV_W[N]_3($2、DATAbit7~4=0x0~0x4 : bit0~3) [N](1~5 : 基音~倍音5)スタートレベル
AR_0 ~ AR_3($2、DATAbit7~4=0x5 : bit0~3) アタックレート
DR_0 ~ DR_3($2、DATAbit7~4=0x6 : bit0~3) ディケイレート
SL_0 ~ SL_3($2、DATAbit7~4=0x7 : bit0~3) サスティンレベル
AL_W[N]_0 ~ AL_W[N]_3($2、DATAbit7~4=0x8~0xC : bit0~3) [N](1~5 : 基音~倍音5)アタックレベル
RR_0 ~ RR_3($2、DATAbit7~4=0xD : bit0~3) リリースレート
・DELAY($3)
DLY_W[N]_0 ~ DLY_W[N]_3($3、DATAbit7~4=0x0~0x4 : bit0~3) [N](1~5 : 基音~倍音5)ディレイ時間
・発音手順
--HD43517のリセット直後からの基本的な発音手順--
①音色を決定するパラメータ群をHD43517へセットする。
②音程設定レジスタにチャンネルを指定して音程をセットする。
③キーオンレジスタへキーオンしたいチャンネルを指定してセットする。
ここでは、3段階のステップに分けていますが、①の音色パラメータ群のセットでは数バイト分のパラメータがあります。音色を変更しない場合、HD43517の起動後に一度だけ書き込めばよいです。
①音色を決定するパラメータ群をHD43517へセットする。
波形合成音源は基本的に各倍音成分の合成比率を時間的にコントロールすることで、音色を作り出しています。
HD43517の場合、5つの倍音成分があるので、PSG系音源と比べるとかなり多様な音色を作り出すことができます。
中でもHD43517は、キーオン後の発音ディレイやスタートレベルなどの機能があり、YM2151などのFM音源では難しいエンベロープ波形を作り出すことができます。
発音ディレイ、スタートレベル、アタックレベルのみ倍音ごと個別に設定できますが、それ以外は共通となります。
残念ながら、これらのエンベロープパラメータをチャンネルごとに変えることはできません。(一応倍音成分のON/OFFはチャンネルごとに出来るので、場合によってはチャンネルごと音色の変更は可能)
解析した段階でエンベロープパラメータは19種類、倍音合成関係パラメータは2種類あり、これらをHD43517へ書き込むことで発音準備が整います。
・エンベロープパラメータ
--STADSR_AL($2)--
SV_W1 ~ SV_W5 スタートレベル
AR アタックレート
DR ディケイレート
SL サスティンレベル
AL_W1 ~ AL_W5 アタックレベル
RR エンベロープ・リリース
--DELAY($3)--
DLY_W1 ~ DLY_W5 ディレイ時間
・倍音合成関係パラメータ
--CWM_KEY_OFF($0)--
CWM 倍音比モード設定
OT1 ~ OT5、OSW_CH チャンネル0~1各倍音ON/OFF設定
②音程設定レジスタにチャンネルを指定して音程をセットする。
HD43517には音程設定レジスタが2種類あり、それぞれキーオン時の音程指定、発音中の音程変更として分けられています。
ピッチベンドやビブラートをしない場合、基本的に片方のレジスタのみピッチデータを書き込めばよいです。
・音程指定パラメータ(キーオン時)
--PITCH($5)、OCT_SET($7)--
TP ピッチ設定
OCT オクターブ設定
TP_CH ピッチ、オクターブセット先チャンネル0~1
③キーオンレジスタへキーオンしたいチャンネルを指定してセットする。
キーオンレジスタに指定チャンネルを書き込むと、キーオンします。
キーオフする場合は、キーオフレジスタへ指定チャンネルを書き込みます。
キーオン時にはリリース設定をビットがあるので、リリースを有効にする場合は注意が必要です。
・キーオン
--KEY_ON_CWSW($1)--
R_EN エンベロープ・リリース有効無効フラグビット
R_MD エンベロープ・リリースモード設定ビット
KON_CH チャンネル0~1キーオン
・使い方(回路)
HD43517は日立のCMOS LSI HD43000シリーズの一つだと思われます。
CMOS ICなので消費電力小さいため、回路次第ですがUSBからの給電も十分可能です。
HD43517のクロック源として基本的に4.00MHzのクリスタルオシレータを使用します。
・DAC周り
HD43517は単体での音声出力はできず、基本的には専用の外付けDAC回路が必要です。
Casiotone 602では、R2RラダーDACや12bit汎用パラレルDAC ICを使用しています。
HD43517の出力は、2'コンプリメント18bit値を「13bit + 0~5bitシフト」の形をパラレルで出力します。
そのため、汎用のDAC ICをそのまま使用する事はできません。
LSBの1bitは使わない場合、基本的には12bitDACと0~5bitアナログシフタを組み合わせた回路となります。
発音部分の基本の回路 DAC ICを使用(CasioTone602の発音部分、一部簡略化)
発音部分の基本の回路 R2RラダーDACの場合(CasioTone602の発音部分)
まずはCasiTone602のDAC周りを例に挙げます。
CasiTone602にはHD43517が3つ使われています。HD43517を複数個連結することでDAC回路をまとめることができるため、CasiTone602のDAC回路は2つしか入っていません。
さらにCasiTone602の2つのDAC回路はそれぞれDAC IC使用バージョンとR2Rラダー抵抗バージョンの2種類となっています。
回路図を見てもらえばわかりますが、どちらの回路も12bitDACと0~5bitアナログシフタ
およびサンプルホールド回路となっています。
12bitDAC回路部分ではAM6012DC相当品(HA17012GB)などのパラレルDAC ICやESK-S10L0025C-1などのR2Rラダー抵抗アレイを使っています。
どちらも入手困難ですので、抵抗単品を選別してR2RラダーDACを組むのが良さそうです。
0~5bitアナログシフタ回路は、アナログスイッチの4066Bと抵抗を使った回路となっており、1段目のアナログスイッチ2つで入力信号を1/1倍または1/8倍、2段目のアナログスイッチ3つで1/1、1/2、1/4倍にして出力します。
その後ローパスフィルタを通してスピーカへ出力されます。
・ローパスフィルタ
HD43517のサンプリングレートfs[Hz]は、
fs = CLK / 160 [Hz]
HD43517に入力するクロックCLKの周波数が4.0MHzの場合、サンプリング周波数は、
fs = CLK / 160
= 4.0M / 160
=25KHz
となります。
よって、クロックCLKの周波数が4.0MHzの時には、
約12KHz(25/2 KHz)以上の周波数成分をカットする必要があります。
理想LPFであれば12KHz以上でカットできますが、
基本的にアナログLPFのカット特性は理想LPFのカット特性からかけ離れているので、
余裕をもってカットオフ周波数(フィルタ通過後に源信号が-3dBになる周波数)を8~10KHz付近にもつアナログLPF用意してあげます。
サンプルホールド回路までのオペアンプのスルーレートは高めのものを選ぶと良さそうです。
※参考 NJM4558族の標準スルーレート
NJM4558 SR:1V/μs △
NJM4559 SR:2V/μs ○
NJM4556A SR:3V/μs ○
NJM4560 SR:4V/μs ○
CasioTone602の場合、NJM4558DDを使用しています。
・HD43517の複数個の相互接続について
HD43517は複数使用した場合にDACの数を省略できる機能があります。
通常、音源ICがN個の場合にはN個のDAC回路が必要になりますが、
HD43517の場合では最大4つ?(3つまでは検証済み)相互接続して1つのDAC回路で済ますことも可能です。
ただし、倍音合成比率は共通となったりする制約があります。
CasioTone602では3つのHD43517が使われており、内2つは常時相互接続して
残り1つは3個相互接続状態と切り離し状態をアナログスイッチで切り替えられるようにしてあります。
相互接続する場合は、9ピンの「DAD」、10ピンの「SYNC」、11ピンの「EVD」端子を
それぞれの同端子に接続します。
マスタとなったHD43517のみデータを受け取ってパラレルサンプルデータを出力します。
倍音合成比率はマスタとなるHD43517に書き込まれたパラメータが反映されます。
マスタ以外のHD43517もパラレルサンプルデータを出力し、
倍音合成比率はパラレルサンプルデータを出力しているHD43517に書き込まれたパラメータが反映されます。
また、38ピンの「S/H」端子はマスタの「S/H」と同期しています。未使用の場合はGNDへ接続するようです。
マスタ・スレーブ設定は17ピンの「I-4」、18ピンの「MSO」で行います。
「I-4」端子と「MSO」端子がHのときマスタモードとなり、「SYNC」端子から同期信号を出力し、
「DAD」端子と「EVD」端子からシリアルデータを受け取ります。
それ以外では「SYNC」端子から同期信号を受け取り、「DAD」端子と「EVD」端子からシリアルデータを出力します。
マスタ・スレーブ設定によってアドレス空間に配置されるHD43517も変わるので注意してください。
例えば、3つのHD43517 ①・②・③を接続したとしましょう。
①、②、③のうちマスタを①に設定します。
①から出力されるパラレルサンプルデータは、①+②+③のサンプルデータで倍音合成比率は①で設定したものです。
②から出力されるパラレルサンプルデータは、②のみのサンプルデータで倍音合成比率は②で設定したものです。
③から出力されるパラレルサンプルデータは、③のみのサンプルデータで倍音合成比率は③で設定したものです。
気づいた方もいると思いますが、HD43517にそれぞれDACを用意してかつHD43517を相互接続することで、1つのチャンネルあたりで音程の同じ2種類の音色の音を出すことができます。
例えば2つのHD43517 ①マスタ・②スレーブにそれぞれDACを用意して相互接続した場合、
総チャンネルは①(ch0~ch3)、②(ch4~ch7)、②'(ch4'~ch7')となり、より重厚なサウンドを作り出せます。
HD43517の相互接続はDAC回路を省くことができ、メリットが大きいように見えますが、注意点があります。
先ほどから説明している通り、倍音合成比率を合わせないといけないということです。
・複数個の相互接続をしない場合
複数個のHD43517を相互接続しない場合は、基本的に9ピンの「DAD」、10ピンの「SYNC」、11ピンの「EVD」端子を開放しておきます。
これらの端子は内部でプルアップされているので、プルアップ抵抗を接続してもかまいません。
9ピンの「DAD」と11ピンの「EVD」端子を開放しておき、10ピンの「SYNC」端子を相互接続した場合、パラレルデータ出力とサンプル・ホールド出力「S/H」が同期します。
サンプル・ホールド回路を共通化できるので、多少回路規模を小さくできます。
・使用例 - MMLで演奏 -
ページサイズが大きいので分割しました。下記リンクにプログラム例があります。
HD43517演奏テスト#宵加減テトラゴン#Casiotone602#HD43517 pic.twitter.com/ezebJ3nC7m
— oy (@0x6f_0x79) February 11, 2023
・使用例 - MIDIの受信 -
ページサイズが大きいので分割しました。下記リンクにプログラム例があります。
/*検索エンジン用単語リスト*/
HD 43517
使い方
sound generator
how to use
usage
disassembly
disassemble
0 件のコメント:
コメントを投稿