2018年12月28日金曜日

パソピア7のDCSGでWave再生(続き)

前回の続き

まず、DCSG再生用のデータ作成。
Pasopia7で読み込むデータファイルは、8bit 256階調のデータを順番に並べているだけです。
11025Hz(約0.09ms間隔)で再生するので1バイト=0.09msになり、64KBでは約6秒の再生時間になります

11025Hz/16bit/1channelのWaveファイルを用意します。

WaveファイルからDCSGデータにコンバートするプログラムを用意しました。ここからダウンロード
以下コマンドを実行すると、64KBに分割されたDCSGデータファイルが作成されるので、SDカードに保存します。
WavToDCSG.exe Waveファイル名


次にPasopia7の再生ロジックですが、タイマー割り込みを使わずにクロックで時間調整しています。(割り込みだと11025Hzは厳しそう)
DCSGデータ1バイトをXPAC2から読み込み、3和音のトーンテーブルから波形データに変換してSN76489にセットします。これを0.09ms間隔で行います
;初期設定: SN76489の周波数を1に設定
; SG_PORT EQU 3Bh  ;SN76489 Access Port(3Ah/3Bh)
XOR A
LD  C, SG_PORT
LD  B, 081h  ;Tone0 Frequency
OUT (C), B
OUT (C), A
LD  B, 0A1h  ;Tone1 Frequency
OUT (C), B
OUT (C), A
LD  B, 0C1h  ;Tone2 Frequency
OUT (C), B
OUT (C), A

LOOP:
; ここでLレジスタにDCSGデータロード
; * TONE_0テーブルの先頭は、Lowアドレスが00hになるように調整
; * テーブルデータの上位4bitは、TONE_0:Dxh, TONE_1:Bxh, TONE_2:9xhにセット
LD  H, TONE_0テーブルのHighアドレス
LD  A, (HL)  ;Tone0波形データ読み込み
INC H
LD  B, (HL)  ;Tone1波形データ読み込み
INC H
LD  H, (HL)  ;Tone2波形データ読み込み
; SN76489ポートの設定
OUT (C), H
OUT (C), B
OUT (SG_PORT), A
Lレジスタに読み込むデータは、64KBの前半・後半で読み込み方法が異なります
・前半32KB: XPAC2のMRAMから読み込んだデータをLレジスタに保存。同時に後半3秒のデータをPasopia7のRAMに保存
・後半32KB: RAMに保存されたデータをLレジスタに保存。同時にXPAC2のSDカードからMRAMにデータコピー

Pasopia7の再生プログラムはここからダウンロードできます。
RUNするとDSCGデータを読込むMRAMスロットが聞かれるので、「3」か「4」で指定します。
[3] 64KB MRAM (DEVICE 6)
[4] 64KB MRAM (DEVICE 5)

※指定したMRAMスロットのデータは消えるので注意してください。

SDカードに保存したDCSGデータが保存されているフォルダ名を指定します。
以前紹介したvramイメージをrgbというファイル名で同じフォルダに保存しておくと、その画像を表示した後にDCSG再生が始まります。

実機での演奏をどうぞ




実機で試せる方はぜひ

2018年12月27日木曜日

パソピア7のDCSGでWave再生

パソピア7にはSN76489A DCSGがあるので、これを使ってWaveファイルを再生することを考えます
MSXやP6のPSGで試した方がいるようですが、パソピア7はまだいないと思うので・・・

SN76489のVolumeと出力値の関係は以下
Volume設定値出力値割合
0327671.000000
1260280.794328
2206750.630957
3164220.501187
4130450.398107
5103620.316228
682310.251189
765680.199526
851930.158489
941250.125893
1032770.100000
1126030.079433
1220670.063096
1316420.050119
1413040.039811
1500.000000


Volumeの値が上がるほど出力値が小さくなり、Volume=15で無音。
SN76489は1チップ3和音なので、上記Volumeを3つMixしてPCMの256階調(0-255)を作ってみます
TONE_0:
DB 0Fh, 0Eh, 0Dh, 0Ch, 0Bh, 0Eh, 0Dh, 0Ah, 0Ch, 0Ch, 09h, 0Dh, 0Bh, 0Dh, 0Bh, 0Eh
DB 0Ch, 09h, 0Bh, 09h, 0Ah, 0Bh, 0Ah, 0Eh, 08h, 08h, 09h, 0Dh, 08h, 09h, 09h, 08h
DB 07h, 07h, 0Bh, 08h, 06h, 08h, 06h, 06h, 0Eh, 07h, 0Dh, 08h, 07h, 05h, 08h, 07h
DB 04h, 06h, 05h, 0Dh, 05h, 09h, 05h, 04h, 06h, 03h, 07h, 08h, 05h, 06h, 04h, 07h
DB 0Bh, 03h, 0Bh, 05h, 0Eh, 0Bh, 0Ah, 03h, 05h, 05h, 03h, 03h, 03h, 02h, 03h, 02h
DB 02h, 06h, 03h, 02h, 03h, 02h, 04h, 02h, 03h, 03h, 01h, 09h, 03h, 04h, 02h, 03h
DB 0Dh, 01h, 01h, 01h, 02h, 02h, 04h, 05h, 01h, 04h, 08h, 01h, 01h, 03h, 02h, 09h
DB 02h, 00h, 01h, 01h, 00h, 02h, 02h, 00h, 03h, 02h, 00h, 00h, 03h, 0Bh, 01h, 03h
DB 01h, 00h, 08h, 0Ch, 00h, 03h, 00h, 02h, 00h, 00h, 00h, 01h, 00h, 00h, 0Ah, 02h
DB 0Dh, 05h, 00h, 01h, 01h, 00h, 00h, 01h, 02h, 01h, 03h, 06h, 00h, 01h, 00h, 01h
DB 01h, 02h, 00h, 04h, 01h, 00h, 01h, 00h, 04h, 04h, 00h, 01h, 08h, 00h, 02h, 01h
DB 00h, 03h, 03h, 01h, 00h, 01h, 00h, 00h, 01h, 01h, 00h, 01h, 00h, 00h, 01h, 00h
DB 01h, 01h, 00h, 02h, 02h, 01h, 00h, 01h, 00h, 00h, 01h, 00h, 01h, 00h, 00h, 00h
DB 00h, 02h, 00h, 01h, 00h, 00h, 01h, 00h, 00h, 00h, 00h, 01h, 01h, 00h, 00h, 00h
DB 00h, 00h, 00h, 00h, 01h, 00h, 00h, 00h, 01h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
DB 00h, 00h, 04h, 04h, 00h, 00h, 01h, 01h, 01h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
TONE_1:
DB 0Fh, 0Fh, 0Fh, 0Fh, 0Fh, 0Eh, 0Eh, 0Fh, 0Eh, 0Dh, 0Fh, 0Eh, 0Ch, 0Dh, 0Eh, 0Bh
DB 0Ch, 0Ch, 0Ch, 0Bh, 0Ch, 0Bh, 0Bh, 0Ah, 0Dh, 0Ah, 0Ah, 09h, 09h, 09h, 09h, 0Ah
DB 0Bh, 0Bh, 08h, 09h, 0Ch, 09h, 0Bh, 0Bh, 06h, 07h, 07h, 08h, 09h, 0Bh, 08h, 09h
DB 0Ch, 08h, 0Ah, 04h, 0Ah, 05h, 08h, 09h, 07h, 0Eh, 06h, 07h, 06h, 07h, 09h, 05h
DB 04h, 0Ch, 03h, 06h, 04h, 05h, 04h, 0Ah, 07h, 05h, 09h, 07h, 08h, 0Dh, 09h, 0Ch
DB 0Ch, 06h, 07h, 0Ah, 07h, 08h, 07h, 09h, 06h, 07h, 0Eh, 04h, 06h, 04h, 08h, 06h
DB 01h, 0Dh, 0Ch, 0Bh, 06h, 07h, 03h, 05h, 0Ah, 05h, 03h, 09h, 08h, 03h, 05h, 01h
DB 04h, 0Eh, 09h, 08h, 0Ch, 05h, 06h, 0Dh, 04h, 04h, 0Bh, 09h, 05h, 00h, 07h, 03h
DB 06h, 0Ah, 02h, 02h, 09h, 04h, 08h, 03h, 07h, 07h, 08h, 05h, 07h, 08h, 01h, 02h
DB 02h, 03h, 06h, 03h, 03h, 05h, 05h, 03h, 03h, 04h, 03h, 00h, 05h, 05h, 04h, 04h
DB 03h, 02h, 05h, 00h, 02h, 04h, 02h, 05h, 00h, 02h, 03h, 02h, 00h, 05h, 02h, 01h
DB 04h, 00h, 01h, 02h, 02h, 01h, 04h, 03h, 01h, 02h, 02h, 03h, 03h, 02h, 01h, 02h
DB 02h, 01h, 02h, 02h, 02h, 01h, 02h, 03h, 03h, 03h, 02h, 01h, 00h, 01h, 01h, 01h
DB 02h, 02h, 01h, 01h, 01h, 01h, 02h, 02h, 02h, 01h, 01h, 01h, 01h, 01h, 03h, 03h
DB 02h, 02h, 00h, 01h, 02h, 00h, 00h, 00h, 01h, 00h, 01h, 01h, 00h, 02h, 02h, 00h
DB 00h, 00h, 00h, 00h, 00h, 00h, 01h, 01h, 01h, 00h, 00h, 02h, 02h, 02h, 01h, 01h
TONN_2:
DB 0Fh, 0Fh, 0Fh, 0Fh, 0Fh, 0Fh, 0Fh, 0Fh, 0Fh, 0Fh, 0Fh, 0Eh, 0Fh, 0Dh, 0Eh, 0Dh
DB 0Dh, 0Fh, 0Dh, 0Fh, 0Dh, 0Ch, 0Dh, 0Ah, 0Eh, 0Fh, 0Eh, 0Ah, 0Fh, 0Eh, 0Dh, 0Dh
DB 0Eh, 0Dh, 0Ah, 0Ch, 0Eh, 0Bh, 0Eh, 0Dh, 0Ah, 0Fh, 08h, 0Ah, 0Ah, 0Eh, 09h, 09h
DB 0Fh, 0Ch, 0Ch, 0Eh, 0Bh, 0Ch, 0Eh, 0Fh, 0Bh, 0Fh, 0Ah, 07h, 0Fh, 09h, 0Ch, 0Bh
DB 09h, 0Dh, 0Eh, 0Ch, 07h, 06h, 08h, 0Ch, 08h, 0Dh, 0Ch, 0Fh, 0Dh, 0Eh, 0Ah, 0Eh
DB 0Dh, 06h, 0Ch, 0Eh, 0Bh, 0Fh, 07h, 0Dh, 0Ch, 09h, 0Fh, 05h, 0Ah, 0Ch, 0Bh, 09h
DB 0Eh, 0Dh, 0Dh, 0Eh, 0Eh, 0Ah, 0Eh, 05h, 0Ch, 06h, 05h, 0Ch, 0Eh, 0Fh, 0Ch, 0Ah
DB 0Fh, 0Fh, 09h, 0Ah, 0Fh, 09h, 07h, 0Eh, 07h, 0Bh, 0Eh, 0Fh, 05h, 0Ch, 08h, 08h
DB 09h, 0Bh, 04h, 03h, 0Bh, 05h, 0Ch, 0Ah, 0Eh, 0Dh, 0Ah, 08h, 0Bh, 09h, 04h, 0Eh
DB 02h, 03h, 0Bh, 0Eh, 0Dh, 0Eh, 0Dh, 0Bh, 06h, 07h, 04h, 08h, 0Ah, 05h, 0Eh, 06h
DB 08h, 07h, 08h, 0Bh, 0Ch, 0Ah, 0Bh, 07h, 09h, 03h, 0Eh, 09h, 04h, 06h, 05h, 0Fh
DB 07h, 0Ah, 05h, 07h, 0Fh, 0Dh, 06h, 08h, 0Bh, 06h, 0Dh, 04h, 07h, 0Bh, 09h, 0Ah
DB 05h, 08h, 09h, 03h, 03h, 07h, 08h, 03h, 05h, 05h, 04h, 0Eh, 0Dh, 0Ch, 0Ch, 0Bh
DB 06h, 02h, 0Ah, 05h, 09h, 09h, 03h, 05h, 05h, 08h, 08h, 04h, 04h, 07h, 03h, 03h
DB 04h, 04h, 0Eh, 06h, 02h, 0Ch, 0Bh, 0Bh, 03h, 0Ah, 05h, 05h, 09h, 03h, 03h, 08h
DB 08h, 08h, 01h, 01h, 07h, 07h, 02h, 02h, 02h, 06h, 06h, 02h, 02h, 02h, 03h, 03h
6和音テーブルも作成してみましたが、11025Hzのタイミングでは処理が厳しそうなので今回は3和音でいってみます

11025Hzの場合は0.09ms間隔なので、パソピア7のZ80 4MHzで368clock(0.092ms)くらいの間隔で音階を変化させることでWave再生します


続く

2018年12月26日水曜日

パソピア7のVRAMイメージ表示(描画アルゴリズム変更)

以前、RGBイメージをパソピア7で表示するアプリを紹介しました

しかしRGBプレーン毎にVRAM更新していたため、書き換え中の背景が気になっていました。
今回は1行ずつVRAMを更新していくように変更してみました。ここからダウンロードできます。

使い方は前と一緒です。
RUNするとVRAMイメージを読込むMRAMスロットが聞かれるので、「3」か「4」で指定します。
[3] 64KB MRAM (DEVICE 6)
[4] 64KB MRAM (DEVICE 5)

※指定したMRAMスロットのデータは消えるので注意してください。

続いて、MRAMに読み込むRGBファイルのパスを聞かれますので、SDカードのVRAMイメージ(RGBファイル)ファイルパスを入力します。
ファイルパスの中に「###」3文字を入れると、000~255まで自動でインクリメントしながら###の部分を置き換えて、ファイルを連続読込みします。

北海道のフリー画像がありましたので、以前紹介したアプリ(こちらを参照)でVRAMイメージを作成してパソピア7で表示させてみました。


以下、動画です。

札幌の画像が多いですね。

以前ブログへのコメントでXPAC2再販要求があったので組み立ててみましたが、どうやって販売するか考え中です。もうしばらくお待ちください・・・