2019年11月25日

用Micro:bit的Java Script玩音樂

在Micro:bit的程式積木中預設就有演奏音樂的功能,不過如果要自己透過積木來編寫樂譜演奏音樂的話,積木得拉得非常長一串,實在難以編寫。於是我轉向利用Java Script開發,希望把樂曲的簡譜以陣列方式書寫,再以程式讀取簡譜的陣列來播放。

而在實作的過程中,我又遇到音高和頻率的問題,實在不想直接指定哪個音名需播放什麼頻率,於是我也轉向用程式直接計算頻率,這麼一來編寫出來的程式居然有了新功能,我能夠指定要以什麼調性來演奏。例如同樣一篇簡譜的歌曲,我可以任意指定以C大調演奏,或是以D大調、C小調演奏,完全不須更動簡譜。
而且除了演奏簡譜之外,你也可以輸入一串如圓周率的數字,這樣也能演奏出歌曲。或是DNA或蛋白質的序列都可以演奏的。

我在十幾年前寫過的兩篇序列產生音樂的介紹文【聽蛋白質唱歌】、【你也可以讓DNA唱歌】,現在你也可以用這方式自己寫程式產生音樂了。


以下就以頻率計算的部分來說明,詳細的專案我都已經錄製成影片,另外影片中使用的簡報也在最後,同時程式碼也附在簡報當中。





以下幾張簡報要說明的是下面這串程式是怎麼寫出來的,這是最基本的程式,細節都可以看影片的說明
let scale = [0, 2, 4, 5, 7, 9, 11]
let start = 60

input.onButtonPressed(Button.A, function () {
   let sound = 1
   let playtime = 150
   let midiNumber = start + scale[(Math.abs(sound - 1)) % 7] + 12 * Math.floor((sound - 1) / 7)
   let frequency = 440 * (1.0594 ** (midiNumber - 69))
   music.playTone(frequency, playtime)
})

只要改變sound的數值,就可以產生不同音高的聲音。以sound =1 就是發出Do的音,若是 =2則是Re,以此類推。而高音的Do則是 sound = 8,低音的Do則是 sound = -1。
要演奏音樂,就只是讓sound依序等於一串string或是陣列裡的某個數字就可以,而那個數字可能是pi的一個位數或是蛋白質序列轉成ASCII Code,又或是正常樂曲裡的一個音符。


第一,要知道的基本知識,國際化標準組織訂出了A6(中音La) 的頻率是440Hz,此為標準音高,其他音高是由此標準音高去計算出來的

第二,每個八度音之間的關係是兩倍的頻率,例如中音La是440Hz,而高音La是880Hz,低音La是220Hz。

第三,八度音之間有12個半音


每個半音是前一個半音的常數倍,2^(1/12)倍, 約等於 1.059倍。只要知道標準音高是440,則下一個半音的頻率就是440x1.059,再下一個就是440*1.059*1.059,以此類推



而在MIDI標準中,中音La的Midi number訂為69,因此我們可以用這個數字來參照。例如中音Si是71,和69相差兩個半音,所以知道Si的頻率是440*(1.059)^(71-69)



但又有下一個問題,我怎麼知道一個音的midi number呢?同樣可以用換算的
  1. 規定好C大調的鍵盤順序。大調的音階都是按鋼琴鍵盤的白鍵,把Do當作第0鍵,則Re Mi....依序為 2  4  5  7 9  11鍵。也就是鍵盤順序 =[ 0,2,4,5,7,9,11]
  2. 已知Do的Midi number是60

用上面這兩個小知識就可以給簡譜的數字,換算出Midi Number了。例如給簡譜數字2,這是Re,Midi Number就是60再加上鍵盤順序的第(2-1)項(註:鍵盤順序的第一個字稱為第0項)

如果是給簡譜數字6,Midi Number就是60加上鍵盤順序的第(6-1)項 = 60+9 =69


接下來是高音和低音的簡譜表示法,分別用不同的邏輯寫成,高音是加上7,低音則是前面加負號。
然後用這個公式就可以得到Midi Number
midiNumber = start + scale[(Math.abs(sound - 1)) % 7] + 12 * Math.floor((sound - 1) / 7)



最後就可以寫出程式,給予簡譜數字後,讓程式自動計算對應的頻率。
而最開始所說,可以任意更改成小調或是D大調等,也只是修改那個對應的鍵盤順序和起始的Midi Number而已。所有完整的程式在上述簡報的最後一頁,全選複製貼到Makecode的編輯器就可以。

如果是C大調,就是start = 60 , scale = [0, 2, 4, 5, 7, 9, 11]
如果是D大調,就是start = 62 , scale = [0, 2, 4, 5, 7, 9, 11] (起始音階換成 D這個音)
如果是C小調,就是start = 60 , scale = [0, 2, 3, 5, 7, 8, 10] (小調按的鍵盤順序和大調不同)




科學論證:親子鑑定-Jeff 是不是H家的小孩

這個論證的練習活動出自Scientific Argumentation in Biology: 30 Classroom Activities的活動5
【DNA Family Relation Analysis 】

故事是這樣發展的,H先生和H太太育有五個小孩,三男二女。但不幸的是最小的六歲兒子被綁架了,經過警察多年查案,仍然無法釐清案情。
二十年過後,一個年輕的男子 Jeff 找上H家,他說他就是多年前被綁架的那個小男孩,但是H一家非常懷疑,於是求助於DNA鑑定,然而H先生已經在多年前車禍往生,能提供DNA證據的就只有H太太和其他子女了。

請根據這些STRs來分析到底 Jeff是不是H家的小孩?

完整學習單文件於此連結
https://docs.google.com/document/d/1yF5XszGaqEKG7wHPygQVG1n6CbocN1Pvv5MhHKLtM-M/edit?usp=sharing

Jeff 是不是H家的小孩

D13S317 Chromosome 13
D21S11 Chromosome 21
TH01 Chromosome 11
D7S820 Chromosome 7
STRs

Mrs. H
Child 1
Child 2
Child 3
Child 4
Jeff M.
D13S317






D21S11 






TH01 






D7S820 








議題或問題

主張或答案

支持這個主張的證據
以科學原理或科學概念,推理出證據為什麼支持主張的理由













對立主張(欲反駁的,你覺得不成立的)

證據
理由












科學論證:烏魚和海水溫度的關係

這個論證練習活動,是給予學生數篇文章進行閱讀之後而進行的。

提供的四篇文章分別是烏魚的基本資料,還有關於捕撈烏魚的相關新聞。
不同的班級間用了兩種不同的模式來進行,

  • 模式一:針對同一問題,我已經提出了三種不同的主張,請學生搜索文章中的資訊,分別針對不同的主張提出證據和推理。
  • 模式二:已經給予部分證據,請學生自己提出問題與主張,並對證據提出解讀。

活動的重點在於文章的閱讀理解,學習與整理相關的資訊,並能理解圖表與解讀圖表

完整的學習單文件如下連結
https://docs.google.com/document/d/1XTNqw6iiTBWDlGHBtZZa00zCdqjBvrdnC2OM-j1ZkJg/edit?usp=sharing





烏魚基本資料
烏魚為熱帶海洋群集性的魚類,分佈廣泛,從日本、中國的江蘇、浙江、福建、廣東及台灣等沿海皆有出現。本漁業的烏魚種類計有5屬10種,其中鯔魚(Mugil cephalus)的產量最豐,也被稱為「正烏」。每年國曆12月冬至前後十餘天為烏魚的繁殖季節,當東北風吹起時,隨著海水溫度的下降,烏魚開始從中國沿岸隨南下的寒流,進入台灣西部海岸,最初從新竹沿岸開始漸次南下,找尋適當海域產卵,洄游的適水溫約為18.5~22℃,初期的個體尚未完全成熟,12月中旬抵達嘉義布袋以北的沿岸海域,1月以後至高雄茄萣沿海,雌雄生殖腺即告成熟,洄游速度也隨生理的需求而加速,1月下旬至2月初至屏東枋寮海域產卵、排精,約兩星期後,魚苗便孵化出來。孵化的稚魚由於身體弱小無法忍受北方的寒冷,並不跟隨親魚洄游,通常是沿著台灣沿岸逐漸往北移動成長,喜棲息於淡鹹水混合的港灣或河口域。產卵後的親魚,以疲憊瘦弱的身體,掉頭洄游,沿著比原來的洄游路徑稍遠的離岸海域逐漸北上,在淡水河外轉向,返回中國沿岸海域。




〔自由時報記者王榮祥、丁偉杰╱綜合報導〕台灣往年冬至前後,烏魚洄游至台南、高雄外海,成熟度最適合捕撈,但昨天已是冬至,南部兩大捕烏漁港 – 茄萣興達港、梓官蚵仔寮漁港,尚未傳出捕獲烏魚的喜訊,去年茄萣還出現「零」捕獲量紀錄,漁民談到烏魚就嘆氣。


在中部,昨天嘉義捕烏的漁民也沒有斬獲,連同前幾天,也只捕獲零星數十尾;東石魚市場主任黃登財說,今年烏魚少得可憐,但烏魚汛期還未完全過去,如果氣溫持續下降,烏魚洄游群南下,還有希望捕獲「烏金」。


儘管還抱持希望,漁界對中國的胡作非為仍氣憤不已。他們說,近年來因中國漁民炸魚濫捕,台灣漁民只能抓漏網烏魚,捕烏愈來愈困難,加上中國箱網養殖的烏魚及烏魚子已大量傾銷台灣,也衝擊台灣養殖烏魚業,問題相當嚴重。


高雄縣漁會強調,除了暖冬效應,中國漁民炸魚濫捕與提前搶捕烏魚,正是近年來烏魚捕撈每況愈下的主因之一,相關單位遲遲無具體保護措施,台灣捕烏業不需等中國養烏技術成熟,可能就會消失殆盡。


據指出,中國今年參與捕烏船隊估計有七百餘組,比去年四百組成長近一倍,使用漁網又比台灣大上二至三倍,東海烏魚幾乎都被中國漁船漁網掌控,甚至常有中國漁船越過台海中線搶烏。台灣漁船近年來漁獲因此大幅下滑,像高縣今年僅有四組捕烏船,比起昔日上百組捕烏船出海捕撈,有如天壤之別。


漁民則稱,近年來台灣市場上的烏魚有相當數量來自中國,部分是海上交易,部分是漁民直接到對岸購買。由於中國漁民捕烏時期過早,銷往台灣的烏魚自然較小尾,烏魚子也更輕薄短小,以往大片又好吃的烏魚子數量漸少。


高雄漁民指出,中國箱網養烏地點多在福建沿海幾個港口及長江出海口,近兩年來陸續銷往台灣的烏魚及烏魚子數量難估,一般消費者難以區分,而業者也多將養殖烏魚宣稱是海上撈捕的。據指出,中國養烏方式多在河口攔下大批未成熟野生烏魚,放在護欄內養肥後再行銷售。


魚市拍賣場員工說,今年台灣烏魚捕獲量仍然低迷,但台灣市場還是可見大批烏魚,多數是「中國貨」,也可合理推斷中國養烏已經成功銷入台灣的說法。


台灣養殖業者赴中國投資、指導養殖烏魚,有漁民無奈稱讚:「台灣郎,真厲害!」也有漁民大罵:「自己殺自己!」





〔記者郭怡君╱台北報導〕中央氣象局指出,全球海溫和大氣環流監測資料顯示,赤道東太平洋海溫維持較暖的型態,已有初期聖嬰現象,但台灣所在的西太平洋區海溫則比往年稍微低一點,並沒有比較暖,氣溫則是受到大陸冷氣團很少南下影響而比往年偏高,是否因此讓烏魚產量減少,有待進一步研究。


氣象局指出,台灣今年從秋末的11月就有偏暖的趨勢,並一直持續到現在,往年寒潮常常從初冬就接連來襲的情況,並未在今年上演。雖然12月還沒結束,但統計本月的氣溫平均值應該會比氣候正常值高,預測明年1月偏暖的趨勢也會很明顯。


走私中國烏魚 傾銷台灣
〔記者楊雅民╱台北報導〕中國漁民捕撈的烏魚由於保鮮不佳,容易出現血卵和卵巢比較小的情況,由於賣相不好,自中國走私進口的烏魚,價格平均較台灣捕獲的烏魚便宜一至二成。但中國走私烏魚、烏魚子大量侵台的問題,仍然無解。


農委會水產試驗所所長蘇偉成說,中國把烏魚視為不吉祥的魚,認為吃了烏魚會舊病復發,中國消費者只會在嫁女兒的時候吃烏魚,象徵早生貴子,況且中國也沒有什麼人會製作烏魚子,因此,中國漁民捕獲的烏魚全部以台灣為市場。


漁業署科長吳滿全表示,該署兩年前就發函給國內四十三家中盤商和烏魚子加工廠,呼籲運銷業者不要非法購買、走私中國捕獲的烏魚。八十八年更曾去函陸委會將「兩岸漁業資源共同開發與管理」納入協商議題,並以烏魚為優先協商魚種,礙於兩岸遲遲無法重啟談判,也使得中國走私烏魚登台的情況難解。


水產試驗所表示,台灣在六十九年烏魚捕獲量高峰期,一年捕獲量高達兩百五十萬尾,但五、六年前中國漁民加入烏魚捕撈行列後,台灣烏魚捕獲量就逐年減少。漁業署統計,五年前國內年烏魚捕獲量還有二十四萬尾,去年已驟減至約八萬尾,今年至今官方監控到的台灣捕獲量僅六萬至七萬,但據漁民透露,今年非法侵入台灣市場的烏魚高達一百萬至兩百萬尾。





臺灣海峽歷年冬季(a)烏魚漁獲量百分比分布圖(b)20℃等溫線位置分布圖source:http://scitechreports.blogspot.com/2015/09/blog-post_90.html

班級
姓名


問題:為什麼台灣的烏魚捕獲量減少了?主要原因是?
主張一:因為海水暖化
主張二:因為中國漁民抓走了
主張三:
證據:(或你還需要哪些證據?)
需有分析和解讀























證據:(或你還需要哪些證據?)
需有分析和解讀
證據:(或你還需要哪些證據?)
需有分析和解讀
推理:












推理:
推理:

論證練習:烏魚和海水溫度的關係

班級
姓名

1.問題:
2.主張:
3.證據:
a.分析
臺灣海峽歷年冬季(a)烏魚漁獲量百分比分布圖(b)20℃等溫線位置分布圖source:http://scitechreports.blogspot.com/2015/09/blog-post_90.html
b.解讀[圖a顯示....][圖a和圖b共同指出了...]





4.推理:(證據如何支持主張)[用來理解證據的科學概念是....][基於以下的假設....,證據.....]





以下是部分學生的作業





科學論證:活過這個冬天

這個論證的練習活動出自Scientific Argumentation in Biology: 30 Classroom Activities的活動9
【SURVIVING WINTER IN THE DUST BOWL】

這個活動適合用在生態課程之後,搭配先前文章【科學論證與批判性思考的教學運用】的CER架構來解決問題。

原文章我略作翻譯,以及調整原文表格內的單位(例如英鎊改成公斤),有興趣的可以用此活動原文標題去搜尋,也能找到電子檔。


翻譯的文章和學習單於此連結
https://docs.google.com/document/d/1t3fVATS9ZTH7hbguZOpCfxLqRih98rsPvUiuMEiMLI8/edit?usp=sharing

活過這個冬天!

1930年的時候,堪薩斯、科羅拉多和德州等地遭遇了嚴重的旱災,持續了將近十年。不只旱災,溫度也飆高,也同時帶來的強風,再加上有不時的蟲災和沙塵暴。留在當地的農人過得十分艱困,不得已必須採取手段來度過這段時間。

想像你和你的異性家人共兩人在1934年的奧克拉荷馬,當時是10月15日。那年是相當乾旱的一年,從一月到當天的年雨量不過才250毫米,如果沒有乾旱,這裡平均可是有1000毫米的年雨量啊。這年的小麥收成也相當不好,你和你的夥伴本來預計在春天種下小麥,到九月中收成,預計可以收成76公噸,但今年只收成13公噸小麥,此時你的農莊也只有2000公升的水,你也不知道何時會再下雨。

而在你的農莊裡還有一頭公牛和母牛,牠們也都需要食物和水才能存活下來。請仔細思考,你要如何做才能活過冬天?用證據和運算思維思考,提出你的看法,你能撐多久?
請留意以下幾件事(1)食物鏈與能量散失的關係 (2)牛乳是母牛產子後為了哺育而產生的

  • 先吃公牛,保留母牛,但是不餵食牠。喝母牛產的乳,直到母牛再也不產乳了,再殺了牠吃掉。然後吃小麥。
  • 先吃公牛,保留母牛,用小麥餵牠。喝母牛產的乳和剩下的小麥。
  • 和公牛和母牛共享小麥,直到小麥吃完,然後再吃掉公牛和母牛。
  • 吃掉公牛和母牛,然後再吃小麥。
  • 其他?

營養需求表
物種
體重(Kg)
一日消耗的熱量(Kcal)
一天需要的水量(L)
食物中蛋白質含量(%)
食物中碳水化合物含量(%)
食物中脂質含量(%)
女性人類*
50-80
1200
1.5
10-35
45-65
20-35
男性人類*
70-90
1800
1.5
10-35
45-65
20-35
母牛(產乳)**
350-450
44000
180
10-20
70-80
10-20
母牛(不產乳)
350-450
30500
150
10-20
70-80
10-20
公牛
450-550
46000
165
10-20
70-80
10-20
*人類可以以最低的活動量不吃東西,維持四到八週的存活。但是無法3-5天不喝水
**一隻乳牛每天可以產生6加侖的牛乳,大約等於22公升

食物營養表
食物
一份重量(g)
每份多少熱量(Kcal)
總蛋白質量(g)
總碳水化合物(g)
總脂肪(g)
小麥
100
339
13.7
72.6
1.9
牛*
453.6
662
95.8
0
161
牛乳
100
497
26.3
38.3
26.7
*牛只有41%的體重是可以食用的,其餘是骨骼或不可食用的部分


活過這個冬天!
班級
姓名
主張






證據

如果只是要「活過這個冬天」,那麼就要估算至少要活多少天,而且活過冬天之後,總不能就沒食物了吧。所以不能僅是「活過冬天」而已,還得要考慮過完冬天,還能不能活下去。因此先吃哪種食物便是重要選擇。
吃掉母牛,以後再也沒小牛。但留下這些牛,不予餵食,母牛也未必能正常產乳。這些又要考慮到當牠們成為食物後,能提供多少能量。而畜養牠們,又會耗費多少資源。

看看這些就是部分學生的計算結果