新しく発言する  EXIT  インデックスへ

WAV逆再生化


  WAV逆再生化 しばっち 2008/02/20 20:11:09  (修正2回)
  続き しばっち 2008/02/20 20:11:59  (修正2回)
  WAV2CSV しばっち 2008/03/02 22:13:11 
  │└続き しばっち 2008/03/02 22:14:07 
  CSV2WAV しばっち 2008/03/02 22:15:44 
   └続き しばっち 2008/03/02 22:16:32 

  WAV逆再生化 しばっち 2008/02/20 20:11:09  (修正2回)  ツリーへ
WAV逆再生化  返事を書く  ノートメニュー
しばっち <dihjvcfsyu> 2008/02/20 20:11:09 ** この記事は2回修正されてます
ご注意

全てのWAVファイルが読込めるわけではありません。
無圧縮(リニアPCM)形式のみです。
対応チャンクは"fmt ","data","fact"です。
それ以外の形式は読めません。
別途外部アプリケーション等必要です。
なお生成ファイルの動作保障はできません。自己責任でお願いします。


配列DATをいじると信号処理、エフェクト処理等ができそうです。

OPTION CHARACTER BYTE
DIM A$(30)
FILE GETNAME F$,"WAVファイル|*.WAV"
IF F$="" THEN STOP
OPEN #1:NAME F$,ACCESS INPUT
FOR I=1 TO 12
CHARACTER INPUT #1 : A$(I)
NEXT I
IF A$(1) & A$(2) & A$(3) & A$(4)<>"RIFF" THEN
PRINT "WAVファイルではありません"
CLOSE #1
STOP
END IF
LET WAVEFILESIZE=CVL(A$(5) & A$(6) & A$(7) & A$(8))
IF A$(9) & A$(10) & A$(11) & A$(12)<>"WAVE" THEN
PRINT "WAVファイルではありません"
CLOSE #1
STOP
END IF
DO
FOR I=1 TO 4
CHARACTER INPUT #1 : A$(I)
NEXT I
SELECT CASE A$(1) & A$(2) & A$(3) & A$(4)
CASE "fmt "
FOR I=1 TO 4
CHARACTER INPUT #1 : A$(I)
NEXT I
LET HEADERSIZE=CVL(A$(1) & A$(2) & A$(3) & A$(4))
FOR I=1 TO HEADERSIZE
CHARACTER INPUT #1 : A$(I)
NEXT I
LET WAVETYPE=CVI(A$(1) & A$(2))
IF WAVETYPE<>1 THEN
PRINT "対応していません"
CLOSE #1
STOP
END IF
LET CHANNEL=CVI(A$(3) & A$(4))
LET SAMPLINGFREQ=CVL(A$(5) & A$(6) & A$(7) & A$(8))
LET DATARATE=CVL(A$(9) & A$(10) & A$(11) & A$(12))
LET SAMPLESIZE=CVI(A$(13) & A$(14))
LET SAMPLEBIT=CVI(A$(15) & A$(16))
CASE "data"
FOR I=1 TO 4
CHARACTER INPUT #1 : A$(I)
NEXT I
LET PCMSIZE=CVL(A$(1) & A$(2) & A$(3) & A$(4))
LET SECOND=PCMSIZE/DATARATE
EXIT DO
CASE "fact"
FOR I=1 TO 8
CHARACTER INPUT #1 : A$(I)
NEXT I
!'LET SIZE=CVL(A$(1) & A$(2) & A$(3) & A$(4))
!'LET PCMSIZE=CVL(A$(5) & A$(6) & A$(7) & A$(8))
CASE ELSE
PRINT "対応していません"
CLOSE #1
STOP
END SELECT
LOOP
LET NUM=PCMSIZE/SAMPLESIZE
!'PRINT "サンプリング周波数";SAMPLINGFREQ;"Hz"
!'PRINT "サンプルビット数";SAMPLEBIT;"bit"
!'PRINT "チャンネル数";CHANNEL
!'PRINT "PCMデータサイズ";PCMSIZE;"byte"
!'PRINT "データ数";NUM
!'PRINT "演奏時間";SECOND;"秒"
DIM DAT(CHANNEL,NUM)
FOR K=1 TO NUM
FOR I=1 TO CHANNEL
LET B$=""
FOR J=1 TO SAMPLEBIT/8
CHARACTER INPUT #1 : L$
LET B$=B$ & L$
NEXT J
SELECT CASE SAMPLEBIT
CASE 8
LET C=ORD(B$)-128
CASE 16
LET C=CVI(B$)
!'CASE 24
!' LET C=CVM(B$)
!'CASE 32
!' LET C=CVL(B$)
CASE ELSE
PRINT "対応していません"
CLOSE #1
STOP
END SELECT
LET DAT(I,K)=C
NEXT I
NEXT K
CLOSE #1
  続き しばっち 2008/02/20 20:11:59  (修正2回)  ツリーへ
Re: WAV逆再生化  返事を書く  ノートメニュー
しばっち <dihjvcfsyu> 2008/02/20 20:11:59 ** この記事は2回修正されてます
続き

LET HEADERSIZE = 16
!'LET SAMPLESIZE = SAMPLEBIT / 8 * CHANNEL
!'LET DATARATE = SAMPLESIZE * SAMPLINGFREQ
!'LET PCMSIZE = NUM * SAMPLESIZE
!'LET WAVEFILESIZE = PCMSIZE + 36
INPUT PROMPT "SAVE FILENAME(.WAV)=":N$
IF POS(N$,".")=0 THEN LET N$=N$ & ".WAV"
OPEN #2:NAME N$,ACCESS OUTPUT
PRINT #2:"RIFF";
PRINT #2:MKL$(WAVEFILESIZE);
PRINT #2:"WAVEfmt ";
PRINT #2:MKL$(HEADERSIZE);
PRINT #2:MKI$(WAVETYPE);
PRINT #2:MKI$(CHANNEL);
PRINT #2:MKL$(SAMPLINGFREQ);
PRINT #2:MKL$(DATARATE);
PRINT #2:MKI$(SAMPLESIZE);
PRINT #2:MKI$(SAMPLEBIT);
PRINT #2:"data";
PRINT #2:MKL$(PCMSIZE);
FOR K=NUM TO 1 STEP -1
FOR I=1 TO CHANNEL
!'LET DAT(I,K)=MIN(2^(SAMPLEBIT-1)-1,MAX(-2^(SAMPLEBIT-1),INT(DAT(I,K))))
IF SAMPLEBIT=8 THEN LET E$=CHR$(DAT(I,K)+128)
IF SAMPLEBIT=16 THEN LET E$=MKI$(DAT(I,K))
!'IF SAMPLEBIT=24 THEN LET E$=MKM$(DAT(I,K))
!'IF SAMPLEBIT=32 THEN LET E$=MKL$(DAT(I,K))
PRINT #2:E$;
NEXT I
NEXT K
CLOSE #2
END

EXTERNAL FUNCTION CVI(A$)
OPTION CHARACTER BYTE
DECLARE NUMERIC A
LET A=ORD(A$(1:1))+ORD(A$(2:2))*256
IF A>32767 THEN LET A=A-65536
LET CVI=A
END FUNCTION

EXTERNAL FUNCTION CVM(A$)
OPTION CHARACTER BYTE
DECLARE NUMERIC A
LET A=ORD(A$(1:1))+ORD(A$(2:2))*256+ORD(A$(3:3))*256^2
IF A>2^23-1 THEN LET A=A-2^24
LET CVM=A
END FUNCTION

EXTERNAL FUNCTION CVL(A$)
OPTION CHARACTER BYTE
DECLARE NUMERIC A
LET A=ORD(A$(1:1))+ORD(A$(2:2))*256+ORD(A$(3:3))*256^2+ORD(A$(4:4))*256^3
IF A>=2^31-1 THEN LET A=A-2^32
LET CVL=A
END FUNCTION

EXTERNAL FUNCTION MKI$(X)
OPTION CHARACTER BYTE
DECLARE STRING A$,B$
LET A=INT(X)
IF A<0 THEN LET A=A+65536
LET A$=CHR$(MOD(A,256))
LET B$=CHR$(INT(A/256))
LET MKI$=A$ & B$
END FUNCTION

EXTERNAL FUNCTION MKM$(X)
OPTION CHARACTER BYTE
DECLARE STRING A$,B$,C$
LET A=INT(X)
IF A<0 THEN LET A=A+2^24
LET A$=CHR$(MOD(A,256))
LET B$=CHR$(MOD(INT(A/256),256))
LET C$=CHR$(MOD(INT(A/65536),256))
LET MKM$=A$ & B$ & C$
END FUNCTION

EXTERNAL FUNCTION MKL$(X)
OPTION CHARACTER BYTE
DECLARE STRING A$,B$,C$,D$
LET A=INT(X)
IF A<0 THEN LET A=A+2^32
LET A$=CHR$(MOD(A,256))
LET B$=CHR$(MOD(INT(A/256),256))
LET C$=CHR$(MOD(INT(A/65536),256))
LET D$=CHR$(MOD(INT(A/16777216),256))
LET MKL$=A$ & B$ & C$ & D$
END FUNCTION
  WAV2CSV しばっち 2008/03/02 22:13:11   ツリーへ
Re: WAV逆再生化  返事を書く  ノートメニュー
しばっち <dihjvcfsyu> 2008/03/02 22:13:11
WAV2CSV

エクセルで読めるCSVファイルに変換します


OPTION CHARACTER BYTE
FILE GETNAME F$,"WAVファイル|*.WAV"
IF F$="" THEN STOP
OPEN #1:NAME F$
LET A$=""
FOR I=1 TO 12
CHARACTER INPUT #1 : X$
LET A$=A$ & X$
NEXT I
IF A$(1:4)<>"RIFF" THEN
PRINT "WAVファイルではありません"
CLOSE #1
STOP
END IF
LET WAVEFILESIZE=CVL(A$(5:8))
IF A$(9:12)<>"WAVE" THEN
PRINT "WAVファイルではありません"
CLOSE #1
STOP
END IF
DO
LET A$=""
FOR I=1 TO 4
CHARACTER INPUT #1 : X$
LET A$=A$ & X$
NEXT I
SELECT CASE A$(1:4)
CASE "fmt "
LET A$=""
FOR I=1 TO 4
CHARACTER INPUT #1 : X$
LET A$=A$ & X$
NEXT I
LET HEADERSIZE=CVL(A$(1:4))
LET A$=""
FOR I=1 TO HEADERSIZE
CHARACTER INPUT #1 : X$
LET A$=A$ & X$
NEXT I
LET WAVETYPE=CVI(A$(1:2))
IF WAVETYPE<>1 THEN
PRINT "対応していません"
CLOSE #1
STOP
END IF
LET CHANNEL=CVI(A$(3:4))
LET SAMPLINGFREQ=CVL(A$(5:8))
LET DATARATE=CVL(A$(9:12))
LET SAMPLESIZE=CVI(A$(13:14))
LET SAMPLEBIT=CVI(A$(15:16))
CASE "data"
LET A$=""
FOR I=1 TO 4
CHARACTER INPUT #1 : X$
LET A$=A$ & X$
NEXT I
LET PCMSIZE=CVL(A$(1:4))
LET SECOND=PCMSIZE/DATARATE
LET NUM=INT(SAMPLINGFREQ*SECOND)
EXIT DO
CASE "fact"
LET A$=""
FOR I=1 TO 8
CHARACTER INPUT #1 : X$
LET A$=A$ & X$
NEXT I
LET SIZE=CVL(A$(1:4))
LET SAMPLE=CVL(A$(5:8))
CASE ELSE
PRINT "対応していません"
CLOSE #1
STOP
END SELECT
LOOP
INPUT PROMPT "SAVE FILENAME(.CSV)=":N$
IF POS(N$,".")=0 THEN LET N$=N$ & ".CSV"
OPEN #2:NAME N$,ACCESS OUTPUT
PRINT #2:"サンプリング周波数,";STR$(SAMPLINGFREQ)
PRINT #2:"サンプルビット数,";STR$(SAMPLEBIT)
PRINT #2:"チャンネル数,";STR$(CHANNEL)
PRINT #2
PRINT #2:"No.,";
SELECT CASE CHANNEL
CASE 1
PRINT #2:"モノラル"
CASE 2
PRINT #2:"左チャンネル,右チャンネル"
CASE 3
PRINT #2:"左チャンネル,右チャンネル,中央チャンネル"
CASE 4
PRINT #2:"左チャンネル,中央チャンネル,右チャンネル,サラウンド"
CASE ELSE
FOR I=1 TO CHANNEL-1
PRINT #2:CHR$(34);"チャンネル";I;CHR$(34);",";
NEXT I
PRINT #2:CHR$(34);"チャンネル";CHANNEL;CHR$(34)
END SELECT
FOR K=1 TO NUM
PRINT #2:STR$(K); !'行ナンバー
FOR I=1 TO CHANNEL
LET B$=""
FOR J=1 TO SAMPLEBIT/8
CHARACTER INPUT #1 : L$
LET B$=B$ & L$
NEXT J
IF SAMPLEBIT=8 THEN LET C=ORD(B$)-128
IF SAMPLEBIT=16 THEN LET C=CVI(B$)
PRINT #2:",";STR$(C); !'PCMデータ
NEXT I
PRINT #2
NEXT K
CLOSE #1
CLOSE #2
END
  │└続き しばっち 2008/03/02 22:14:07   ツリーへ
Re: WAV2CSV  返事を書く  ノートメニュー
しばっち <dihjvcfsyu> 2008/03/02 22:14:07
続き

EXTERNAL FUNCTION CVI(A$)
OPTION CHARACTER BYTE
DECLARE NUMERIC A
LET A=ORD(A$(1:1))+ORD(A$(2:2))*256
IF A>32767 THEN LET A=A-65536
LET CVI=A
END FUNCTION

EXTERNAL FUNCTION CVL(A$)
OPTION CHARACTER BYTE
DECLARE NUMERIC A
LET A=ORD(A$(1:1))+ORD(A$(2:2))*256+ORD(A$(3:3))*256^2+ORD(A$(4:4))*256^3
IF A>=2^31-1 THEN LET A=A-2^32
LET CVL=A
END FUNCTION

EXTERNAL FUNCTION MKI$(X)
OPTION CHARACTER BYTE
DECLARE STRING A$,B$
LET A=INT(X)
IF A<0 THEN LET A=A+65536
LET A$=CHR$(MOD(A,256))
LET B$=CHR$(INT(A/256))
LET MKI$=A$ & B$
END FUNCTION

EXTERNAL FUNCTION MKL$(A)
OPTION CHARACTER BYTE
DECLARE STRING A$,B$,C$,D$
IF A<0 THEN LET A=A+2^32
LET A$=CHR$(MOD(A,256))
LET B$=CHR$(MOD(INT(A/256),256))
LET C$=CHR$(MOD(INT(A/65536),256))
LET D$=CHR$(MOD(INT(A/16777216),256))
LET MKL$=A$ & B$ & C$ & D$
END FUNCTION
  CSV2WAV しばっち 2008/03/02 22:15:44   ツリーへ
Re: WAV逆再生化  返事を書く  ノートメニュー
しばっち <dihjvcfsyu> 2008/03/02 22:15:44
CSV2WAV

CSVファイルをWAVファイルに変換します。
サンプリング周波数、サンプルビット数、チャンネル数、行ナンバー、PCMデータ
以外に数値を書き込まないでください。(文字は読み飛ばす)

FUNCTION READFILE$
OPTION CHARACTER BYTE
LET S$=""
DO
SET #1 : IF MISSING THEN EXIT DO
CHARACTER INPUT #1: D$
IF D$=CHR$(34) THEN
LET D$=""
DO
LET S$=S$ & D$
CHARACTER INPUT #1: D$
LOOP WHILE D$<>CHR$(34)
CHARACTER INPUT #1: D$ !' "," OR CHR$(13)
IF D$=CHR$(13) THEN CHARACTER INPUT #1: DD$ !' CR+LF
LET READFILE$=S$
EXIT FUNCTION
END IF
IF D$<>" " AND D$<>"," AND D$<>CHR$(13) THEN LET S$=S$ & D$
LOOP WHILE D$<>" " AND D$<>"," AND D$<>CHR$(13)
IF D$=CHR$(13) THEN CHARACTER INPUT #1: DD$ !' CR+LF
LET READFILE$=S$
END FUNCTION

LET MAXLEVEL=65536
FILE GETNAME N$, "CSVファイル|*.CSV"
IF N$="" THEN STOP
OPEN #1:NAME N$,ACCESS INPUT
DO
LET D$=READFILE$
LOOP WHILE ISNUMBER(D$)=0 !'文字は無視
LET SAMPLINGFREQ=VAL(D$) !'サンプリング周波数
DO
LET D$=READFILE$
LOOP WHILE ISNUMBER(D$)=0 !'文字は無視
LET SAMPLEBIT=VAL(D$) !'サンプルビット数
DO
LET D$=READFILE$
LOOP WHILE ISNUMBER(D$)=0 !'文字は無視
LET CHANNEL=VAL(D$) !'チャンネル数
DIM DAT(CHANNEL,MAXLEVEL)
DO
SET #1 : IF MISSING THEN EXIT DO
DO
LET NUM$=READFILE$ !'行ナンバー
LOOP WHILE ISNUMBER(NUM$)=0 !'文字は無視
FOR I=1 TO CHANNEL
DO
SET #1 : IF MISSING THEN EXIT DO
LET D$=READFILE$ !' PCMデータ
LOOP WHILE ISNUMBER(D$)=0 !'文字は無視
LET NUM=NUM+1
LET DAT(I,NUM)=VAL(D$)
LET LMIN=MIN(LMIN,DAT(I,NUM))
LET LMAX=MAX(LMAX,DAT(I,NUM))
IF NUM>=MAXLEVEL THEN EXIT DO
NEXT I
LOOP
CLOSE #1
PRINT "サンプリング周波数";SAMPLINGFREQ;"Hz"
PRINT "サンプルビット数";SAMPLEBIT;"ビット"
PRINT "チャンネル数";CHANNEL
PRINT "データ数";NUM
INPUT PROMPT "SAVE FILENAME(.WAV)=":F$
IF POS(F$,".")=0 THEN LET F$=F$ & ".WAV"
OPEN #1:NAME F$
LET SAMPLESIZE = SAMPLEBIT / 8 * CHANNEL
LET DATARATE = SAMPLESIZE * SAMPLINGFREQ
LET PCMSIZE = NUM * SAMPLESIZE
LET WAVEFILESIZE = PCMSIZE + 36
PRINT #1:"RIFF";
PRINT #1:MKL$(WAVEFILESIZE);
PRINT #1:"WAVEfmt ";
PRINT #1:MKL$(16);
PRINT #1:MKI$(1);
PRINT #1:MKI$(CHANNEL);
PRINT #1:MKL$(SAMPLINGFREQ);
PRINT #1:MKL$(DATARATE);
PRINT #1:MKI$(SAMPLESIZE);
PRINT #1:MKI$(SAMPLEBIT);
PRINT #1:"data";
PRINT #1:MKL$(PCMSIZE);
FOR K=1 TO NUM
FOR I=1 TO CHANNEL
LET DAT(I,K)=MIN(2^(SAMPLEBIT-1)-1,MAX(-2^(SAMPLEBIT-1),INT(DAT(I,K))))
SELECT CASE SAMPLEBIT
CASE 8
LET E$=CHR$(DAT(I,K)+128)
CASE 16
LET E$=MKI$(DAT(I,K))
END SELECT
PRINT #1:E$;
NEXT I
NEXT K
CLOSE #1
END
   └続き しばっち 2008/03/02 22:16:32   ツリーへ
Re: CSV2WAV  返事を書く  ノートメニュー
しばっち <dihjvcfsyu> 2008/03/02 22:16:32
続き

EXTERNAL FUNCTION MKI$(X)
OPTION CHARACTER BYTE
DECLARE STRING A$,B$
LET A=INT(X)
IF A<0 THEN LET A=A+65536
LET A$=CHR$(MOD(A,256))
LET B$=CHR$(INT(A/256))
LET MKI$=A$ & B$
END FUNCTION

EXTERNAL FUNCTION MKL$(X)
OPTION CHARACTER BYTE
DECLARE STRING A$,B$,C$,D$
LET A=INT(X)
IF A<0 THEN LET A=A+2^32
LET A$=CHR$(MOD(A,256))
LET B$=CHR$(MOD(INT(A/256),256))
LET C$=CHR$(MOD(INT(A/65536),256))
LET D$=CHR$(MOD(INT(A/16777216),256))
LET MKL$=A$ & B$ & C$ & D$
END FUNCTION

EXTERNAL FUNCTION ISNUMBER(A$)
WHEN EXCEPTION IN
LET X=VAL(A$)
LET ISNUMBER=-1
USE
LET ISNUMBER=0
END WHEN
END FUNCTION

 インデックスへ  EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。