Upgrade to Pro — share decks privately, control downloads, hide ads and more …

OSC2016 Hiroshima PSG tunes on NetBSD luna68k again

OSC2016 Hiroshima PSG tunes on NetBSD luna68k again

OSC2016広島のNetBSDセミナーで発表した『NetBSD/luna68kで「PSG音源の調べ」ふたたび』のスライドです。

Izumi Tsutsui

November 27, 2016
Tweet

More Decks by Izumi Tsutsui

Other Decks in Programming

Transcript

  1. NetBSD/luna68kで
    「PSG音源の調べ」
    ふたたび
    オープンソース カンファレンス2016広島
    ルナ@広島 ご当地ソングデモ
    Izumi Tsutsui
    [email protected]
    Twitter: @tsutsuii

    View Slide

  2. LUNAとは
     よしだともこ先生のブロクより
    LUNAというのは、1980年代から1990年代
    の初めごろにかけて、京都に本社を持つ
    オムロン株式会社が発売していた、
    UNIXワークステーションの名前です
    (その当時、私はこの会社のUNIXワークス
     テーション開発部門で働いていました)
    http://notredameningen.kyo2.jp/e422862.html

    View Slide

  3. 過去のLUNA@広島
     2013年
    サテライト
    キャンパス
    ひろしま
    初年度
    https://twitter.com/moveccr/status/386697554529771520

    View Slide

  4. Twitter TL on LUNA-II
     mlterm-fb + tw rubygem

    View Slide

  5. OSC2015広島にて
    「今回は LUNAが見られなくて
    残念でした」
    えーと、なんかすいません

    View Slide

  6. そういえばルナと言えば
    https://twitter.com/tsutsuii/status/398686477023858688
    @KOF2013

    View Slide

  7. 2015年 シーズンオフ
    https://twitter.com/ebijun/status/677990635211587584

    View Slide

  8. 2016年の
    OSC広島には
    なんとかして
    LUNAを持ち込ま
    なければ……

    View Slide

  9. と、
    思っていたの
    ですが

    View Slide

  10. 2016年 11月23日
    https://twitter.com/carp_News24/status/801662159012831232

    View Slide

  11. (´・ω・`)
    ありがとう、ルナ

    View Slide

  12. とりあえずネタは仕込みました
    https://twitter.com/tsutsuii/status/800362729458413568
    「みくった〜♪」

    View Slide


  13. いわゆるピコピコ音 × 3和音

    元はアーケードゲーム用

    イメージとしてはファミコンの
    音が近いです
    (※ファミコンの音源とPSGとは微妙に違います)
    PSG音源とは

    View Slide


  14. NEC PC-6001/mkII

    SHARP X1シリーズ

    富士通 FM-7/FM-77シリーズ

    MSX

    SHARP MZ-5500
    だいたい ’80年代前半のマシン。
    85年以降は FM音源チップ搭載機が主流に
    PSG音源を搭載したマシン
    出典: https://ja.wikipedia.org/wiki/Programmable_Sound_Generator

    View Slide

  15. PC-6001内のPSG音源IC

    View Slide

  16. MOSAIC.WAV アルバム
    「電気の恋人」の歌詞より
    「PSGでやっと3和音
     それでも感動してた
    あの頃〜♪」
    https://www.amazon.co.jp/dp/B00569BHDY

    View Slide

  17. いわゆる おっ◯んホイホイ
    https://twitter.com/isaki68k/status/802177405582327808

    View Slide

  18. 「チップチューン」として
    最近(?)見直されています

    View Slide

  19. PSG 3和音での楽曲
     ボカロとかより簡単です

    1音目:メインメロディ

    2音目:バッキング (副旋律)

    3音目:ベース or ドラム
    ノイズを使ったリズムとかもできますが
    そのへんの細かい技は慣れてから徐々に

    View Slide

  20. 最近は PC-6001の PSGで遊んでました
    http://www.nicovideo.jp/watch/sm29263535 http://www.nicovideo.jp/watch/sm29939586

    View Slide

  21. LUNAとPSG音源
     OMRON TECHNICS Vol.29 No.1
    https://twitter.com/tsutsuii/status/426963345388732416

    View Slide

  22. 初代LUNA構成
    OMRON TECHNICS Vol.29 No.1 “LUNA(デスクトップWS)のハードウェア”
    PSG (SSG) は
    ここにある
    メインCPU
    MC68030 デバイス
    サブCPU
    HD647180 デバイス
    MC68030
    HD647180

    View Slide

  23. LUNA内のYM2149

    YAMAHA製の AY-3-8910 互換チップ

    View Slide

  24. HD647180 とは
     日立製 Zilog Z80 上位互換マイコン

    6.144MHz クロック

    タイマ、シリアル、DMA内蔵

    MMU内蔵で1MBアドレスサポート

    647180は ワンタイム PROM版

    View Slide

  25. HD647180XP

    View Slide


  26. Z80互換サブCPU
    「ハードウェア設計者の趣味で〜」
    (元カーネル開発者という方のお話)

    PSG について
    「当時のパソコンと同じ機能が必要、
     という考えがあったのでは」
    (サブCPUに関係されていた方のお話)
    なぜLUNAにPSG音源が?

    View Slide

  27. ここまでが前提知識です
    https://twitter.com/tsutsuii/status/802351863836250112

    View Slide

  28. PC-6001用 PSGドライバ移植
    https://twitter.com/tsutsuii/status/748250450470674432

    View Slide

  29. 調査・検討の結果、
    I/Oポート変更・
    周波数テーブル修正・
    タイマ割り込み実装 等で
    PC-6001用PSGドライバを
    LUNAの HD647180でも
    使用可能、という結論に
    詳細はOSC2016京都のスライド↓を参照
    https://speakerdeck.com/tsutsui/osc2016-kyoto-psg-tunes-on-netbsd-luna68k

    View Slide

  30. リセット信号
    割り込み要求
    LUNA I/Oプロセッサ (XP) 構成
    MC68030
    NetBSD
    カーネル
    支配下
    8255
    PIO
    HD647180
    独立動作
    共有
    メモリ
    64KB
    アドレス
    71000000h

    7100FFFFh
    アドレス
    0000h

    FFFFh
    YM2149
    SSG
    タイマ
    SCI

    View Slide

  31. リセット信号
    割り込み要求
    XPデバイスドライバ実装(1)
    MC68030
    NetBSD
    カーネル
    支配下
    8255
    PIO
    HD647180
    独立動作
    共有
    メモリ
    64KB
    アドレス
    71000000h

    7100FFFFh
    アドレス
    0000h

    FFFFh
    YM2149
    SSG
    タイマ
    SCI
    演奏プログラム
    PSGドライバ
    以下の ioctl(2) を実装
    ・指定したZ80コードをロード
    ・HD647180をリセット
     ⇒これで演奏プログラムを実行

    View Slide

  32. リセット信号
    割り込み要求
    XPデバイスドライバ実装(2)
    MC68030
    NetBSD
    カーネル
    支配下
    8255
    PIO
    HD647180
    独立動作
    共有
    メモリ
    64KB
    アドレス
    71000000h

    7100FFFFh
    アドレス
    0000h

    FFFFh
    YM2149
    SSG
    タイマ
    SCI
    演奏プログラム
    PSGドライバ
    ユーザープロセス
    /dev/xp 経由
    プロセス
    仮想アドレス
    制御コマンド
    PSGドライバ用
    曲データ
    共有メモリ mmap(2) を実装
    ⇒ユーザープロセスから
     曲データのダウンロード
     および演奏開始停止制御が
     可能に

    View Slide

  33. OSC京都はそんな展示デモでした
    http://p.twipple.jp/AWyea https://twitter.com/tokudahiroshi/status/758874111418306560

    View Slide

  34. ここから
    OSC広島の
    新ネタです

    View Slide

  35. 展示予告スライド

    View Slide

  36. 展示予告スライド
    ここ

    View Slide

  37. PC-6001を含む
    PSG搭載マシンに
    しゃべらせる
    ……という
    いにしえの技が存在

    View Slide

  38.  Wikipediaより
    PSGによってPCMを再生する技法が存在し、
    PSGPCM や SSGPCM等と呼ぶ。
    ※PCM:.wav ファイル等で使われる音楽データ形式
     PSGPCMの原理
    PSGで発声されるのは矩形波である。これはロー(=0)とハイ(=1)の2値し
    かとらない。これに音量レジスタ(4bit)の値を掛けたものが1チャンネル分の
    出力である。
    AY-3-8910相当品では、あるチャンネルの発声を停止すると矩形波出力はハイ
    (=1)で固定される。従って、そのチャンネルの出力は、音量レジスタそのも
    のとなる(1×音量レジスタ=音量レジスタ)。
    この仕様を利用し、発声を停止した状態でそのチャンネルの音量を操作すること
    で、PSGをDACとして利用するというのが大まかな原理である。
    PSGによるPCM再生
    出典: https://ja.wikipedia.org/wiki/Programmable_Sound_Generator

    View Slide

  39. 音楽再生時のPSG出力
    スピーカー
    アンプ
    ♪♪

    Pico
    pico
    加算
    PSGチップ
    チャンネル3
    Volume
    1〜15
    チャンネル1
    Volume
    1〜15
    音程
    チャンネル2
    Volume
    1〜15
    音程
    ・各chで音程と音量を設定
    ・3chの音を合成してスピーカー駆動

    View Slide

  40. PCM再生時のPSG出力
    スピーカー
    アンプ
    加算
    PSGチップ
    チャンネル3
    Volume
    1〜15
    チャンネル1
    Volume
    1〜15
    OFF
    Volume
    チャンネル2
    Volume
    1〜15
    OFF
    Volume
    3chのVolume合計値
    =PSG電圧出力
    サンプリング周波数(8〜11kHz)で
    以下を処理することで任意PCM出力
    ・8ビット PCMデータ読み出し
    ・ボリューム変換テーブル読み出し
    ・PSG 各ch へボリューム設定
    みくった〜♪
    Volume設定値
    =各ch出力電圧
    Volume設定値
    =各ch出力電圧

    View Slide

  41. PC-6001での実装例
    http://sbeach.seesaa.net/article/387861465.html

    View Slide

  42. PC-6001での実装例
    ●64KB RAM の PC-6001mkII を想定
     ⇒使用可能メモリは 57KB 程度
    ●11.025kHz 8bit PCM に限定
    ●PCMデータは テープ or RC-232C (オプション)
     
    から本体RAMに読み込み
    ●割り込み禁止して、命令実行クロック数で
     再生タイミングを制御

    View Slide

  43. P6 PCM再生の問題点
     再生時間
    ・サンプリング周波数 11kHz・8bitデータ
    ・使用可能メモリ 57KB
     ⇒再生可能時間は 約5秒
     ロード時間
    ・データサイズ 57KB
    ・テープのボーレート 1200bps
     ⇒57KB のロード時間: 約9分30秒

    View Slide

  44. MOSAIC.WAV アルバム
    「電気の恋人」の歌詞より
    「データは 皆テープにダビング
     読み込むのに 速くて10分♪」
    http://www.nicovideo.jp/watch/sm12836594

    View Slide

  45. LUNAでのPCM再生実装
    ●プログラム・スタックを除く60KBを使用
    ●8kHz サンプルPCMをターゲット
     ⇒再生可能時間は 8秒弱
      再生中にもホストからロードできれば無制限?
    ●8kHz サンプルはタイマ割り込み駆動
    ●再生・停止はホストOSからコマンド指示
    ●PCMデータもホストOSからロード

    View Slide

  46. ●ロード
    ホストOSの共有メモリで一瞬
    ●ストレージ
     ホストOSのHDDで実質無尽蔵
    ●PSGデータ・PCMデータ
     Ethernet経由で何でも取得可能
    LUNA PSG最強説

    View Slide

  47. ●とりあえずのご当地ネタで
    列車接近メロディPSG版 + アナウンスPCM
    展示 PSG+PCMデモ
    http://www.nicovideo.jp/watch/sm5379033

    View Slide

  48. ●PSG演奏は今でも感動できます
    ついつい自分で作った曲を聞いてしまう罠
    ●サブCPUとしてのZ80の可能性
    今のホスト OS構成では PSG制御は結構大変
    ●PCM再生の先人の知恵を見習いたい
    ●今回も「動いたわーい」でした!
    まとめ

    View Slide