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再生が始まります。

実機での演奏をどうぞ




実機で試せる方はぜひ

2 件のコメント:

  1. PASOPIA7のボイスユニット持ってました。
    本体だけでこんな事が可能なんですね。

    返信削除
    返信
    1. ボイスユニットいいですね!

      削除