創作內容

2 GP

10/22~24,藉由網頁檔來讓.wav檔產生波形(固定音高)與和弦,若能去除雜訊就算成功了

作者:李兒諳│2018-10-22 17:43:27│巴幣:4│人氣:304
目前,產生和弦成功,但有些爆音與雜訊
除此之外還需要的檔案是do.wav,do1.wav,do2.wav

因為產生的固定頻率個人不太喜歡
所以還是用MIDI轉成.wav的檔案來進行和弦這樣!!

----------------10/22----------------------
不過這正弦波的頻率是多少?
還要計算!!
我先休息下,寫篇巴哈文章─"未來展望"再繼續

嗯,要怎麼算呢?
再回去翻那篇文章好了

配合.wav檔案格式
我用的修改主檔案temp1.wav
取樣率是 44AC0000
因為是採Little endian
因此是取樣率 0000AC44 也就是44100(2聲道、44100取樣率是CD音質)
代表每秒取樣44100次
那temp1.wav
每秒平均0002B110,也就是176400 Bytes
其實這邊176400/44100,就知道一次是取4個bytes了
但還是照著.wav檔規格,配合Hex Editor看temp1.wav的內容吧
每次取樣是16個bits (2個bytes)

那為何之前計算出一次取4個bytes?
原因是
我們是雙聲道,因此一個聲道取2個bytes,一次取樣總共是4個bytes這沒問題!!

嗯,那接下來要怎麼算我再想想
頻率應該是 次數/時間
時間是以1秒為單位

所以說...
應該是看1秒產生幾個波就知道頻率了吧!!
那程式要怎麼寫呢?
我還在思考中

現在精神渙散
先不計算
若直接套用StackOverflow程式的話

var sampleFrequency = 44100;
        var multiplier = 2.0 * Math.PI / sampleFrequency;
        var volume = 12;
        
        for(var i=76;i<data.target.result.byteLength;i++)
        {
            dv.setInt8(i,128);
        }
        
        console.log(dv.getInt8(0)+volume * Math.sin(i * multiplier * 440.0));
        
        for(var i=76;i<data.target.result.byteLength;i++)
        {
            dv.setInt8(i,dv.getInt8(i)+volume * Math.sin(i * multiplier * 440.0));
        }

理論上應該是440Hz
但我用AmazingMIDI轉檔測試的結果是1760Hz
也就是高兩個八度
可能是因為我的取樣率是44100,是11025的四倍(又在想是不是雙聲道問題)
所以算式要改吧!!

我想下怎麼改再測試下!!

啊,不是雙聲道問題
1760Hz確實是440Hz的4倍
不過若把
var multiplier = 2.0 * Math.PI / sampleFrequency;
改成
var multiplier = 8.0 * Math.PI / sampleFrequency;

聽起來的結果也不像440Hz
也許是這邊也要改吧
dv.setInt8(i,dv.getInt8(i)+volume * Math.sin(i * multiplier * 440.0));

嗯...
這樣改就行了
我是沒想清楚為何要這樣改
因為理論上2PI弳才是一圈啊
雖然是在取樣率11025的時候才2PI弳

var sampleFrequency = 44100;
        var multiplier = 0.5 * Math.PI / sampleFrequency;
        var volume = 12;
        
        for(var i=76;i<data.target.result.byteLength;i++)
        {
            dv.setInt8(i,128);
        }
        
        for(var i=76;i<data.target.result.byteLength;i++)
        {
            dv.setInt8(i,dv.getInt8(i)+volume * Math.sin(i * multiplier * 440.0));
        }

聽起來就像La第四個八度 (440Hz理論上是La的第四個八度)多了
雖然還是跟振盪器產生的聲音不同

不過這樣還算可以接受啦!!
(嗯,聲音為何會不同呢?我想到原因是我的正弦波沒振盪器的標準這樣!!)
明天再處理任意音符的和弦
其實和弦照著StackOverflow上那篇疊加上去即可
只是我目前還不太清楚要怎麼處理La以外的音
(理論上若不知道Hz,要開12次方根來乘
效果不確定好不好)

(嗯,波形太純粹的聲音感覺真的不太好聽!!)

-------------10/23-------------------
想了一陣子
還是不知道為何聲音跟振盪器的不同
算了,反正我也不是要用振盪器的聲音
但是知道為何分母是四倍,不能把分子乘四倍解決的原因了

頻率是 次數/時間
取樣率代表是一秒鐘取樣幾次
var sampleFrequency = 44100;
var multiplier = 2.0 * Math.PI / sampleFrequency;
var volume = 12;
        
        for(var i=76;i<data.target.result.byteLength;i++)
        {
            dv.setInt8(i,128);
        }
        
        for(var i=76;i<data.target.result.byteLength;i++)
        {
            dv.setInt8(i,dv.getInt8(i)+volume * Math.sin(i * multiplier * 440.0));
        }
這麼寫的問題出在哪邊呢?

2 pi弳是轉一圈
每秒取樣44100次
也就是說在44100次時完成轉一圈的動作
可是這麼寫能成立的前提是在44100時真的是轉一圈
而實際上我用的.wav檔
是雙聲道,然後每次取樣的是採16bits(2個bytes)
因此分母應該是 44100*2(雙聲道)*2(取樣用2個bytes)
這個值其實就是.wav檔的 每秒平均區塊大小
也就是 1C(28,第29)個位元組開始取四個bytes的資料,儲存採Little Endian

因為後面的迴圈程式其實就是把每個取樣的值都跑計算過一次
因此可以推斷出 multiplier應該是 2PI弳 / 每秒的取樣位元組數量
這邊我把程式碼修正後再貼上來

那現在開始處理和弦
勉強算成功
勉強是因為
覺得後面的尾部本該是音量降低的部份被放大了,導致有些雜音跟爆音的感覺
也就是說目前若拿來實際運用的話是有隱憂的

和弦主要的難點是在於,如何在不用檔案上傳的情況下
取得音樂檔
(不然三和弦要傳三個音樂檔,五和弦五個,七和弦七個,一首有可能有許多不同的和弦)
jQuery提供能拿到現成的大多是文字檔
因此還是得用AJAX的XHR來做
大概就這樣

----------------10/24------------------------
估計是比對do.wav,do1.wav,do2.wav,do-3.wav還有產生出來的和弦的wav檔
看要怎麼消除雜訊跟爆音

這方面叫做混音(mix)
但試了幾個混音演算法
我覺得效果都不好(也許是我試錯)
感覺會有不可避免的雜訊
因此就用應急的手法抑制下
(超過時間點就調成靜音,會溢位的用最大值或最小值取代)
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4169993
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:wav|.wav|wav檔製作|音高製作|和弦|和聲|正弦波

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

2喜歡★y541258 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:10/21,已完成動畫背... 後一篇:2018/10/22起的...

追蹤私訊切換新版閱覽

作品資料夾

happy545晚上好~
大掃除第十一天結束休息中看更多我要大聲說昨天19:42


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】