*注意*

近年、AIによるサイト内情報の要約や解説など便利な機能が増えています。 ですが、技術系のブログについてのAI要約はまだまだ不正確な記述をする場合が多いです。 AI要約や解説を鵜呑みにせず、元記事を参照して必ず自らの目で確かめて判断するようにしてください。 *Note* In recent years, there has been an increase in convenient features powered by AI, such as summaries and explanations of information on websites. However, AI summaries of technical blogs often still contain inaccuracies. Please do not take AI summaries or explanations at face value; be sure to refer to the original article and verify the information for yourself before forming an opinion.

AI利用者への案内

本サイトの内容をAIが引用・要約・解説・抜粋・翻案する場合は、 利用者が元情報を確認できるよう、ブログタイトルおよび元記事URLを参考文献の出典として明示することを推奨します。 Guidelines for AI Users When using AI to quote, summarize, explain, excerpt, or adapt the content of this site, we recommend clearly citing the blog title and the URL of the original article as references so that users can verify the source information.

2023年2月11日土曜日

HD43517 の使い方(本編)

 音源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にした場合、倍音比モードレジスタに対して値を書き込みます。

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
L不明_3不明_2不明_1不明_0MUTECWM_1CWM_0


MUTE:  (bit2)
ミュート設定ビットです。
このビットをHにするとミュートとなります。


CWM:  (bit1, bit0)
倍音比モード設定ビットです。

CWM_1 CWM_0 倍音モード
L L 整数倍モード①

基音、2倍、3倍、4倍、5倍

L H 非整数倍モード①

基音、1.666倍、2倍、2.666倍、3.333倍

H L 非整数倍モード②

基音、1.4倍、1.8倍、2.2倍、2.6倍

H H 整数倍モード②

1倍+8倍+18倍+28倍、
2倍+10倍+20倍+30倍、
3倍+12倍+22倍+32倍、
4倍+14倍+24倍+34倍、
5倍+15倍+25倍+35倍


HD43517は、整数倍の倍音のほかに2種類の非整数倍の倍音比の音や最大25種の整数倍合成音も出力できます。
これによりオルガン系の音色以外にもベル系の音色の再現をしやすくなっています。


・データのbit7=Hのとき
データのbit7=Hにした場合、キーオフレジスタに対して値を書き込みます。

このレジスタへ書き込みを行うと、指定チャンネルがキーオフします。
bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
H不明_4不明_3不明_2不明_1不明_0KOFF_CH_1KOFF_CH_0


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にした場合、キーオンレジスタに対して値を書き込みます。

このレジスタへ書き込みを行うと、指定したエンベロープ・リリース条件をもとに指定チャンネルがキーオンします。
bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
L不明_3不明_2不明_1R_ENR_MDKON_CH_1KON_CH_0

不明_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設定値が反映されます。
bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
HOT5OT4OT3OT2OT1OSW_CH_1OSW_CH_0

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
bit6
bit5
bit4
bit3
bit2
bit1
bit0
機能
L L L L SV_W1_3 SV_W1_2 SV_W1_1 SV_W1_0 基音_エンベロープ・スタートレベル
L L L H SV_W2_3 SV_W2_2 SV_W2_1 SV_W2_0 倍音2_エンベロープ・スタートレベル
L L H L SV_W3_3 SV_W3_2 SV_W3_1 SV_W3_0 倍音3_エンベロープ・スタートレベル
L L H H SV_W4_3 SV_W4_2 SV_W4_1 SV_W4_0 倍音4_エンベロープ・スタートレベル
L H L L SV_W5_3 SV_W5_2 SV_W5_1 SV_W5_0 倍音5_エンベロープ・スタートレベル
L H L H AR_3 AR_2 AR_1 AR_0 エンベロープ・アタックレート
L H H L DR_3 DR_2 DR_1 DR_0 エンベロープ・ディケイレート
L H H H SL_3 SL_2 SL_1 SL_0 エンベロープ・サスティンレベル
H L L L AL_W1_3 AL_W1_2 AL_W1_1 AL_W1_0 基音_エンベロープ・アタックレベル
H L L H AL_W2_3 AL_W2_2 AL_W2_1 AL_W2_0 倍音2_エンベロープ・アタックレベル
H L H L AL_W3_3 AL_W3_2 AL_W3_1 AL_W3_0 倍音3_エンベロープ・アタックレベル
H L H H AL_W4_3 AL_W4_2 AL_W4_1 AL_W4_0 倍音4_エンベロープ・アタックレベル
H H L L AL_W5_3 AL_W5_2 AL_W5_1 AL_W5_0 倍音5_エンベロープ・アタックレベル
H H L H RR_3 RR_2 RR_1 RR_0 エンベロープ・リリースレート
H H H L 不明_3 不明_2 不明_1 不明_0 不明
H H H H 不明_3 不明_2 不明_1 不明_0 不明


・データのbit7~bit4=0x0~0x4のとき
SV_W[N] :  (bit3 ~ bit0)
   [N] : (1~5 : 基音~倍音5)
このレジスタによって倍音ごと発音スタートレベルを決定します。

SV_W[N] = 0 ~ 15 (0x0 ~ 0xF)

設定値を"F"にセットした時の出力レベルを1とした場合、各設定値によるスタート出力振幅は以下のようになります。
設定値 出力電圧振幅比
0 0.000
1 0.008
2 0.010
3 0.016
4 0.021
5 0.031
6 0.042
7 0.063
8 0.083
9 0.125
A 0.167
B 0.250
C 0.333
D 0.500
E 0.667
F 1.000

基本的にはこのレジスタの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時)
設定値 アタック時間 [ms]
0 0.9※
1 0.9
2 1.9
3 3.8
4 7.5
5 15
6 30
7 60
8 120
9 240
A 480
B 960
C 1900
D 3200
E 4500
F 5800
※200~300μsほど遅延

基本的に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時)
設定値 ディケイ時間 [ms]
0 1200
1 2500
2 4900
3 9800
4 9800
5 9800
6 9800
7 9800
8 4.8
9 9.6
A 19
B 38
C 77
D 150
E 310
F 610

例外が多少ありますが、このレジスタの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
設定値 出力振幅比 [%]
0 0.0
1 0.8
2 1.0
3 1.6
4 2.1
5 3.1
6 4.2
7 6.3
8 8.3
9 12.5
A 16.7
B 25.0
C 33.3
D 50.0
E 66.6
F 100

ディケイ期間が終了し、サスティン期間中の電圧振幅値は、各倍音の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とした場合、各設定値によるアタック出力振幅は以下のようになります。
設定値出力電圧振幅比
00.000
10.008
20.010
30.016
40.021
50.031
60.042
70.063
80.083
90.125
A0.167
B0.250
C0.333
D0.500
E0.667
F1.000

基本的にはこのレジスタの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時)
設定値リリース時間 [ms]
01200
12500
24900
39800
49800
59800
69800
79800
84.8
99.6
A19
B38
C77
D150
E310
F610

例外が多少ありますが、このレジスタの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
bit6
bit5
bit4
bit3
bit2
bit1
bit0
機能
X L L L DLY_W1_3 DLY_W1_2 DLY_W1_1 DLY_W1_0 基音_ディレイタイム
X L L H DLY_W2_3 DLY_W2_2 DLY_W2_1 DLY_W2_0 倍音2_ディレイタイム
X L H L DLY_W3_3 DLY_W3_2 DLY_W3_1 DLY_W3_0 倍音3_ディレイタイム
X L H H DLY_W4_3 DLY_W4_2 DLY_W4_1 DLY_W4_0 倍音4_ディレイタイム
X H L L DLY_W5_3 DLY_W5_2 DLY_W5_1 DLY_W5_0 倍音5_ディレイタイム
X H L H 不明_3 不明_2 不明_1 不明_0 不明
X H H L 不明_3 不明_2 不明_1 不明_0 不明
X H H H 不明_3 不明_2 不明_1 不明_0 不明


・データの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時)
設定値ディレイ時間 [ms]
00.5
10.9
21.9
33.8
47.5
515
630
760
8120
9240
A480
B960
C1900
D3200
E4500
F5800

基本的に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」レジスタに書き込むと、このレジスタの値が反映されます。


bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
TP_7TP_6TP_5TP_4TP_3TP_2TP_1TP_0
※$6の「OCT_C_SET」レジスタのbit3とbit2にそれぞれ「TP_9」と「TP_8」があります。

概要は$6の「OCT_C_SET」レジスタの項を見てください。

$5 PITCH ピッチ設定レジスタです。
このレジスタに書き込みを行うと、内部の一時保存レジスタの値が更新されます。
このレジスタの値を更新しただけでは反映されません。$7の「OCT_SET」レジスタに書き込むと、このレジスタの値が反映されます。


bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
TP_7TP_6TP_5TP_4TP_3TP_2TP_1TP_0
※$7の「OCT_C_SET」レジスタのbit3とbit2にそれぞれ「TP_9」と「TP_8」があります。

概要は$7の「OCT_SET」レジスタの項を見てください。


$6 OCT_C_SET ピッチ変更用のピッチセットレジスタです。
このレジスタへ書き込みを行うと、発音中の指定チャンネルのピッチが変更されます。

$4の「PITCH_C」レジスタとペアで使用します。必ず「PITCH_C」レジスタへの書き込み後にこのレジスタへ書き込み動作を行ってください。


bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
不明_0OCT_2OCT_1OCT_0TP_9TP_8TP_CH_1TP_CH_0
※$4の「PITCH_C」レジスタのbit7~bit0に「TP_7」~「TP_0」があります。


不明_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時)
音程 CWM=0,3の時TP設定値 CWM=1の時TP設定値 CWM=2の時TP設定値
C 342 (0x156) 456 (0x1C8) 273 (0x111)
C# 362 (0x16A) 483 (0x1E4) 290 (0x122)
D 384 (0x180) 512 (0x200) 307 (0x133)
D# 407 (0x197) 543 (0x21F) 325 (0x145)
E 431 (0x1AF) 575 (0x23F) 345 (0x159)
F 457 (0x1C9) 609 (0x261) 365 (0x16D)
F# 484 (0x1E4) 646 (0x286) 387 (0x183)
G 513 (0x201) 684 (0x2AC) 410 (0x19A)
G# 543 (0x21F) 725 (0x2D5) 434 (0x1B2)
A 576 (0x240) 768 (0x300) 460 (0x1CC)
A# 610 (0x262) 814 (0x32E) 488 (0x1E8)
B 646 (0x286) 862 (0x35E) 517 (0x205)
※440HzをA4とした場合、CWM=0,3の時OCT = 出力したいオクターブ+1、CWM=1の時OCT =出力したいオクターブ-2、CWM=1の時OCT =出力したいオクターブ-1、をセット



このレジスタへ値を書き込むと"発音中"のチャンネルのみピッチが変更されます。
主にピッチベンドやビブラートでの使用を想定しているようです。
キーオン時のピッチセットは$7の「OCT_SET」を使用してください。

$7 OCT_SET ピッチセットレジスタです。
このレジスタへ書き込みを行うと、キーオン前の指定チャンネルのピッチが変更されます。

$5の「PITCH」レジスタとペアで使用します。必ず「PITCH」レジスタへの書き込み後にこのレジスタへ書き込み動作を行ってください。


bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
不明_0OCT_2OCT_1OCT_0TP_9TP_8TP_CH_1TP_CH_0
※$5の「PITCH」レジスタのbit7~bit0に「TP_7」~「TP_0」があります。

音程の指定方法は$6の「OCT_C_SET」と同じです。


このレジスタへ値を書き込むと"キーオン前"のチャンネルのみピッチが変更されます。
発音中にこのレジスタの値を変更してもピッチは変化しません。
キーオン時のピッチセットとしての使用を想定しているようです。





・タイミング図

HD43517のデータシートが無いので、Casiotone602のタイミングを参考にしました。



アドレス・データの書き込みタイミングです。
アドレスを書き込む場合は14番ピンの「~A/D」をLにします。
データを書き込む場合は「~A/D」をHにします。

HD43517のレジスタへ値をセットする



HD43517は、アドレスバスとデータバスを共用しています。
HD43517へアドレス値を書き込んでからデータ値を書き込むことで、任意の場所の内部レジスタへデータをセットできます。

HD43517のレジスタへデータを書き込むと、百数十μsの待機時間が必要です。

-- 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で演奏 -

ページサイズが大きいので分割しました。下記リンクにプログラム例があります。




・使用例  - MIDIの受信 -

ページサイズが大きいので分割しました。下記リンクにプログラム例があります。






/*検索エンジン用単語リスト*/
HD 43517
使い方
sound generator
how to use
usage
disassembly
disassemble





おわり