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

Toukou/8bitDA の変更点

パンくずリスト


#title(投稿プログラム : 8bitDA)
#contents
// ←このように「//」で始まる行はコメントです。ページ本文には反映されません。
//------------------------------------------------------------------------------
// ・投稿年月日は、このページを投稿しようとしている今日の日付を半角数字で入力してください。
//   この日付は、投稿プログラムを自動的に年月日順に並べる際に使用されます。
// ↓↓↓
2012年4月2日投稿
// ↑↑↑
//------------------------------------------------------------------------------
// ・投稿者名は、将来的に投稿プログラム一覧に表示するために使用します。
// ・「名無しさん」のままにしておくと、匿名の方からの投稿として扱われます。
// ↓↓↓
/ 投稿者 : Oskar
// ↑↑↑
//------------------------------------------------------------------------------
// ・適当にタグをつけることができます。半角のコンマ区切りで複数つけられます。
//   タグをつけると、同じタグが付いたページを検索することができます。
// ★次に該当するプログラムは、特定のタグを設定するようご協力お願いします。
//   これらを設定すると、将来的に投稿プログラム一覧に目立つマークが付くようになる予定です。
// ・短いプログラム → 「1行プログラム」「数行プログラム」「1画面プログラム」タグのいずれか1つ
// ・初代プチコンでも動作するプログラム → 「初代対応」タグ
// ・mkII 以降専用のプログラム → 「mkII専用」タグ
// ・QRコードを掲載している → 「QRコード」タグ
// ・該当するなら「ゲーム」「実用ツール」「音楽」タグのいずれか
// ↓↓↓
/ &tag(投稿プログラム,非実用ツール,QRコード,mkII専用);
// ↑↑↑

//------------------------------------------------------------------------------
// ここに概要とか書きます。** や *** で始まる行は子見出しとなります。
// [#英数字] はページ内リンクに使用されるアンカーですが、
// 書かなかったり、消したりしてもかまいません。
// ない場合、自動でランダムな文字列が再付与されます。

* 概要 [#Summary]
音声サンプリングデータを再生するプログラムです。

** 内容 [#Contents]
サンプリングレート4kHz、符号付き8-bit、モノラルの音声サンプリングデータをかなり強引に再生します。
- メモリの許す限り長い音声でもOK。
-- ニコニコ動画の音楽を切り取って20秒ぐらいにして試してみたが、再生できた。1分はいけそう。
- Windows の .wavファイルで8-bitのものは「符号なし」なので注意。
- まあ、一発技といわれればそれまでですが、これでもかなり真剣に作ったのよ。

** プログラム構成 [#Package]
- メインモジュール [[OK_8BDA2>#List_OK_8BDA2]] [[(QR)>#QR_OK_8BDA2]]
-- &color(red){(2012.5.3) プチコンmkII ver2.1 でも動作するように修正しました。};~
&color(red){以前のリスト (OK_8BDA1) で75行目を &basic{N$=”B96&”}; と書き換えれば動作します。};
- 波形データ
-- DATA方式波形データ [[OK_MOHO1>#List_OK_MOHO1]] [[(QR)>#QR_OK_MOHO1]]
--- DATA文で16進数の文字列で書かれた波形データ。とりあえず聞いてみてください。
-- 計算方式波形データ [[OK_SINE1>#List_OK_SINE1]] [[(QR)>#QR_OK_SINE1]]
--- とりあえず 440Hz(O4A相当)のサイン波……に似ているもの。

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

(例)

&basic{LOAD”OK_8BDA2”:APPEND”OK_MOHO1”};~
&basic{RUN};

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

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

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

** ひとこと [#Twitting]
波形データのDATA文は全部手打ち!!
- 投稿人は mkII でプチコンデビューなので、プチコンの先人達を思うと楽してはいかんと思った……が、やはりつらかった。

/////////////////////////////////

* スクリーンショット・動画 [#ScreenShots]
え、見たいって?

// ページを作成すると、画像の添付ができるようになります。(作成する前はできません)
// 作成後のページの右上、ウィキメニューにある「添付」から画像をアップロードできます。
// (添付ファイルはページごとに別個に管理されています。必ず作成後のページに添付してください)
// 画像をアップロードしたら、以下の書式でページ内に貼り付けられます。
// #ref(添付ファイル名)

// 以下の書式で、YouTube やニコニコ動画を貼り付けられます。
// #youtube(0HWX7kovgY8)
// #nicovideo(sm13684820)

/////////////////////////////////
// QR コードがない場合は、この部分は削除してください

* QR コード [#QR] 

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

// 【重要】旧プチコンから mkII に転送したプログラムは、mkII で保存しなおしてから
// QR コード化すると、枚数が半分ぐらいに減ります。ぜひお試し下さい。

// ページを作成すると、QR コードの添付ができるようになります。(作成する前はできません)
// 作成後のページの右上、ウィキメニューにある「添付」から画像をアップロードできます。
// (添付ファイルはページごとに別個に管理されています。必ず作成後のページに添付してください)
// QR コードをアップロードしたら、以下の書式でページ内に貼り付けられます。
// #ref(アップロードしたファイル名)

// QR コードを大きくしたい場合は、倍率指定ができます。コンマは必ず 2 つ指定してください。
// ブラウザによっては補完がかかってボケますが、それでも問題なく読み込み可能です。
// #ref(アップロードしたファイル名,,200%)

// 複数の QR コードを貼り付けるために表組みを用いる場合、&ref(); を使用します。
// (#ref() を表に埋め込んでしまうと、古い Internet Explorer でうまく表示されません)
// |~1/2|~2/2|
// |&ref(添付ファイル名);|&ref(添付ファイル名,,200%);|
** メインモジュール (OK_8BDA2)[#QR_OK_8BDA2]
|~1/2|~2/2|
|&ref(qr0-V2.png,,200%);|&ref(qr1-V2.png,,200%);|
** DATA方式波形データ (OK_MOHO1)[#QR_OK_MOHO1]
|~1/14|~2/14|~3/14|
|&ref(qr0-m.png,,200%);|&ref(qr1-m.png,,200%);|&ref(qr2-m.png,,200%);|
|~4/14|~5/14|~6/14|
|&ref(qr3-m.png,,200%);|&ref(qr4-m.png,,200%);|&ref(qr5-m.png,,200%);|
|~7/14|~8/14|~9/14|
|&ref(qr6-m.png,,200%);|&ref(qr7-m.png,,200%);|&ref(qr8-m.png,,200%);|
|~10/14|~11/14|~12/14|
|&ref(qr9-m.png,,200%);|&ref(qr10-m.png,,200%);|&ref(qr11-m.png,,200%);|
|~13/14|~14/14|~ |
|&ref(qr12-m.png,,200%);|&ref(qr13-m.png,,200%);| |
** 計算方式波形データ (OK_SINE1)[#QR_OK_SINE1]
|~1/1|
|&ref(qr0-s.png,,200%);|

/////////////////////////////////

* プログラムリスト [#List]
** メインモジュール (OK_8BDA2)[#List_OK_8BDA2]
#basic{{
’======================
’ 8bitDA (OK_8BDA2)
’ (C) Oskar 2012.05.03
’======================

GOSUB @CLEAN
NCH=4
PATCH=240
GOSUB @GET_WAVE
GOSUB @SET_INIT_FRAME
GOSUB @SET_MML
GOSUB @PLAY_MML
GOSUB @REPLACE_FRAME
END

@CLEAN
CLEAR
BGMSTOP
BGMCLEAR
RETURN

@READ_WAVE
RESTORE @WAVE_SAMPLES
I=−1
FOR UNTIL=0 TO 0 STEP 0
 READ D$
 I=I+1
 UNTIL=(D$==””)
NEXT
NFRAME=FLOOR(I/NCH)+1
NCHUNK=I
DIM W$(NFRAME,NCH)
RESTORE @WAVE_SAMPLES
FOR I=0 TO NCHUNK−1
 F=FLOOR(I/NCH)
 C=I%NCH
 SHIFT=C*128/NCH
 READ WC$
 W$(F,C)=”00”*SHIFT
 W$(F,C)=W$(F,C)+WC$
 W$(F,C)=W$(F,C)+”00”*(128−LEN(WC$)/2−SHIFT)
NEXT
FOR I=NCHUNK TO NCHUNK+NCH−1−NCHUNK%NCH
 W$(FLOOR(I/NCH),I%NCH)=”00”*128
NEXT
RETURN

@CALC_WAVE
DIM W$(NFRAME,NCH)
N=0
FOR F=0 TO NFRAME−1
 FOR C=0 TO NCH−1
  SHIFT=C*128/NCH
  WT$=””
  FOR I=0 TO 128/NCH−1
   GOSUB @WAVE_FUNCTION
   WT$=WT$+HEX$(X,2)
   N=N+1
  NEXT
  W$(F,C)=”00”*SHIFT
  W$(F,C)=W$(F,C)+WT$
  W$(F,C)=W$(F,C)+”00”*(128−LEN(WT$)/2−SHIFT)
 NEXT
NEXT

@SET_INIT_FRAME
FOR C=0 TO NCH−1
 BGMPRG PATCH+C,127,127,127,127,W$(0,C)
NEXT
RETURN

@SET_MML
DIM M$(NCH)
T$=”T313”
N$=”B96&”
REP=FLOOR(NFRAME/2)−1
FOR C=0 TO NCH−1
 M$(C)=”:”+STR$(C)+”L96Q8O1@D15@V127V127”
 M$(C)=M$(C)+”@”+STR$(PATCH+C)
 P1$=N$*(C+1)+”$”+STR$(C)+”=1”+N$*(NCH−1−C)
 P2$=N$*(C+1)+”$”+STR$(C)+”=2”+N$*(NCH−1−C)
 M$(C)=M$(C)+P1$+P2$
 FOR R=REP TO 251 STEP −250
  M$(C)=M$(C)+”[”+P1$+P2$+”]”+STR$(250)
 NEXT
 M$(C)=M$(C)+”[”+P1$+P2$+”]”+STR$(R)
NEXT
RETURN

@PLAY_MML
BGMPLAY T$,M$(0),M$(1),M$(2),M$(3)
VSYNC 0
RETURN

@REPLACE_FRAME
DIM VPREV(NCH)
F=1
FOR UNTIL=0 TO 0 STEP 0
 ’VSYNC 1
 FOR C=0 TO 3
  V=BGMGETV(0,C)
  IF V>0 AND V!=VPREV(C) THEN:ELSE @ENDIF_RW
   BGMPRG PATCH+C,127,127,127,127,W$(F,C)
   VPREV(C)=V
   IF C==3 THEN F=F+1
  @ENDIF_RW
 NEXT
 UNTIL=(F>=NFRAME OR !BGMCHK(0))
NEXT
RETURN

}}

** DATA方式波形データ (OK_MOHO1 省略・コメント追加版)[#List_OK_MOHO1]
#basic{{
’======================
’ A wave for 8bitDA
’ (C) Oskar 2012.04.02
’======================

’ショウリャク (ナニ カイテモ カマワナイ)
END

@GET_WAVE
’サイセイ フレームスウ (サイコ゛マテ゛ナラ 9999)
’1フレーム=128サンフ゜ル
NFRAME=9999
GOSUB @READ_WAVE
RETURN

@WAVE_SAMPLES
’1モシ゛レツニ 32サンフ゜ル (32バイト=64モシ゛)
DATA 0001020202020201010000FEFEFEFEFEFEFF00010101010100FFFFFEFDFDFDFD
DATA FE0206090B0C0B080400FDFAF9F8F9FAFC0005090B0C0A08060301FFFEFCFDFD
DATA FD0711181D1C160D02F8EFE8E6E5EBF101223E52575143290DF4DFD4CFD2DBE3
DATA FE1B303C3A34251204F7F1EEECF0EEF6001C292A27200FFEEDE0D8D3D7D8E50A
’・・・
’ショウリャク (DATA フ゛ンヲ ス゛ラス゛ラ ナラヘ゛ル)
’・・・
’サイコ゛ハ カラモシ゛レツ
DATA ””
}}

** 計算方式波形データ (OK_SINE1 コメント追加版)[#List_OK_SINE1]
#basic{{
’========================
’ A sine wave for 8bitDA
’ (C) Oskar 2012.04.02
’========================

END

@GET_WAVE
’サイセイ フレームスウ
’1フレーム=128サンフ゜ル
NFRAME=50
GOSUB @CALC_WAVE
RETURN

@WAVE_FUNCTION
’マイカイ タ゛イニュウスルノハ ムタ゛タ゛カ゛ キニ シナイ
RATE=4000
FREQ=440
OMEGA=FREQ*2*PI()
’N:サンフ゜ル シ゛コク (ハ゛ンコ゛ウ 0−)
’X:サンフ゜ル シンフ゜ク (−128<=X<=127)
’シシャコ゛ニュウノ ホウカ゛ ヨイカ゛ キニ シナイ
X=127*SIN(OMEGA/RATE*N)
RETURN

}}

/////////////////////////////////
// コメントを募集したくないなら、ここから下は削除してください

* CHECKER FLAG (ひとことコメント) [#Comments]
この作品に対するコメントがあれば一言どうぞ。(作品に直接関係ない質問や雑談は[[掲示板>Board]]へ)
- ''hata0401'' : 嗚呼ー (&new{2012/07/21 (土) 22:00:08};)
- ''メルビル'' : すごいです!波形データはどうやって作るのですか? (&new{2012/08/26 (日) 01:13:36};)
- ''わぁぃ@'' : 圧縮した波形データを載せていいですか? (&new{2012/08/26 (日) 08:32:39};)
- ''メルビル'' : ↑見たいです (&new{2012/08/26 (日) 14:47:30};)

#comment

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