トップ 一覧 検索 ヘルプ RSS ログイン

メイン掲示板

メイン掲示板

スパムが増えてしまったため、新規投稿は休止しております。

何かありましたら、ひとこと掲示板のほうにご投稿いただければ幸いです。

 CSM音声合成モードについて - すーぱーたーぼ (2010年10月31日 04時08分08秒)

ご無沙汰しております。CSMの実験を拝見させてもらいました。NRTDRVのMMLで切り込んでくるとは思ってなかったのでちょっと驚きました。CSMは奥が深そうなので研究しがいのあるテーマの一つですね。喋るpianoも知りませんでした。お馬鹿な人はドイツにもいるんですね。

それはそうと、一つ気にかかったことがあるのですが、CSM音声合成モードは全チャネルのKEY OFF/ONをするだけと説明がありますが、全チャネルの音量もKEY ONに同期して更新されるという違いがあります。OPM互換IPを作った時に最初はこれを無視していたのですが、ゼリアードのサンプルにてプチノイズと音質の劣化がありました。楽曲再生と同時発生はできなくなりますが、CSMモードで再生したほうが音質は向上すると思います。nrtdrvの場合は、毎フレームの冒頭で次のフレームの直前あたりにオーバーフローするようにTimerAを設定ればよいのかな?

あ、ついでに私事ですがX1リソースセンターは本日(2101.10.31)で閉鎖というかinfoseekの無料webサービスが終了しちゃうみたいです。継続したけりゃ金払え的な感じがイヤなので、ドメイン取って別の場所に移設する予定でいます。

実は僕自身、今に至るまでCSMモードを使ったことがありません^-^;;; 流れとしては、Timer-Aが0になる→割り込み発生。この間にOPMのレジスタ内容を書き換える→書き換え処理終了。割り込みから復帰→Timer-Aオーバーフローが発生→キーONし書き換えたパラメータを確実に更新した後、キーOFF・・・という風に理解していますが、解説では少しボカして書いてますね^^;

また、とある方から、CSMモード時はキーオンの際に出力波形の位相がリセットされるとご指摘を受けました。CSMモードを使わない場合は、キーONのレジスタ書き換えを自前で行わなければなりませんから、OPM busyの影響をモロに受けてしまい、完全に同じタイミングでの更新はできません。CSMモードで駆動したほうが音質的に良くなるだろうというのは僕も想像がつきます。

ただ、NRTDRVでCSMモードを使うにはどうすればいいのか・・・データを更新する方法が問題なんですよね。。。Timer-Aの値を常に監視してチェックする仕組みを作るか、CTCのタイミングとTimer-Aのタイミングを完全にあわせるかくらいしか方法は思いつきませんが・・・次にやってみる気になった時、挑戦してみたいと思います。ご指摘有難うございました^^

そしてサイト消滅と移設、お疲れ様でした。早速、このサイトからのリンクをX1センターに変更しました。 - hex125 (2010年11月01日 20時10分16秒)

  • はじめまして。スーパーターボ様からご紹介を頂きこちらを伺っておりましたら、hex125様のレスが以前に私的調査した結果(監視の方)と同じでしたので思わず書き込んでしまいました。turboZ実機をもっておりますので、近々NRTDRVを使用させて頂こうと思います。ちなみにスタークルーザー256色対応X1エミュでもCMSヴォイスは聞けるようです(既出でしたらすみません) - Y.S. (2010年11月02日 14時17分48秒)
  • nrtdrvでCSMモードを叩く方法ですが、フレームのインターバル毎の最初にTimer-Aをリセット、インターバル周期よりちょい短かく設定、LOAD、続けて次回のKEY ON時に更新したい音量を設定します。その後一定時間後にTimer-Aがオーバーフローしますから、CTC割り込みからTimer-A開始までの遅延が常に一定であれば、Timer-Aオーバーフローのインターバルも1サンプリング未満になりませんか? ただ、CSMモードのTimerAオーバーフローで同期更新されるのは音量だけなので、周波数も変化させる方法ではCSMモードはかえって邪魔になると思います。 - すーぱーたーぼ (2010年11月06日 16時08分51秒)
  • 2010年11月02日の私の調査結果は間違いであることが再調査の結果判明しました。X1センターの方に経過を書きましたがゼリアードではTimerAオーバーフローフラグは監視していませんでした。BUSYフラグのチェックのみでした。訂正いたします。 - Y.S. (2010年11月09日 02時07分33秒)
  • 某社のCSM音声合成ではTimer-A周期は基本周波数を発声するものでフレーム周期とは無関係でした。2つ上の書き込みは全くの見当違いです。適当な事を書いてすいませんでした。某社のCSM再生データはnrtdrvで普通に再生できそうです。 - すーぱーたーぼ (2010年11月11日 17時07分26秒)
お名前: コメント:

 Re: IPLのDISK READエントリ - naruto (2009年06月04日 19時00分08秒)

TurboBIOSのDISK READエントリの件もお教えいただきましてありがとうございます!

これらのリモート環境プログラムを拝見させていただいたとき、通信専用のIOCSまで用意して高速化を実現するという設計そのものに感嘆いたしました。とかく僕はロジカルなプログラムを組めなくて力技に走ってしまいがちですので、憧れる事しきりです!

そして、書き戻しプログラム部のソースもさっそく拝見させていただきました。リード・ライト・デバイス選択などの豊富なBIOSエントリが用意されていることに驚嘆いたしました!

X1シリーズとturboシリーズでルーチンを分岐させる必要こそあるものの、すごく活用できそうです。

改めまして、本当にありがとうございます!

  • BIOSコールは簡単ですがアクセス中に演奏が止まるのが難点です。HSシリアル通信も演奏中の受信はCPUパワー的に辛いです。hoot環境が快適なだけに実機環境をもう少し整備できるとよいなと思ってます。プリンタポートにSDカードを繋いでFAT16を直接読む手もありますが...速度が8Kbytes/sec程度になります。がんばれZ80@4MHz - すーぱーたーぼ (2009年06月08日 12時19分03秒)
  • 確かに現状ではせっかくの実機環境を活用しきれていないので、実機ベースで快適に使えるようにできたら嬉しいですね〜。 Windows環境で完結させてしまうと「それならVSTプラグインでもいいんじゃ…?」という話にもなりかねないので、実機だからこそ味わえる魅力をアピールしていけたらと思っています。 - naruto (2009年06月11日 13時32分14秒)
  • そういえば、今はメインメモリをすべてドライバと曲データに割り当てていますので、その点においてもBIOS/IPLコールと演奏との共存が難しいんですよね。 BIOS/IPLの機能でGRAMに一旦データを読み込んでからメインメモリに転送して演奏させるという運用を想定していましたが、GRAM上に置いた曲データを直接演奏させるような機能も必要になるかも…とも思い始めています(アクセス速度が不安ですが…)。 - naruto (2009年06月11日 13時35分15秒)
  • あっ! SDカードといえば、X1リソースセンター様の掲示板で仮想FD/FDD/FDCの話が挙げられていたときも、とても興味深く拝読しておりました! あのツリーを拝読した限りでは仮想FD化はとても難度が高そうですが、X1上でFAT16をそのまま解釈させるというアプローチもあるとは目から鱗です。現状で最も大きな曲データは約20KBなので、秒間8KBほどの速度が出せるとあらば3秒ほどで読み込めそうですし、夢が広がりますね。 - naruto (2009年06月11日 13時39分05秒)
  • 現状HSSIOでもNRTDRVのリモートブートはできました。詳細はX1リソースセンターの掲示板へ書いてます。あとメモリカードをX1に繋ぐネタは私よりX1EMUのKMさんの方が先になります。 - すーぱーたーぼ (2009年06月15日 12時02分39秒)
  • うお!プログラム未改造でそのまま行けるとは驚愕です。調査と実験と解説テキストの執筆ありがとうございます!掲示板のほうにもお邪魔させていただきますね。 そして、メモリカードのネタはKMさんの発案だったのですね。僕のアンテナが低くて申し訳ない限りです…ごめんなさい。実はX1でのプログラミングに目覚めたのが去年なので、ネットでいちばんX1が盛り上がっていた時期をリアルタイムに体験していなくて後追いになってしまっているのでした(涙)。 - naruto (2009年06月15日 21時30分16秒)
お名前: コメント:

 Re: IPLのDISK READエントリ - naruto (2009年06月04日 18時23分24秒)

すーぱーたーぼさん、貴重なエントリをご紹介いただきましてありがとうございます!

今までディスクアクセスに関してはFDCを直叩きして駆動する方法しかないと思っておりましたので、自分にとってはハードルが高くて手を出せずにいたのですが、このような便利なエントリが存在するとは感動しました。

僕でも、このエントリを使用すればディスクアクセスを実現できそうです。本当にありがとうございます!

そして、改行についてご不便をお掛けしてしまってごめんなさい。この掲示板では「FreeStyleWiki」の記法(Help参照)が使用できますので、各行の頭に半角空白をひとつ入れると、HTMLのPREタグのような感じで改行を入れることができます。

;----------------------------------------------------------------------------
;IPL:021A : DISK READ
;IN:
; A = recoard size
; DE = start sector
; HL = start address
; (FF87) = drive no.
;OUT:
; CF = error flag
; (HL-) = read data
;break
;(FF88) = STACK SAVE (original only)
;(FF8A) = ERROR RETURN ADDESS (original only)
;----------------------------------------------------------------------------

こんな感じになります。

…でも、ちょっと不便なので、別の掲示板を用意したほうがいいような気もしてきました(汗)。

お名前: コメント:

 IPLのDISK READエントリ - すーぱーたーぼ (2009年06月04日 17時43分26秒)

;----------------------------------------------------------------------------

;IPL:021A : DISK READ

;IN:

; A = recoard size

; DE = start sector

; HL = start address

; (FF87) = drive no.

;OUT:

; CF = error flag

; (HL-) = read data

;break

;(FF88) = STACK SAVE (original only)

;(FF8A) = ERROR RETURN ADDESS (original only)

;----------------------------------------------------------------------------

IPL-ROMに切り替える必要があるので、呼び出し元は8000H-F7FFHから

EX AF,AF' ;PUSH AFを使う場合は、SPも8000H-F7FFHのエリアへ

LD A,1DH

OUT (00H),A ; IPL ROM有効

EX AF,AF'

CALL 021AH

EX AF,AF'

LD A,1EH

OUT (00H),A ; IPL ROM無効

EX AF,AF'

のようにします。

コール毎にヘッドがリストアを行うので、何度もコールすると時間が掛かります。

3000H-EFFFHに48KリードしてGRAMの4000H-EFFFHに一気に転送するのがよろしいかと。

X1turboの正式なBIOSエントリならDISKからGRAMへ直接転送できるのですが...手元に資料がありません。今度調べておきます。

お名前: コメント:

 IPLのDISK READエントリ - X1リソースセンター管理人こと、すーぱーたーぼ (2009年06月04日 17時38分46秒)

IPL用のDISK READエントリのご紹介です。IPL起動後、DISKからGRAMにリードするのに使えそうなルーチンです。

;----------------------------------------------------------------------------;IPL:021A : DISK READ;IN:; A = recoard size; DE = start sector; HL = start address; (FF87) = drive no.;OUT:; CF = error flag; (HL-) = read data;break;(FF88) = STACK SAVE (original only);(FF8A) = ERROR RETURN ADDESS (original only);----------------------------------------------------------------------------

IPL-ROMに切り替える必要があるので、呼び出し元は8000H-F7FFHから

EX AF,AF' ;PUSH AFを使う場合は、SPも8000H-F7FFHのエリアへLD A,1DHOUT (00H),A ; IPL ROM有効EX AF,AF'CALL 021AHEX AF,AF'LD A,1EHOUT (00H),A ; IPL ROM無効EX AF,AF'

のようにします。

X1用のエントリですが、X1turboのBIOSにもパッチが当たっていて、2HDから起動した後なら2HDもリードできるはずです。コール毎にヘッドがリストアするので、何度もコールすると時間が掛かります。GRAM転送なら3000H-EFFFHへ一気に48KリードしてGRAMへ転送するのがよろしいかと。

実はX1turboの正式なBIOSエントリならDISKからGRAMへ直接転送できるのですが...手元に資料がありません。今度調べておきます。

お名前: コメント: