最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

【BanGDream】用綠條畫波形圖

2023-08-17 14:26 作者:小鳥鋼絲  | 我要投稿

前段時間我發(fā)布了一個整活譜子:【邦邦自制譜】《為什么要演奏?》毫秒級采音,評論區(qū)里有人想要生成譜面的py文件,于是我來整體介紹一下寫法。

首先我們要做的是音頻處理,推薦使用ffmpeg命令、audition軟件等進(jìn)行處理。我們的目標(biāo)是將音頻文件轉(zhuǎn)換為wav格式,安裝ffmpeg之后可以用ffmpeg的這個命令完成從mp3格式到wav格式的轉(zhuǎn)換:

音頻截取也可以用ffmpeg完成:

當(dāng)然,音頻重采樣、再編碼都可以利用ffmpeg完成,具體方法可自行百度。

另外,要注意選取音頻的時候留好一定量的余量,比如前后各插入一段靜音以防開始時直接綠條懟臉,使用audition、goldwave等音頻處理軟件可以很方便地插入靜音。

如果是要對歌曲中的念白、kick等進(jìn)行采樣,建議先分離人聲、伴奏、鼓點(diǎn)等,保留對應(yīng)的wav文件,記下要轉(zhuǎn)換段落的起止時間。

下一步需要依賴的庫(相信大家都會安裝python了吧)。我們需要numpy和wave兩個庫文件,可用pip進(jìn)行安裝。

安裝完畢后就可以開始愉快寫碼了,為了方便,我們把wav文件和py文件放在同一個文件夾中。首先import上述兩個庫:

然后開文件,讀入你準(zhǔn)備好的wav文件:

這里我們可以先運(yùn)行一遍py文件來獲得參數(shù),比如我這里的soyo.wav有46秒,其中前兩秒和最后兩秒是我添加的靜音。print出來的音頻參數(shù)如下:

這表明該音頻是單聲道的、采樣字節(jié)數(shù)為2字節(jié)(16位)、采樣頻率16000Hz,總共有737792個采樣點(diǎn)。

接下來,由于bestdori譜面的時間是用beat(節(jié)拍數(shù))來表示的,我們需要將時間點(diǎn)轉(zhuǎn)換為beat:

BPM(beat per minute,每分鐘拍數(shù))代表音樂每分鐘有多少拍,簡單理解BPM越高則音樂越快。這一步我們需要知道樂曲的bpm,可以使用BpmAnalyzer這個軟件很方便地測得樂曲的BPM。這里因為我用的并不是一段音樂而是音頻,所以測出來的bpm也只是為了時間同步而已。為了方便,我們再求出每秒鐘的拍數(shù)bps,于是此時將時間點(diǎn)序列(以秒為單位)各乘以bps則得到beat序列。

之后,我們定義一下開始和結(jié)束的時間坐標(biāo)、beat坐標(biāo)、采樣點(diǎn)坐標(biāo):

接下來就可以開始生成譜面文件啦。

不過在此之前先簡單介紹一下bestdori制譜的基本語法。

bestdori譜面最外層用中括號[ ]括起來,每一個對象(如BPM對象、note、綠條等)都用大括號{ }括起來,對象之間用半角逗號(,)隔開。我們先來了解一下各種對象:

各種對象

首先是BPM,每個譜面都至少要有一個BPM對象,在它后面的譜面都為這一BPM。表現(xiàn)為一條紫紅色的標(biāo)有BPM數(shù)值的實線。新建譜面會帶有一個默認(rèn)位于beat 0處的bpm為120的BPM對象,如下:

我們可以通過修改"bpm"參數(shù)的值來改變bpm。譜面上橫實線即為節(jié)拍線,一條代表一拍。bpm越高,節(jié)拍線越密。虛線是1/n節(jié)拍線(默認(rèn)是1/4,可改),在不動代碼的情況下,note只能放在這些線上。

其次是note:如上圖,在1/4拍有兩個單鍵、1/2拍上有一個單鍵和一個滑鍵。

可以看到,一個單鍵("type":"Single")有兩個必填參數(shù):"lane"表示軌道數(shù),邦邦有7個軌道,編號從左到右為從0到6,在不改代碼的情況下只能為整數(shù),但是我們可以通過修改代碼來將note放在非整數(shù)軌道上(雖然這樣做會導(dǎo)致無法上傳譜面);"beat"表示節(jié)拍數(shù),其實是note在鋪面上的位置。此外,"skill"屬性設(shè)置為true會變成黃色的技能鍵,"flick"屬性設(shè)置為true會變成粉色滑鍵。注意:譜面代碼各對象之間是無序的(實際上應(yīng)該是按照你放置對象的順序),也就是說調(diào)整上述幾句代碼的順序并不會改變譜面。

對于橫滑鍵,"type"為"Directional",除了"lane","beat"兩個參數(shù)之外,還有"direction"控制方向(左右)、"width"控制橫滑鍵寬度(1~3,修改代碼可以>=3)。

接下來是比較重要的綠條("type":"Slide")。

后面的參數(shù)"connections"接受一個對象列表(以中括號[ ]括起),里面是綠條的各節(jié)點(diǎn)。各節(jié)點(diǎn)都有"beat"和"lane"兩個參數(shù),用大括號{ }括起。各節(jié)點(diǎn)都可以添加"hidden"參數(shù),若設(shè)置為true,則該節(jié)點(diǎn)隱藏,表現(xiàn)為上圖中右邊綠條拐彎處沒有節(jié)點(diǎn)的情況。這里要注意的是:1)頭判節(jié)點(diǎn)和尾判節(jié)點(diǎn)不會被隱藏(即使"hidden"設(shè)為true也不會被隱藏),且要放在整數(shù)軌上。2)中間節(jié)點(diǎn)可以放在非整數(shù)軌上,但是必須隱藏,否則無法上傳。3)節(jié)點(diǎn)不可以超界("lane"<0或>6),否則無法上傳。

有了上述譜面代碼知識,我們就可以開始生成譜面了。

我們用with open() as ... 來創(chuàng)建一個txt文件(這里是'soyo_chart.txt'),'w'表示覆寫模式,若'soyo_chart.txt'存在則每次都會覆蓋該txt文件中的內(nèi)容;若不存在則新建一個名稱為'soyo_chart.txt'的文件。用with open() as ...?的方式打開文件可以避免寫close,程序段結(jié)束后會自動關(guān)閉文件。

注意中間的降采樣步長可以自行設(shè)定,step越小,則保留的采樣越多,波形就越精細(xì)。由于這里我原有的wav文件46秒含有737792個采樣,去掉32000*4個靜音采樣之后還有609792個采樣,這樣生成出來的代碼如果粘貼到bestdori的話會直接卡死,只能清除網(wǎng)站緩存,別問我怎么知道的(*警告:在粘貼前如果已經(jīng)有鋪面代碼,請保存好備份,以防卡死恢復(fù)后丟失)。所以我們降采樣,每50個采樣取一個,這樣大約只保留了一萬多個節(jié)點(diǎn),親測一萬個節(jié)點(diǎn)不會徹底卡死(但會卡一會兒)。

由于我們的波形生成的綠條大部分集中在2至4軌,為了使鋪面更有表現(xiàn)力,我們可以適當(dāng)將w放大3倍以上,即chart=w*4+3等,但這樣要注意可能會有超界的節(jié)點(diǎn),要注意削波處理。(如果已知頭尾節(jié)點(diǎn)不會超界也可不做頭尾的削波處理)

運(yùn)行以上py文件,恭喜你,你就得到了用綠條畫出來的波形圖譜面了。把譜面代碼粘貼到bestdori中,就可以看到波形圖啦!快來試試吧!

-END-


【BanGDream】用綠條畫波形圖的評論 (共 條)

分享到微博請遵守國家法律
乌拉特前旗| 紫阳县| 江安县| 长武县| 柞水县| 凭祥市| 航空| 和顺县| 迁安市| 桃园县| 略阳县| 固安县| 德昌县| 南川市| 广水市| 随州市| 绥棱县| 莱西市| 宁化县| 巴彦淖尔市| 丽江市| 万宁市| 灵川县| 东山县| 郑州市| 晋中市| 桑日县| 高台县| 自治县| 金阳县| 灌南县| 宝丰县| 广平县| 汕尾市| 会泽县| 葵青区| 定兴县| 滨州市| 左贡县| 综艺| 迁安市|