創作內容

2 GP

11/15,更新,有安裝MuseScroe,格式可選MIDI了,極簡易版自動作曲(音階純隨機)-視窗版(C♯)

作者:李兒諳│2015-11-15 14:51:45│巴幣:4│人氣:419
http://1drv.ms/1Lgaq2m
.zip檔是C#專案檔 .cs是重點程式檔
理論上應該.exe就能用了,然後應該會有儲存上次設定的功能
(作曲檔名與亂數種子沒有儲存上次的設計,避免重複作相同的曲)

---------------------------------------------------------------------------------
22:00更新(約花了10分鐘修正個程式錯誤):
檔名後面有_support_midi的
是原始檔案格式可選MIDI的版本
預設是.xml,要在檔案類型那邊選.mid
不過選擇.mid後,最下面那個文字方塊的內容路徑必須正確

早上的那個版本
我現在才發現我把路徑寫死在程式碼中了
所以早上那版是錯誤的
早上那版我將檔案刪得只剩.cs檔
避免日後用到
也算是當作修正前跟修正後的參考
(雖然修正後還是只有局部修正
我果然還是不太想對人為輸入錯誤做太多檢查與耗費心力
若沒再發現重大錯誤的話
這應該是極簡易自動作曲程式最後一版)

-----------------------------------------------------------------------------------

我這程式只有做些簡易的輸入檢查
不會造成程式致命錯誤
但出來結果可能不如預期的狀況
我就沒做文字提示了(雖然也有可能我疏忽沒檢查的地方啦)
要產生MIDI檔要配合MuseScore這套軟體
並把正確的路徑
(某資料夾底下,像Program Files (x86)的MuseScore/bin)設定好
並勾選產生MIDI檔,才能做出MIDI檔(.mid有時可能會晚幾秒出現)

我之所以寫視窗應用程式版
就是希望使用者只需要.exe就好了
不過要是.exe使用上有問題的話
還是解壓縮原始專案檔
並安裝Visual Studio Express(免費版)重新編譯看看吧
此外目前程式沒有調整隨機純八度與音軌範圍設計
應該還是得開原始專案檔來自行修改
(音軌範圍其實找<part id="P1">之類的照抄到</part>
就可以保留哪些音軌不做隨機變動了
但若設計那功能的話,多少得知道哪音軌大概是做什麼的
這會有樂器對應碼的問題,樂器的種類還蠻細的
設計上會有些麻煩
(因為我不知道樂器對應碼要去哪找
Anvil Studio是有列,但不確定完不完整
而且就算完整,好像也不能複製貼上,手工打不太實際)
此外麻煩還有像是應用程式畫面要怎麼呈現
或者說呈現方法很多
不過感覺有些耗時所以不太想做
做了之後測試也有些累)

儲存上次設定實作上不算難
但我那是用Visual Studio內建功能
所以不用寫config.ini之類的也可以完成
那功能就是Application Settings
網路上好像也有中文相關資料
可參閱https://msdn.microsoft.com/en-us/library/aa730869(v=vs.80).aspx
由於那網頁的範例畫面有些過時
就補充說明下

透過畫面紅框來調即可
雖然還有新增變數跟設定預設值
(變數隨意新增即可,若要做細部調整可以開方案總管的App.config)
但我想那設計還蠻簡明的就偷懶下
節省網路儲存空間資源

寫了兩個小時,除錯花了一個小時
就一開始忘記pathstring前要加@
不然字串內容會不對
由於命令提示字元視窗是隱藏的(雖然也可以調出來)
所以錯誤較不好發現
然後就是不知為何有個勾勾跟文字方塊的關聯一直對不起來
所以我最後把文字方塊的Enabled屬性
也套用Application Settings(應用程式設定)解決

我寫程式通常不太改textbox、button等名稱
因為我寫的程式通常蠻簡單的
想名字有些麻煩與覺得似乎不太必要
若看不順眼的話,可以透過畫面屬性設定調
或者是在程式碼,反白checkBox1類似的
右鍵→重構→重新命名也可以全部一次調好

C#雖然也算物件導向語言
但我純採取命令式或者說程序式寫法
理由同上
我感覺不出我的程式
有需要整理成物件形式來方便其它程式片段或程式檔來呼叫
就這麼寫了

有用到OpenFileDialog跟FileBrowserDialog
只是畫面上沒拉而已
直接在程式宣告並使用
(我印象中就算拖曳了基本上寫的程式碼還是類似的)

-----------------------以下正題-----------------------
好的,極簡易版自動作曲我就打算這樣撒手人寰
因為純隨機,而且音符時值是抄襲原曲的
(雖然個人有想了一陣子
覺得時值與音高相比,我想時值應該是比較重要的
時值跟音樂演奏速度概念不太相同
一首歌用1.25倍,1.5倍,2倍之類的來聽
基本上不影響時值
MIDI是可以調整相關資訊的
雖然目前個人還不清楚具體要在哪邊調
感覺人對音高的敏銳度,較對時值來得低)
這對技術上來說不難
討論價值不高
不過可以藉那個當基礎
來對未來做非完全隨機作曲程式設計的基石
牽扯到時值隨機設計的難度就會跳一截
如果我寫得出來的話,難度就是跳一小截
我寫不出來的話就不知道了(雖然那對個人來說就是一大截)

我希望寫出的自動作曲
不要求能隨機出名曲或流行音樂
但至少要能產生我夢到的那兩個片段
雖然我覺得能隨機到我夢的那兩個片段
其實跟隨機出名曲跟流行音樂也差不多了
(可參考底下OneDrive裡面兩個夢開頭的MIDI檔,沒歌詞的時值沒調好)
http://1drv.ms/1NqN4eu
而要做到那程度的話
我想可能得分析或整理下現有的歌曲
雖然更準確的說是,我所能猜出或近似得到的譜
整理出規則並想出對應的程式
不過這類程式老實說...
我記得我過往是沒寫過
可能會碰上些阻礙病卡很久
若有資源的話,還可以配合資料庫與人工智慧
不過相關的我估計我應該是不會
再來就是目前的曲目可能還不夠建資料庫(內容有些少)
而且如果我能決定的話
我會只想讓個人喜歡聽的歌進資料庫
(個人喜歡聽的但自己猜不出譜的也多的是
猜出的大多有些誤差可能也不太滿意)
要排除的歌應該多的不得了

未來就朝那方向努力吧
不過我中間可能有時會夾雜遊戲設計或圖像處理的
只是圖像設計應該是基於二元檔的
應該不太可能像音樂檔還可以轉成XML格式(或json那種程式較好寫的)
雖然我是知道有種圖檔概念比較簡單
但支援那種圖檔的軟體是很少的
因此能的話就直接以.bmp來做吧
(.jpg或.png應該是比較複雜的,但.png有alpha通道,似乎較有投資研究價值)

如果我研究圖檔處理的話
大概會先挑提取輪廓下手吧
(理想效果是種盜圖盜到線稿的感覺)
雖然具體想法還沒明確到足以轉成程式
上網查了下資料
好像已經有些相關演算法了
但具體運作情形與難處還不是很清楚
(老實說我覺得光搞清楚檔案格式修改圖檔就蠻難的了)

其實以後音樂或音效、語音檔應該也要朝.mp3或.ogg來研究
(我記得.mp3跟.ogg都是用心理聲學壓縮
也就是去掉常人聽不到的頻率(破壞性壓縮)
但.mp3要付權利金,而.ogg不用,雖然我不知道是誰要付款就是了
也可能我的資訊過時很久了也說不定)
哦,這麼說來若以.wav為研究對象應該也是可行的
反正多媒體檔案基本上二元檔(binary file)居多
現在以文字檔形式來研究算是權宜之計
(權宜什麼,就個人對檔案格式不熟與本身的程式技術力)
嗯,那這篇大概就這樣

呀!總是在想,要是有人蒐集像我這類可實作文章
類似新聞網站的更新頻率
(雖然若實作過程麻煩的話,久久更新應該也是可以的)
感覺似乎還算有看頭、有些價值
(其實以市面上常見的程式設計基礎書的水平來看
簡單來說就是書的內容是由一堆技術文件就能查到的東西所組成的
我隱約覺得以我自己現有成果也能出書
至少不是仿作跟超常見程式設計題目
還算有些個人的東西或說創見吧!!)
不過我想實際上我看到較不感興趣的實作方向、題目也許就不看了吧!!

(美術相關的實作文章與實況影片較多
但個人線條要照著畫出差不多的也有困難
所以大概只能學AutoCAD一類用指令的)

-------------------------------------------------------------
啊,忘記說了
沒做純八度的範圍修改設計
是因為我記得Visual Studio系列的陣列大小
得在編譯時期就決定
(以前寫Visual C++的印象
雖然Dev-C++在編譯時沒給陣列大小也可以
但也不知道祂的程式是否是在編譯時期給個預設最大的記憶體空間)
所以寫C#時,我連試都沒試
(標題寫C♯僅是應下自動作曲的景,升記號♯是`u266F)
此外想早點進入自動作曲的重點
像:隨機較有規則的音階
目前想到的就像
不管是主歌還是副歌
形式大多都是一段一段僅差些音的所組成
(而且通常變化都在句末)
不然把隨機到的音階
寫成前奏 主歌 副歌 間奏 副歌(*1或*2) 尾奏
或者是副歌 間奏 主歌 副歌...這類的形式
看聽起來是否感覺會像常聽的歌些
不過程式實際上要怎麼寫可能還是等想下就是了
(運氣不好想下照樣寫不出來)
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=3017731
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 1 篇留言

解凍豬腳
建議把path為空的exception給catch起來
避免實際運行的時候出現錯誤而跳掉

11-15 19:11

李兒諳
對哦
不過沒musicXML檔的話
基本上也用不了這程式
使用者亂輸入不存在的檔名跟沒輸入都會有致命錯誤
所以可能要
try{...}
catch (System.ArgumentException except1){...}
catch (System.IO.FileNotFoundException except2){...}
(我亂數種子那邊若亂輸入也有同樣問題)
試了約20分鐘
我有try catch跟沒try catch執行結果基本上是一樣的
當然catch內有寫些東西的話是會執行
但都會有相同的警告視窗跑出說有例外發生
並可以選擇繼續而不會跳掉
也就是我的環境是試不太出差異的

不過晚點(21:40以前)還是會把有try/catch的版本放上去
畢竟我原則上是不用try/catch/finally的
也許用錯了也說不定

會花這麼久的時間是因為
突然想到若有安裝MuseScore的話
其實是可以直接讀MIDI轉musicXML再轉成MIDI的
所以順便增加了個功能11-15 21:30
我要留言提醒:您尚未登入,請先登入再留言

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

前一篇:11/14,今天考完試後... 後一篇:11/17,聊下個人對於...

追蹤私訊切換新版閱覽

作品資料夾

kkll7952全體巴友
最近開始在YT分享自己做的遊戲! https://www.youtube.com/@FilterGameDev/shorts看更多我要大聲說19分前


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

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