投稿日 : 2022/08/26 2:36:59
PC-G850用スプライトの中間色のチラつき低減版&PSG音源をセラロックとトランジスタで動かしてみた
前回の記事でポケコン用のソフトウェアスプライトエンジンを紹介しましたが、このスプライトエンジンでは中間色を白と黒の高速点滅により実現していました。しかし、初代PC-G850より後の液晶を搭載したポケコンでは、白と黒がはっきりと表示されるようになったため、点滅が顕著に見えてしまうという問題がありました。このため、光の当たり方によって点滅が見えにくい位置に動かしたりなどの対策をするしかありませんでした。

物理的に液晶を変えることは不可能だし、他に何か良い案が無いかと悩んでいたところ、突然ピコーン!っという感じで、ある方法をひらめきました。

今までは中間色を表現するため、1枚目は黒、2枚目は白と決め打ちで画像を生成していました。今回はこの画像生成の処理を変更し、中間色の場合は1枚目と2枚目を1ドットずつ交互に置く形、つまりディザにすることで、中間色が広範囲にある画像でも1ドットごとの点滅となるため、見にくさがかなり低減されました。


それと、今まで紹介したPSG音源ボード(74HC595版SPI版)ですが、実はこれらのPSG音源ボードで使用していた多出力クリスタルオシレータ「EXO3 12MHz」とアンプIC「HT82V739」が既にディスコンとなっており、秋月も含め他のショップでも軒並み販売が終了していることが分かりました。このため、今からこれらの記事を参考に音源ボードを作るのは難しいだろうと思ったので、今回は別なパーツを使って実装する方法を考えてみました。

ちなみに多出力クリスタルオシレータを使用していた理由ですが、最初は秋月で売っていた音源チップ「YMZ294」には4MHzのオシレータが付いていましたが、いつの頃からか音源のみの単体販売となっており、自分でオシレータを用意しようとしても秋月にはそもそも取り扱いが無く、入手性がとても悪かったためです。しかし、音源の仕様を読むと4MHzの他に6MHzに対応していることが分かり、調べたところ多出力クリスタルオシレータには分周機能が付いており、ちょうど秋月で売っていた12MHzのオシレータを分周することで、6MHzのクロックとして使用することが出来ました。

さて、秋月では一般的な2端子の4MHzの水晶発振子は売っていますが、調べたところ通常の水晶を使う場合はアンバッファタイプのインバータIC(74HCU04)と組み合わせる必要があり、これを既存のユニバーサル基板に乗せるとなると、どう考えても現状のサイズには収まりません。

クリスタル(水晶発振子) 4MHz


6回路インバータ(アンバッファ) TC74HCU04AP

※型番にUが付いているのがアンバッファ版で、Uが付かないものは発振回路には使えないので注意

秋月以外なら4MHz6MHzのオシレータを買うことは出来ないわけではありませんが、複数の店舗で購入となると手間や送料などのコストがかかってしまうため簡単にはいきません。
※最近秋月に「TO-92型 水晶発振器4MHz(大真空DLO555MB)」というトランジスタ風のOSCが登録されていますが、これもいつ販売終了になるか分からないため、今回は使用を見送りました

やはり普通に水晶とICの組み合わせかなと考えつつ、発振回路について調べていたところ、ふとトランジスタを使って発振回路を作っているサイトを発見しました。内容は実験的なもので波形もあまり良くないと書かれていましたが、今回は音源の基準クロックとして使えれば良く、少しくらいいびつな形だとしても結果的に0Vと5Vが一定周期で発生するなら特に問題は無いだろうと考え、とりあえず実験のため秋月で水晶やICなどいろいろパーツを買って試してみました。

当然のごとく水晶とICを使ったものは何も問題ありませんでしたが、サイトの通りICの代わりにトランジスタでもなんとか発振させることが出来ました。

さらに試しに買ったコンデンサ内蔵型のセラロックというパーツで試したところ、ICとの組み合わせであれば簡単に発振させることが出来ましたが、こちらもトランジスタを使ってなんとか発振させることに成功しました。


これを使うことで省スペースで発振回路を作れるので、今回はこの組み合わせを音源のクロックとして使用するよう、PSG音源ボードを設計してみました。

ちなみにこのセラロックは2002年に登場したパーツであり、日本の某有名メーカーが作っているため今後も安定供給されると思うので、しばらくはディスコンの心配は無いと思います。

なお、今回はユニバーサル基板上での回路の仕様により、4MHzではなく6MHzのセラロックを使用します。特に6MHzは以前作成した多出力クリスタルオシレータ版と同じクロックであり、問題無く再生出来ていることを確認済みです。


アンプICの代替ですが、秋月にBTL対応の高出力のものがありましたが結局これもいつ無くなるか分からないため、今回は約半世紀前から存在する(笑)、超ド定番の386アンプを使うことにしました。以前使用したアンプと違ってパワーも出ないしノイズも多いですが、長いものには巻かれろということで今回はこれで行くことにしました。

オーディオアンプIC NJM386BD


このアンプICは4~18Vの電圧を必要としますが、ポケコンはそもそも5Vしかないので音量をある程度上げるとすぐに音が歪んでしまいます。かといってゲインを最大にすると音量は高くなりますが、サーっというホワイトノイズが常にスピーカーから出るようになるため、おもちゃレベルの音を出すのには良いのかもしれませんが、音源の音をじっくり聞きたいという用途にはあまり向いていません。

このアンプICは外部部品をなるべく少なく出来るように設計されているようですが、実際にまじめに鳴らそうとすると入力や出力のコンデンサが必要だったり、発振防止用に直列に抵抗とコンデンサをなるべく入れるようにと書かれていたりして、意外と部品数が多くなってしまうことが分かりました。これなら以前使用したアンプIC(HT82V739)の方が、音量も大きく実質コンデンサ2つだけで鳴らせたので、やっぱり新しいものの方が進化してると感じました。

ただ、いずれ音源IC自体も入手できなくなることを考えると、それまではとりあえずこのアンプICとの組み合わせであれば、まだしばらくは持つのではと思われます。


なお、今回の音源ボードはシフトレジスタ版のみの対応となり、SPI版への対応はまだ行っていません。こちらも時間があれば対応をしたいと思っていますが、基板のサイズ的に16bit版ではなく8bit版のみの対応にするかもしれません。

ディザ

ディザとは何かというと、例えば白と黒を交互に置いて離れて見ればそれらが合成されて灰色に見えるというもので、例えば以下のような感じで白と黒を交互に配置することで灰色を表現しています。
 

このディザ処理をポケコンの中間色に使用することで、チラつきの少ない画面表示に成功しました。

今回のディザを使った「りりぃ★とらいある(改)」のゲーム動画はこちらです。

※このゲームは本家サイト→ソフトウェア→ポケコンの部屋からDL出来ます

参考としてこちらは以前の点滅が見えるバージョンとなります。

※カメラと同期が合っていないため、ある周期で点滅がかなりはっきり見える時があります

動画上での点滅具合を比べてみても、今回のディザ版の方が点滅の量が激減していると思われます。

チラつき低減原理

今回のディザ処理を説明する前に、現状のスプライトライブラリの概要をもう一度説明します。

スプライトライブラリでは2枚の画像を高速に切り替えていますが、この時ある特定の位置にあるドットを見た場合、「黒+黒」の時は「黒」、「白+白」の時は「白」と液晶の色がそのまま表示されます。しかし、この時「黒+白」だった場合を見てみると、液晶の物理的特性として即座にはその色にならないため、これを利用して画像を高速に連続で切り替えることで、結果的に中間色の「灰」のドットを表現しています。

これは以前の記事で説明したものですが、問題はPC-G850V以降では液晶の輝度が上がったことにより、黒⇔白の応答速度も上がってしまったため、点滅がかなりはっきりと視認できるようになってしまいました。通常の文字を表示する分には、応答性が上がり文字もはっきり見えるのでこれはこれで良いのですが、逆に点滅で中間色を表現するという技術が難しくなってしまいました。

なお、この点滅が1pxなど狭い範囲ならさほど気にはなりませんが、広範囲で中間色を使った画像を表示すると、それらが全て点滅してしまっているように見えてしまうため、目にも悪いしそもそもプレイより点滅の方が気になって仕方がありません。


そこで、今回はこの広範囲の中間色に対する対策として、1枚目は黒だけ、2枚目は白だけの画像にはせず、1枚目と2枚目のとあるドットの位置に対して、1枚目が黒なら2枚目は白、1枚目が白なら2枚目が黒、つまり「黒+白」と「白+黒」で結果的にどちらも「灰色」という状態を作りました。

そして、とあるドットの位置というのは単純にXY座標が奇数か偶数かで判定して、それぞれの画像のドットを交互に反転することで、最終的にディザのような画像を生成するようにしました。

ちなみに、この画像生成自体はスプライトエンジンが行っているのではなく、画像の変換ツールの方の変更となります。このため、今回は特にスプライトエンジン自体の修正は何も行っていないため、既にスプライトライブラリを使ったゲームを作っていた場合は、この変換ツールのみを置き換えるだけで済みます。

実際の画像は以下のように変換されます。
元画像 変換後(画像1) 変換後(画像2)

ちなみに旧仕様では、以下のように黒と白のベタ出力となります。
元画像 変換後(画像1) 変換後(画像2)

欠点として以下のように元画像がディザ位置と一致してしまう場合、画像1と画像2は結果的に旧仕様(ベタ出力)と同じ出力になります。
元画像 変換後(画像1) 変換後(画像2)


この方法により広範囲の中間色でもチラつきが抑えられ、キレイに画像を表示することが出来るようになりましたが、実はこの変換方法には1つ欠点があります。

画像が動かない状態であれば、常に液晶の同じ位置に対して点滅していることになるため、結果的には均一な灰色として見ることが出来ますが、例えば以下のように縦2ドットで構成されたスライムの目の周りに中間色がある場合、これを画面上で動かしてしまうと目とその周りの中間色のドットが混ざったりするため、目の形をうまく表現出来なくなることがあります。(ランダムノイズに見える)
元画像 変換後(画像1) 変換後(画像2)

この場合は、旧仕様の黒と白のベタ出力を行うことで改善出来る場合があるので、今回のツールではスプライト番号ごとに旧仕様で書き出すかを指定出来るようにしました。
元画像 変換後(画像1) 変換後(画像2)

欠点としてはこのスライムだけ点滅が激しくなりますが、実際にポケコン上で表示してみた感じではあまり気にならない程度だったため、最終的には実機で実行してみてどちらがキレイに見えるかで決めると良いと思います。
※上記のディザ版の動画ではスライムはベタで出力されていますが、動いていてもなんとなく目の形は認識出来ると思います

ちなみに今回のスプライト変換ツールでは、デフォルトではディザで出力するようになっており、逆にオプションとして「/nd」を設定することで、指定したスプライトIDに対してディザを行わないようにすることが出来ます。

書式は「/nd:<スプライトIDリスト>」で、スプライトIDをカンマ区切りで複数指定することが出来たり、ハイフンで範囲を指定することが出来るようになっています。なお、背景用のスプライトを出力するための「/bg」オプションと併用することも可能です。
※スプライトIDは0~127が指定可能です

例)
 
 > SpriteConv spr_chr.tga /nd:17,18,40-41


最後に余談ですが、例えば3枚の画像を高速に切り替えるようなプログラムを組めば、「黒黒黒」「黒黒白」「黒白白」「白白白」の4段階の階調を表現することが出来ます。なお、「黒黒白」は「黒白黒」や「白黒黒」も含むので1個分の色になり、同様に「黒白白」も「白黒白」や「白白黒」も含むため1個分の色になりますが、今回のディザのように中間色の組み合わせを変えることで、チラつきの少ない4階調の画像を生成することも可能かと思われます。

ポケコンビルドツール v3.01

ここでは上記のディザ対応のソフトウェアスプライトツールが含まれたビルドツールをダウンロードできます。これにはデバッガー対応の改変済みエミュレータの他に、BGM&SE対応の新型MMLライブラリや、SPI音源やシフトレジスタ版音源に対応したテンプレートが含まれているので、SDCCがあればすぐに開発を開始することが出来ます。

ポケコンビルドツール v3.01 ダウンロード
※同梱のreadme.txtにも簡単な説明があります

更新の無いツールなどの使い方は以下を参照してください。
・デバッガーの使い方についてはこちらこちらを参考にしてください
・同梱のテンプレートの使い方や、改変済みエミュレータのソースはこちらを参考にしてください

新PSG音源ボードについて

ここではセラロック版&386アンプを使用した音源ボードの作り方を紹介します。なお、今回はSPI版ではなくシフトレジスタ(74HC595)を使用した音源となるため、本家サイトで公開しているシフトレジスタ版のPSG音源対応のゲームがそのまま使用可能です。

※クリックで拡大
※LEDがまぶしかったのでキャップを付けています

基本的な構成は以前の多出力クリスタルオシレータ版の音源ボードと一緒ですが、クロック部分をセラロック&トランジスタに、またアンプICをNJM386(LM386でもOK)に変更したものです。
※旧音源の作り方についてはこちらを参考にしてください


以下が今回制作したPSG音源ボードの回路図です。

※クリックで拡大

発振回路について

上記の回路図には既にセラロックとトランジスタを使った発振回路が含まれていますが、実はセラロックとトランジスタを組み合わせた発振回路は、ネットで探しても見つけることは出来ませんでした。

簡単に見つかるのは普通の水晶発振子とコンデンサにアンバッファーのNOT回路を使ったもので、クロック数に合うコンデンサの値など、ある程度実験した結果の容量が既に掲示されていたため、試してみると当然のごとく特に問題も無く発振してくれました。

参考:https://userweb.alles.or.jp/chunichidenko/mycpu80tr7.html

ちなみに以下が74HCU04の端子図ですが、上記回路ではこの中の2つ分の素子しか使わないため、残り4個は無駄になってしまいます。


しかもこれをユニバーサル基板上に実装するとなると、そもそもICが1個分増えることになるため明らかに収まりません。代替案としては基板を大きいものにするか、アンプを実装しないといった方法を考えましたが、1つの基板上で全てを実装するというコンセプトから外れてしまうため、それは最後の手段ということにしました。


さらにいろいろ調べていると、水晶とコンデンサは使いますが、トランジスタで簡易型の発振回路を実験しているサイトを見つけたので、ひとまずこれと同じようにブレッドボード上で回路を組み、その出力を音源のクロックとして入れてみたところ、問題無く曲を鳴らすことが出来ました。

この方法を使えばクロック問題は解決出来ることは分かりましたが、ふと秋月で水晶を探している時に、セラミックで作られた発振子とコンデンサを1つのパッケージに収めたセラロックという部品を発見しました。そして、これを使うと水晶発振子とコンデンサを別々に使うより実装コストを下げられると書かれていました。

セラミック発振子(セラロック)コンデンサー内蔵タイプ 6MHz


このセラロックのデータシートを見てみると、内部では水晶発振子とコンデンサが以下のように接続されていることが分かります。


そして、これは上記の水晶とコンデンサを組み合わせた回路と、まったく同じであることに気づくのに時間はかかりませんでした。



ということは、トランジスタを使った回路もこのセラロック1個に置き換えることが可能なのではと思い、発振に必要な抵抗値を変えたりして実験したところ、結果的に1MΩと4.7KΩなら問題無く発振出来ることが分かりました。オシロスコープがあればもう少し状況が把握できると思いますが、現状は持っていないので動作した時の低い値と高い値の間など、ギリギリではない値を決めて今回のクロックとして使用することにしました。
※例えば1MΩを100KΩ未満にしたり、4.7KΩを1KΩ未満や100KΩ以上にすると動作しなくなります

最終的に完成した発振回路は以下のような感じで、セラロックとトランジスタと抵抗x2個で、超コンパクトな発振回路を作ることが出来ました。

※この回路は4MHzのセラロックに差し替えても動作しました

PSG音源のパーツ一覧

スピーカー以外は全て秋月で入手可能です。
番号 部品名 型番 使用数 価格 補足
1 片面ガラス・ユニバーサル基板 Cタイプ(72x47.5mm) めっき仕上げ 1 60 ピン数違いのこちらも使えるように設計しています
※手持ちがある場合など
2 ヤマハ音源IC YMZ294 1 300
3 8ビットシフトレジスタ U74HC595AG-D16-T 1 35 取り扱いが無くなったSN74HC595Nの代替品
4 オーディオアンプIC NJM386BD 1 50 別メーカーのLM386G-D08-Tでも可
5 ICソケット ( 8P) (10個入) 1 100 10個入りだが1個だけ使用/アンプ用/丸ピンICソケットでも可
6 ICソケット (16P) (10個入) 1 100 10個入りだが1個だけ使用/シフトレジスタ用/丸ピンICソケットでも可
7 ICソケット (18P) (10個入) 1 100 10個入りだが1個だけ使用/音源用/丸ピンICソケットでも可
8 ステレオミニジャック 3.5mmステレオミニジャックDIP化キット 1 150 売り切れの際は単品販売のものを組み合わせると良い
 ・基板取付用3.5mmステレオミニジャック
 ・3.5mmステレオミニジャックDIP化基板
 ・細ピンヘッダ 1×7
  (値段が一緒なら細ピンヘッダ 1×14の方が良い)
9 半固定ボリューム 10kΩ [103] 1 50 こちらは同じ10KΩだが、ピンの配置が異なるためNG
10 セラミック発振子(セラロック) 6MHz 1 20 ※向きはどちらでもOK
11 トランジスタ 2SC1815L-GR-T92-K
60V150mA (20個入)
1 100 1個だけ使用/これとかこれとかでも問題無いはず
12 フィルムコンデンサ 0.047μF50V ルビコンF2D 1 10 表記「473」
13 セラミックコンデンサ 0.1μF50V2.54mm (10個入) 1 100 表記「104」/1個だけ使用
※5ミリピッチのこちらは線を伸ばしで2.54ミリとして使用も可
※基板に実装出来るなら何でもよい(これこれとか)
14 電解コンデンサ 1μF50V85℃ (ルビコンPK) 1 10 オーディオ用無極性コンデンサでもOK
15 電解コンデンサ(OS-CON) 100μF16V105℃ 1 40 電源用なのでOS-CONにしたが、
特に通常のコンデンサでも良い(これとかこれとか)
※容量が大きすぎると接続時の突入電流により、
 ポケコンの電圧が一瞬落ちてリセット画面が出ることがある
16 電解コンデンサ 470μF16V105℃(ルビコンWXA) 1 10 オーディオ用のこちらはサイズが大きすぎるのでNG
17 カーボン抵抗(炭素皮膜抵抗) 1/6W 10Ω (100本入)
カラーコード:黒黒
1 100 1本だけ使用/1/4W抵抗でも良い
18 カーボン抵抗(炭素皮膜抵抗) 1/6W 330Ω (100本入)
カラーコード:橙橙
1 100 1本だけ使用/1/4W抵抗でも良い
※LED用のため100~10KΩの範囲で使用するLEDに合わせる
※まぶしければあとでキャップを付けてもよい
19 カーボン抵抗(炭素皮膜抵抗) 1/6W 4.7kΩ (100本入)
カラーコード:
1 100 1本だけ使用/1/4W抵抗でも良い
20 カーボン抵抗(炭素皮膜抵抗) 1/6W 1MΩ (100本入)
カラーコード:
1 100 1本だけ使用/1/4W抵抗でも良い
21 超高輝度5mm白色LED OSPW5111A-Z3(5個入) 1 120 1個だけ使用/自分の好きなLEDでOK
22 ピンヘッダ (オスL型) 1×40 (40P) 1 50 11ピンだけ折って使用
※I型のこちらはNG
23 スピーカー ダイソー 耳もとキューブスピーカー(参考) 1 110 アンプ無しの安物でOK
※これ以外に裏面配線用のスズメッキ線やジャンパ線(短い箇所は部品の足でも可)、はんだ等が必要です

PSG音源の制作

以下の部品図を見ながら組み立ててください。
部品図をクリックすると別ウィンドウで大きな画像が表示されます。

部品面(表)


配線面(裏)


最初に背の低いパーツからはんだ付けするのがコツですが、コンデンサの足などをそのまま配線に使用する場合は、あとでまとめてした方が良い時もあります。また、例えばICソケットなどの大きなものは対角線上のピンだけ仮付けしておき、残りのピンと配線を同時にはんだ付けすることで、スズメッキ線が浮いた状態で固定されてしまうことを防ぐことが出来ます。

既にはんだを盛ってしまっている状態でスズメッキ線を配線する場合は、小型のマイナスドライバーなどでスズメッキ線を押し付けながらそのはんだを溶かせば、ピッタリくっつけることが出来るので、いろいろやってみて効率よくやれる方法を自分で見つけましょう。

完成したらまずはテスターでVCCとGNDがショートしていないか確かめておきます。また、IC等はまだ取り付けず、ポケコンに接続してLEDが光ることを確認してください。

LEDが光ったならICを取り付け、上記のポケコンビルドツールに同梱されているPSGのサンプル(595版)を実行させてみて、実際に曲が流れるか試してみましょう。

問題無く再生が出来たら完成です。

なお、ポケコンの端子からは常に電圧が出ているため、ポケコンの電源を切ってもLEDは光ったままとなります。
この状態はIC等にも電力が供給されていることになるため、使用しないときは必ずこのボードを外すようにしてください。
1.cocot 投稿日:2024/06/30 18:02:07
ポケコンで音楽鳴らしながらゲーム動いててびっくりした
2.管理者 投稿日:2024/06/30 22:53:57
ありがとうございます。これもいろいろと捗った結果でございます(笑)
コメントする
名前
コメント
※タグは使用出来ません
この記事に関連するタグ
ポケコン(PC-G850)