プチコンまとめWiki (初代/mkII)

投稿プログラム : 8bitDA

パンくずリスト

2012年4月2日投稿 / 投稿者 : Oskar / タグ : 投稿プログラム 非実用ツール QRコード mkII専用

概要

音声サンプリングデータを再生するプログラムです。

内容

サンプリングレート4kHz、符号付き8-bit、モノラルの音声サンプリングデータをかなり強引に再生します。

  • メモリの許す限り長い音声でもOK。
    • ニコニコ動画の音楽を切り取って20秒ぐらいにして試してみたが、再生できた。1分はいけそう。
  • Windows の .wavファイルで8-bitのものは「符号なし」なので注意。
  • まあ、一発技といわれればそれまでですが、これでもかなり真剣に作ったのよ。

プログラム構成

  • メインモジュール OK_8BDA2 (QR)
    • (2012.5.3) プチコンmkII ver2.1 でも動作するように修正しました。
      以前のリスト (OK_8BDA1) で75行目を N$=”B96&” と書き換えれば動作します。
  • 波形データ
    • DATA方式波形データ OK_MOHO1 (QR)
      • DATA文で16進数の文字列で書かれた波形データ。とりあえず聞いてみてください。
    • 計算方式波形データ OK_SINE1 (QR)
      • とりあえず 440Hz(O4A相当)のサイン波……に似ているもの。

使い方

メインモジュールの後ろに波形データを一つ追加して使います。

(例)

LOAD”OK_8BDA2”:APPEND”OK_MOHO1”
RUN

もちろん波形データを追加した状態で保存すれば、単独で実行可能なプログラムとして使えます。

苦労した点

MMLで、タイでつないでいる間は音色を変えられないとか、タイを使わないとチャンネル間でユーザ定義波形の開始位置が合わないとか……。

今後の展開

  • やる気しだい
    • ステレオ化
    • データ圧縮
    • リソースからの波形データ読み込み
  • がんばればできるかも
    • 音質向上
      • サンプリング周波数を上げる
      • 折り返しひずみを減らす(同じ4KHzでもPCで聞くと愕然に良いのはたぶんこのせい)
      • 謎のノイズの除去(計算方式波形データを聞くと分かるが、プツプツとノイズが乗る。ヘッドホン端子出力をPCで見ても変な波形が出ている。波形書き換えは間に合っているようなのだが……)
    • VSYNC 1 で回せるように
    • 他プログラムから使えるきれいなサブルーチン化
  • 妄想
    • 目指せCD音質(44.1kHz)
    • こういう変な再生方法(10年以上前のものを持ち出すおっさん失礼)

ひとこと

波形データのDATA文は全部手打ち!!

  • 投稿人は mkII でプチコンデビューなので、プチコンの先人達を思うと楽してはいかんと思った……が、やはりつらかった。

スクリーンショット・動画

え、見たいって?

QR コード

プチコンmkII 向けの QR コードです。*1

メインモジュール (OK_8BDA2)

1/22/2
qr0-V2.pngqr1-V2.png

DATA方式波形データ (OK_MOHO1)

1/142/143/14
qr0-m.pngqr1-m.pngqr2-m.png
4/145/146/14
qr3-m.pngqr4-m.pngqr5-m.png
7/148/149/14
qr6-m.pngqr7-m.pngqr8-m.png
10/1411/1412/14
qr9-m.pngqr10-m.pngqr11-m.png
13/1414/14
qr12-m.pngqr13-m.png

計算方式波形データ (OK_SINE1)

1/1
qr0-s.png

プログラムリスト

メインモジュール (OK_8BDA2)

  1. ’======================
  2. ’ 8bitDA (OK_8BDA2)
  3. ’ (C) Oskar 2012.05.03
  4. ’======================
  5. GOSUB @CLEAN
  6. NCH=4
  7. PATCH=240
  8. GOSUB @GET_WAVE
  9. GOSUB @SET_INIT_FRAME
  10. GOSUB @SET_MML
  11. GOSUB @PLAY_MML
  12. GOSUB @REPLACE_FRAME
  13. END
  14. @CLEAN
  15. CLEAR
  16. BGMSTOP
  17. BGMCLEAR
  18. RETURN
  19. @READ_WAVE
  20. RESTORE @WAVE_SAMPLES
  21. I=−1
  22. FOR UNTIL=0 TO 0 STEP 0
  23.  READ D$
  24.  I=I+1
  25.  UNTIL=(D$==””)
  26. NEXT
  27. NFRAME=FLOOR(I/NCH)+1
  28. NCHUNK=I
  29. DIM W$(NFRAME,NCH)
  30. RESTORE @WAVE_SAMPLES
  31. FOR I=0 TO NCHUNK−1
  32.  F=FLOOR(I/NCH)
  33.  C=I%NCH
  34.  SHIFT=C*128/NCH
  35.  READ WC$
  36.  W$(F,C)=”00”*SHIFT
  37.  W$(F,C)=W$(F,C)+WC$
  38.  W$(F,C)=W$(F,C)+”00”*(128−LEN(WC$)/2−SHIFT)
  39. NEXT
  40. FOR I=NCHUNK TO NCHUNK+NCH−1−NCHUNK%NCH
  41.  W$(FLOOR(I/NCH),I%NCH)=”00”*128
  42. NEXT
  43. RETURN
  44. @CALC_WAVE
  45. DIM W$(NFRAME,NCH)
  46. N=0
  47. FOR F=0 TO NFRAME−1
  48.  FOR C=0 TO NCH−1
  49.   SHIFT=C*128/NCH
  50.   WT$=””
  51.   FOR I=0 TO 128/NCH−1
  52.    GOSUB @WAVE_FUNCTION
  53.    WT$=WT$+HEX$(X,2)
  54.    N=N+1
  55.   NEXT
  56.   W$(F,C)=”00”*SHIFT
  57.   W$(F,C)=W$(F,C)+WT$
  58.   W$(F,C)=W$(F,C)+”00”*(128−LEN(WT$)/2−SHIFT)
  59.  NEXT
  60. NEXT
  61. @SET_INIT_FRAME
  62. FOR C=0 TO NCH−1
  63.  BGMPRG PATCH+C,127,127,127,127,W$(0,C)
  64. NEXT
  65. RETURN
  66. @SET_MML
  67. DIM M$(NCH)
  68. T$=”T313”
  69. N$=”B96&”
  70. REP=FLOOR(NFRAME/2)−1
  71. FOR C=0 TO NCH−1
  72.  M$(C)=”:”+STR$(C)+”L96Q8O1@D15@V127V127”
  73.  M$(C)=M$(C)+”@”+STR$(PATCH+C)
  74.  P1$=N$*(C+1)+”$”+STR$(C)+”=1”+N$*(NCH−1−C)
  75.  P2$=N$*(C+1)+”$”+STR$(C)+”=2”+N$*(NCH−1−C)
  76.  M$(C)=M$(C)+P1$+P2$
  77.  FOR R=REP TO 251 STEP −250
  78.   M$(C)=M$(C)+”[”+P1$+P2$+”]”+STR$(250)
  79.  NEXT
  80.  M$(C)=M$(C)+”[”+P1$+P2$+”]”+STR$(R)
  81. NEXT
  82. RETURN
  83. @PLAY_MML
  84. BGMPLAY T$,M$(0),M$(1),M$(2),M$(3)
  85. VSYNC 0
  86. RETURN
  87. @REPLACE_FRAME
  88. DIM VPREV(NCH)
  89. F=1
  90. FOR UNTIL=0 TO 0 STEP 0
  91.  ’VSYNC 1
  92.  FOR C=0 TO 3
  93.   V=BGMGETV(0,C)
  94.   IF V>0 AND V!=VPREV(C) THEN:ELSE @ENDIF_RW
  95.    BGMPRG PATCH+C,127,127,127,127,W$(F,C)
  96.    VPREV(C)=V
  97.    IF C==3 THEN F=F+1
  98.   @ENDIF_RW
  99.  NEXT
  100.  UNTIL=(F>=NFRAME OR !BGMCHK(0))
  101. NEXT
  102. RETURN

DATA方式波形データ (OK_MOHO1 省略・コメント追加版)

  1. ’======================
  2. ’ A wave for 8bitDA
  3. ’ (C) Oskar 2012.04.02
  4. ’======================
  5. ’ショウリャク (ナニ カイテモ カマワナイ)
  6. END
  7. @GET_WAVE
  8. ’サイセイ フレームスウ (サイコ゛マテ゛ナラ 9999)
  9. ’1フレーム=128サンフ゜ル
  10. NFRAME=9999
  11. GOSUB @READ_WAVE
  12. RETURN
  13. @WAVE_SAMPLES
  14. ’1モシ゛レツニ 32サンフ゜ル (32ハ゛イト=64モシ゛)
  15. DATA 0001020202020201010000FEFEFEFEFEFEFF00010101010100FFFFFEFDFDFDFD
  16. DATA FE0206090B0C0B080400FDFAF9F8F9FAFC0005090B0C0A08060301FFFEFCFDFD
  17. DATA FD0711181D1C160D02F8EFE8E6E5EBF101223E52575143290DF4DFD4CFD2DBE3
  18. DATA FE1B303C3A34251204F7F1EEECF0EEF6001C292A27200FFEEDE0D8D3D7D8E50A
  19. ’・・・
  20. ’ショウリャク (DATA フ゛ンヲ ス゛ラス゛ラ ナラヘ゛ル)
  21. ’・・・
  22. ’サイコ゛ハ カラモシ゛レツ
  23. DATA ””

計算方式波形データ (OK_SINE1 コメント追加版)

  1. ’========================
  2. ’ A sine wave for 8bitDA
  3. ’ (C) Oskar 2012.04.02
  4. ’========================
  5. END
  6. @GET_WAVE
  7. ’サイセイ フレームスウ
  8. ’1フレーム=128サンフ゜ル
  9. NFRAME=50
  10. GOSUB @CALC_WAVE
  11. RETURN
  12. @WAVE_FUNCTION
  13. ’マイカイ タ゛イニュウスルノハ ムタ゛タ゛カ゛ キニ シナイ
  14. RATE=4000
  15. FREQ=440
  16. OMEGA=FREQ*2*PI()
  17. ’N:サンフ゜ル シ゛コク (ハ゛ンコ゛ウ 0−)
  18. ’X:サンフ゜ル シンフ゜ク (−128<=X<=127)
  19. ’シシャコ゛ニュウノ ホウカ゛ ヨイカ゛ キニ シナイ
  20. X=127*SIN(OMEGA/RATE*N)
  21. RETURN

CHECKER FLAG (ひとことコメント)

この作品に対するコメントがあれば一言どうぞ。(作品に直接関係ない質問や雑談は掲示板へ)

  • hata0401 : 嗚呼ー (2012/07/21 (土) 22:00:08)
  • メルビル : すごいです!波形データはどうやって作るのですか? (2012/08/26 (日) 01:13:36)
  • わぁぃ@ : 圧縮した波形データを載せていいですか? (2012/08/26 (日) 08:32:39)
  • メルビル : ↑見たいです (2012/08/26 (日) 14:47:30)

*1 2012.4.3: 高DPIディスプレイで読み取りにくそうなので、Wiki側の設定で拡大しました。元データの拡大版も用意しましたが添付済みのファイルはユーザが更新できないようなので。

表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.050 秒 | このページの最終更新 : 2012/08/26 (日) 14:47:30 (2612d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30