Scratch作為圖形化的編程工具,除了制作故事情節(jié)的程序,還可以利用鍵盤事件模塊觸發(fā)相應(yīng)音符彈奏,通過更改演奏樂器,調(diào)整演奏速度與音量來完成自定義音樂,今天我們來學(xué)習(xí)一下。
學(xué)習(xí)目標(biāo)
1.學(xué)習(xí)如何控制音頻文件的播放
2.掌握鍵盤事件,能夠通過按鍵播放聲音
3.了解拓展積木的選擇方法
4.理解音量與演奏速度
Scratch中每個角色的音頻文件是相互獨(dú)立的,我們需要將音頻上傳到需要的角色中去,這里我們需要先選擇“電子琴”角色,再在聲音標(biāo)簽中上傳音頻。
可以看到電子琴角色中已經(jīng)準(zhǔn)備好了八個音符的音頻(圖1),不需要我們再次上傳,如果需要其他音頻,上傳方式類似于上傳角色。
上傳好音頻后,我們在聲音模塊中可以看到“播放聲音”程序塊,將其拖往程序區(qū)預(yù)備(圖2)。
在之前的學(xué)習(xí)中,我們使用了“當(dāng)綠旗被點(diǎn)擊”執(zhí)行程序,相應(yīng)的,事件模塊中的“當(dāng)按下空格鍵”表示空格鍵被按下時,執(zhí)行之后的程序,其中空格鍵可以換成其他任何鍵。這里我們將兩個程序塊組合,當(dāng)按下1鍵,播放聲音“哆”,以此類推,程序如圖3所示:
其中的 “C”、“D”、“E”、“F”、“G”、“A”、“B”、“C2”分別代表“哆瑞咪發(fā)嗦啦西”以及高音“哆”。完成后,點(diǎn)擊相應(yīng)按鈕即可發(fā)出相應(yīng)聲音。
除了聲音組常規(guī)積木外,Scratch3.0還提供了音樂模塊,音樂模塊屬于額外附加模塊,通過點(diǎn)擊左下角的拓展按鈕添加,如圖4:
點(diǎn)擊拓展按鈕進(jìn)入拓展界面,選擇音樂模塊即可完成添加(圖5),音樂模塊有七個專屬程序塊。
其中“小軍鼓”和“鋼琴”旁邊的三角形按鈕(圖6)可以幫助我們更換樂器。
“休止0.25拍”表示彈奏間隔0.25拍(“拍”是音樂演奏中的時間單位)。
點(diǎn)擊“演奏音符60? 0.25拍”中的“60”可以更改演奏的音符,計算機(jī)用數(shù)字指代具體音符。
音樂模塊的最后三個程序塊都是關(guān)于演奏速度的程序塊,其中“將演奏速度設(shè)定或增加”是用來修改演奏速度的,最后的“演奏速度”是用來記錄當(dāng)前演奏速度的變量,可以通過勾選前面的小方格來顯示或隱藏變量“演奏速度”(圖7)。
通過音樂模塊中的“將樂器設(shè)為……”可以調(diào)整演奏的樂器,通過“演奏音符60? 0.25拍”可以調(diào)整演奏的音符,通過在音樂模塊中改變演奏速度,在聲音模塊中改變音量,我們可以自行編寫一整首曲子,通過按下某個鍵觸發(fā)命令即可播放,效果如圖8:
其中的音量設(shè)定,休止設(shè)定、演奏速度設(shè)定、樂器設(shè)定可根據(jù)需要放置,也可同時彈奏多種樂器實(shí)現(xiàn)合奏效果,程序如圖9:
我們這里提供一份簡譜,通過轉(zhuǎn)化為編程語言,即可在程序中運(yùn)行播放(圖10)。
Python 是機(jī)器學(xué)習(xí)最廣泛采用的編程語言,它最重要的優(yōu)勢在于編程的易用性。如果讀者對基本的 Python 語法已經(jīng)有一些了解,那么這篇文章可能會給你一些啟發(fā)。本文簡單概括了 10 段代碼,它們都是平常非常實(shí)用的技巧哦。
可以檢查給定列表是不是存在重復(fù)元素,它會使用 set() 函數(shù)來移除所有重復(fù)元素。
def all_unique(lst):
return len(lst) == len(set(lst))
x = [1,1,2,2,3,2,3,4,5,6]
y = [1,2,3,4,5]
all_unique(x) # False
all_unique(y) # True
檢查兩個字符串的組成元素是不是一樣的。
from collections import Counter
def anagram(first, second):
return Counter(first) == Counter(second)
anagram("abcd3", "3acdb") # True
下面的代碼塊可以檢查變量 variable 所占用的內(nèi)存。
import sys
variable = 30
print(sys.getsizeof(variable)) # 24
以下方法將統(tǒng)計字符串中的元音 ('a','e', 'i','o', 'u') 的個數(shù),它是通過正則表達(dá)式做的。
import re
def count_vowels(str):
return len(len(re.findall(r
'[aeiou]', str, re.IGNORECASE)))
count_vowels('foobar') # 3
count_vowels('gym') # 0
該代碼塊不需要循環(huán)語句就能打印 N 次字符串。
n = 2;
s ="Programming";
print(s * n);
# ProgrammingProgramming
以下代碼塊會使用 title() 方法,從而大寫字符串中每一個單詞的首字母。
s = "programming is awesome"
print(s.title())
# Programming Is Awesome
給定具體的大小,定義一個函數(shù)以按照這個大小切割列表。
from math import ceil
def chunk(lst, size):
return list(
map(lambda x: lst[x *? size:x *? size + size],
list(range(0, ceil(len(lst) / size)))))
chunk([1,2,3,4,5],2)
# [[1,2],[3,4],5]
這個方法可以將布爾型的值去掉,例如(False,None,0,“”),它使用 filter() 函數(shù)。
def compact(lst):
return list(filter(bool, lst))
compact([0, 1, False, 2, '', 3, 'a','s', 34])
# [ 1, 2, 3, 'a','s', 34 ]
如下代碼段可以將打包好的成對列表解開成兩組不同的元組。
array = [[a', 'b'], ['c', 'd'], ['e', 'f']]
transposed = zip(*array)
print(transposed)
# [('a', 'c', 'e'), ('b','d', 'f')]
我們可以在一行代碼中使用不同的運(yùn)算符對比多個不同的元素。
a = 3
print( 2 < a < 8) # True
print(1 == a < 2) # False