• 沒有找到結果。

電腦音樂創作媒介-Eclipse:Java程式語言概念、應用與實作探討

N/A
N/A
Protected

Academic year: 2021

Share "電腦音樂創作媒介-Eclipse:Java程式語言概念、應用與實作探討"

Copied!
112
0
0

加載中.... (立即查看全文)

全文

(1)國立臺灣師範大學. 音樂學系碩士班作曲組學位論文. 電腦音樂創作媒介:Eclipse Java 程式語言概念、應用與實作探討. New Way for Computer Music Composing “Eclipse” The concept of Java program language. 指導教授:李和莆 博士 研究生:鄭蒼嶽 撰. 2012 年 11 月.

(2) 前言 對於筆者而言,接觸到電腦音樂的契機是在研究所期間,經由海外進修的學 長在一次回國講座中介紹到這項新興的創作手法,同時也因此得知這項技術在國 內尚未有前人做過研究以及將其應用到音樂創作一途。因此經過長期思考後,在 訂立論文主題時,考慮到其創新及學術上的價值,並且承蒙恩師李文彬教授的支 持與同意,最終選擇了此一跨領域主題為研究的核心。 最初從事此項研究時,困難之處莫過於要從頭學習跨領域技術層面的知識, 像是程式語言的編寫、排列、串聯等等,到最後把自身所學的音樂創作技術加以 合併應用到作品中。而這類型的電腦音樂作品也是筆者過去未曾接觸和嘗試的, 就整體而言,不管是學習編程還是創作的部分都十分具有挑戰性。 為此,在此要感謝人在海外的邱明慶學長及資工相關專業的王尚平同學等人 在論文期間提供諮詢和解答。而最終作品在發表的呈現上,也非常感謝演奏者蘇 品嘉同學能一同合作將其完成,當然也要感謝在研究所期間指導教授李文彬教授 以及論文口試委員陳茂萱教授及陳瓊瑜副教授在論文口試時提供的建議;另外也 感謝所有在論文研究這段時間內支持、幫助過筆者的親人、朋友、師長及學長姐 們。 最後,由於資訊工程並非筆者之過去所學之專科本業,因此在不同領域的狀 況下,儘管在寫作過程盡力追求嚴謹,恐難以力求完美,惟筆者才疏學淺,如有 遺漏、錯誤之處,望各位先進師長不吝指教,並且亦期望本論文能夠為日後期望 以 Java 程式語言為創作方式的後進提供明確易懂的說明及範例。. i.

(3) 中文摘要. 電腦投入音樂創作領域中至今已過五十餘年,在科技日益進步的今日,越來 越多對於音樂創作、音樂展演、音樂教育上有所幫助的程式、設備等也不停的改 良並且研發出來,因此,也使得電腦音樂在現今全世界的音樂領域中已成為不同 於以往學術創作的另一股潮流。在國內,電腦音樂也逐漸受到音樂創作者們的注 意,使得越來越多人投入這個領域,雖然尚未受到廣泛運用,但這項技術的引入, 對於學術音樂創作上的影響,不僅提供了新的創作元素,同時更增添許多新的可 能性,擴展國人學術創作的深度及廣度。 目前國內的電腦音樂在程式的使用上是以 Max/Msp 為主流,然而,本論文將 要探究是以在資訊工程領域中已受到廣泛運用的 Java 程式語言為創作基礎的一種 新的電腦音樂創作平台-Eclipse。內容將從程式語言元素及敘述式的介紹、基礎 的編程範例、音樂分析以及提供實際創作作品為應用實例,進而推展出跨領域合 作和技術統合對於音樂創作發展上的可能性,也期望最終能以此方式使得音樂能 在資訊發達的現代,能更加容易推廣至大眾的生活當中。. 關鍵字:Eclipse、Java 程式語言、jMusic。. ii.

(4) Abstract Computer has been involved in music composition since 1950s. Nowadays, with the advance of science and technology, more and more programs and equipment are invented and improved to assist in musical composition, music performance and music education. Known as “computer music”, musical composition using computer, a way completely different from traditional academic composition, has therefore become a popular trend these days. In Taiwan, composers gradually noticed the emergence of computerized music, which makes more and more people devoted to the field. Although currently the technique has not been applied widely, this introduction not only provides new element to music but also adds new possibility. In the meantime, having strong influence on the quality of music, this fresh technique expands the depth and width of academic composition and broadens people’s horizons. Now the Max/Msp is the most popular program in Taiwan. However, the research in this thesis is about how to use another well-known interface in the field of computer science named “Eclipse” on the music composing. From introducing and programming the basic operators, methods, statements to music analyzing and music composing, this thesis is suitable for those beginners who want to use Java language to compose music. Provided with the application of examples and experimental composition, I hope it will push the cross-field cooperation. Furthermore, it can be easier to apply this technique to spread classical music and modern compositions to the general public.. Keywords: Eclipse, Java Program language, jMusic.. iii.

(5) 目次. 前言 ................................................................................................................................ i 中文摘要 ....................................................................................................................... ii 英文摘要 ...................................................................................................................... iii 目次 .............................................................................................................................. iv 第一章 緒論 ............................................................................................................... 1 第一節 研究目的 ........................................................................................... 4 第二節 研究範圍 ........................................................................................... 5 第三節 研究方法 ........................................................................................... 6 第二章. 電腦音樂 ....................................................................................................... 7 第一節 Max/Msp ............................................................................................ 8 第二節 Eclipse/jMusic ................................................................................. 10 第三節 Max 與 Eclipse 比較 ....................................................................... 13. 第三章 Eclipse 內涵 ................................................................................................. 15 第一節 Java 程式語言簡介與基本應用 ..................................................... 15 (一)Java 程式語言的內涵與背景 (二) Java 程式開發環境 (三) Java 程式編寫基本架構與列印字元 第二節 Java 語言下的數學與邏輯 ............................................................. 26 (一)Java 中的數學概念 (二)Java 語言中的選擇敘述式 (三)Java 語言中的迴圈敘述式 (四)Java 語言中的陣列 (五)Java 語言中的數學類別和亂數類別 第三節 數學概念帶入音樂 ......................................................................... 48 (一)jMusic 中 MIDI 製作相關基礎常用物件名稱 (二)近代音樂之於 Java 程式語言 第四章 作品分析,作品《幻實之鏡》 ................................................................. 67 第一節 創作概念 ......................................................................................... 67 第二節 創作歷程 ......................................................................................... 69 第三節 作品分析 ......................................................................................... 71 iv.

(6) 第五章 結論 ............................................................................................................. 85 參考文獻 附錄. v.

(7) 第一章 緒論. 音樂創作的發展,自十九世紀末進入二十世紀這個從原先調性音樂(Tonal Music)轉型到非調性音樂(Atonal Music)的過渡期開始,作曲家們為了突破以往的 窠臼,在創作上開始各式各樣的大膽嘗試,從最開始仍以傳統樂器演奏為基礎, 打破調性結構的十二音列 (Twelve-tone),到以音列的手法為基礎的序列音樂 (Serialism)。後來更是為了追求音響上的突破,使得電子、科技等元素也成為音樂 創作中的一部份。 說到科技對於在音樂創作上的影響,最早的起源可以追朔回二十世紀初,電 子音樂(Electroacoustic Music)的發跡。一開始,如同上段所言,只因為原有的各種 古典樂器所發出的音色對於作曲家們而言已經不再滿足;因此,作曲家們開始朝 向科技方面尋求新的出路,發明出各種符合自己需要的、藉著電子合成出獨有音 色的各式電子樂器,有些是將舊有的古典樂器電子化、其餘有些是完全創新、有 著機械外表的樂器。 在當時作曲家的作品中用到電子樂器的例子,像是法國作曲家瓦瑞斯(Edgard Varese, 1886-1965)於 1934 年創作的作品《赤道》(Ecuatorial, 1934)中就使用了兩台 「 特 雷 蒙 」 (Theremin) , 1 另 外 同 為 法 國 作 曲 家 的 梅 湘 (Oliver Messiaen, 1908-1992),在他 1937 年中;的作品《美泉節慶》(Fê te des belles eaux, 1937)中也 1. 特雷蒙琴(Teremin):由特爾門(Lev Termen, 1896-1993)於 1920 年發明的電子樂器, 藉由操作震盪器(oscillator)的方式改變頻率來演奏。. 1.

(8) 用到六台「馬特農」(Martenot), 2 其他電子樂器還有漢蒙德(Laurens Hammond, 1895-1973)於 1933 至 34 年間發明的「電子管風琴」(Electronic organ)。同時,作 曲家米堯(Darius Milhuad, 1892-1974)、亨德密特(Paul Hindmith, 1895-1963)、瓦瑞 斯等人也藉由當時的留聲機(phonographs)技術去改變早期創作錄音的速率,造成音 高的改變,而真正第一首以留聲機技術來創作的作曲家是約翰・凱基的(John Cage, 1912-1992)於 1939 年的作品《第一號幻想風景》(Imaginary Landscape No.1, 1939)。 接續著是利用錄音技術而得以發展的具象音樂(Musique Concrete),最早是由 法國人薛費爾(Pierre Schaeffer, 1910- )藉由種種不同的方式加工錄下各式各樣現實 中「自然的」聲音,像是改變錄音速率、將錄音本身逆行(tape reversal)以及混合不 同的聲音(overdubbing)等等。而這些技術真正實際應用、並創作成完整的作品,則 是在法國作曲家亨利(Pierre Henry, 1927- )1950 年的作品《一個人的交響曲》 (Symphony for a Man Alone, 1950),在這首作品中可以聽到,作曲家現實中錄下的 呼吸聲、笑聲、講話聲這些人聲,混合了交響樂、腳步聲等其他聲音。 繼電子樂器跟錄音技術之後,真正完全的電子音樂的發跡,則從德國作曲家 艾麥特(Herbert Eimert, 1897- )在科隆設立的電子工作室開始。艾麥特以錄音後制的 技術為 基礎 , 同 時也 加入新 的設 備 - 震盪 器 (Oscillator)和 聲音 產生裝 置 (Noise generator),藉由這兩種新的裝置,作曲家不需再仰賴預錄的現實中聲音為創作基 礎,可以直接產生他們想要的各式電子聲音。如此的技術發展對於序列音樂 (Serialism)的作曲家們而言是一大福音,這代表著他們能藉此他們不止能操控音高 和長短,也能操控聲音的元素本身。而首位在作品中體現這項技術的作曲家,即 為史托克豪森(Karlheinz Stockhausen, 1928-2007)分別於 1953 和 1954 創作的《一號 2. 馬特農琴(Martenot):由馬特農(Maurice Martenot, 1898-1980)於 1928 年發明的電子 樂器,同樣也能持續的在一定的音域內演奏,但在音高的控制上做了改良,同時也具有更 多樣性的音色變化。. 2.

(9) 研究》(Study I, 1953)以及《二號研究》(Study II, 1954)兩首作品,而在 1960 年代之 後,電子音樂已經不像早期僅為嘗試性、實驗性的創作,反而成為當十音樂創作 不可或缺的一個要素,如此的景像大約持續到了 1970 年代左右。 電子音樂崛起後,電腦音樂也隨之在 1950 年代後期出現。最初能在電腦上使 用的聲音合成程式出現於 1957 年,由美國電子工程師馬修斯(Max V. Matthews, 1926-2011)在貝爾實驗室中研發完成的第一套能產生音樂聲響程式。而這套程式在 1964 年首先在普林斯頓大學中使用,史丹佛大學也隨後跟進使用;歐洲方面,最 早的電腦音樂工作室亦在 1964 年設立在荷蘭的烏德勒支(Utrecht),但早年的電腦 音樂,儘管是一項嶄新的技術,卻沒有引起大量作曲家們的興趣,反而是到了 1980 年代之後才逐漸擴展至今。. 3.

(10) 第一節 研究目的. 電腦科技的發展對現在當代的台灣作曲家們而言,是一個既具有發展潛力卻 又不敢輕易嘗試的領域,它時時刻刻都不斷進步、替作曲家們提供新的意外跟驚 喜,也使得眾多作曲家都亟欲去嘗試。但進步也意味著它本身將存在各式各樣的 變因,也成為這塊領域之所以讓人卻步的原因之一,另一個原因是,它除了需要 作曲家們在音樂創作領域中所學習、具備的理論和技術外;更甚者,在於電腦操 作的技術,不同於紙筆創作寫在五線譜上的每個記號、音符等等,需要的是跨領 域的、對於完全截然不同的各式指令上的專業知識,這些也成為對於大部分作曲 家最大的挑戰。 在台灣,隨著時間的流逝,音樂創作和展演的領域,從早期年長、資深的前 輩作曲家們的紙筆創作,到現在,隨著環境改變,改變了作曲家們對於聲響上的 要求,也因此為了追求新的概念跟聲響的需要,加上部分受制於演出人事、經費、 聽眾等考量,越來越多中生代作曲家及新生代的學生投入電腦音樂的創作和應用。 而國內現在音樂創作的慣用程式,目前台灣是以 Max 為主流。然而,筆者在 本論文中,想要探討的是卻是以 Java 程式語言創作音樂的另一個程式:Eclipse, 希望以此提供在電腦音樂創作上的另一個途徑。. 4.

(11) 第二節 研究範圍. 本論文研究範圍,由於預設是以非資訊工程背景的使用者為出發點而撰寫; 因此將從 Eclipse 的背景沿革、Java 程式語言的發展背景為開端做基本介紹。 接著是針對 Eclipse 程式創作時利用的 jMusic 所需的 Java 程式語言為基礎, 從各種基本的運算子、基本邏輯的運算式…如此由淺入深的介紹並配合操作範例 說明。 在基本的敘述式介紹完成後,進一步的,把這些程式設計上的邏輯概念應用 到套用了 jMusic 下的音樂創作層面。在這個部分,筆者將選擇由創作出經典作品 《四分三十三秒》(4’ 33″, 1952)的作曲家約翰・凱基(John Cage, 1912-1992)所提倡 在 1950 年代發跡的不確定主義(Indeterminacy) 說明如何以程式語言做出隨機的概 念,1960 年代盛行一時的極簡主義(Minimalism)則以選擇出特定作品並分析的方式 以最後以融合數學概念的「正弦波」(Sinewave)、「音雲」(Sound Cloud)為基礎的 範例分析;希望儘管在有限狀況或範例的分析之下,可以提供明確如何將數學、 邏輯和音樂創作三者結合的概念。 最後,將這些概念應用到實際作品創作,以階段性引導為探討目標,著重於 相關作品分析與應用手法探討,並且提供實際應用之例證,希望使得其他讀者能 以此為使用此程式的入門操作之參考。. 5.

(12) 第三節 研究方法. 本論文之研究方法分為以下幾種步驟: 一、相關文獻資料探討:提供電腦音樂兩大系統程式之發展背景-Max/Msp 和 jMusic,並比較其不同之處。 二、Java 程式語言基礎概念的介紹:從各式基礎元素的介紹為開端,到完整 的指令、複合指令的分析 三、Java 程式語言之於音樂領域應用:以近代音樂各式風格、主義的作品為 例探討並分析。 四、實際作品操作及應用:透過在作品中實際融入,以此使得各階段性組合 的概念能更加清晰。 五、綜合歸結:以上述各種方法研討,歸結提出 Eclipse 程式應用之我見,作 為本論文研究結論。 在本論文中,所有範例編號將以全形中文數字來編號,且以不分章節的型式 編列,也就是說編號將會從一開始持續往下列出,不隨著章節更新重新編排,如 「範例一」、「範例十五」。 而表格編號將以「表 x-x-x」的方式來編列,第一碼“x”為章數,第二碼“x”為 節數,最後一碼“x”則為同一節中第幾個表格,舉例來說,在第三章第二節中第五 個表格將會編列成「表 3-2-5」以方便閱讀;圖片與譜例也將會以相同方式給予編 號,但圖片第三碼將會以小寫英文字母編寫,如「圖 3-1-a」 ,譜例部分第三碼將以 羅馬數字編寫,如「譜例 3-1-i」。. 6.

(13) 第二章 電腦音樂. 電腦音樂的創作,在現今各式軟體出現前,也經歷過很長時間的演進。最初, 一些作曲家將電腦做為後製、加工錄音的工具,一部分則是將電腦為操作電子音 樂的媒介;直到 50 年代,終於有作曲家提出純粹以電腦來創作的概念,1956 年, 由希勒(Lejaren Hiller, 1924-1994)和艾薩克遜(Leonard Isaacson, 1909-1997)聯合創 作出弦樂四重奏《依里亞克組曲》(Illiac Suite, 1956),即是在不同樂章以不同電腦 程式模仿過去作曲家的寫作風格來寫作;後來 60 年代早期,希臘裔法籍作曲家瑟 納基斯(Iannis Xenakis, 1922-2001)也利用了電腦演算技術去創作音樂,像是他在 1962 年完成的弦樂四重奏作品《四分之 ST》(ST/4, 1962)即為一個例子。 但對於電腦現代音樂創作發展上具有顯著影響力的轉捩點,是於 1976 年在巴 黎,由法國作曲家布列茲(Pierre Boulez, 1925-)發起,在法國政府支持下成立的法 國 音 樂 與 聲 學 協 調 研 究 學 院 (Institut de Recherche et de Coordination Acoustique/Musique, 簡稱 IRCAM,後文亦以此稱之)的出現;IRCAM 中匯集各方 科學家和音樂家,致力於研究在科學上的音樂現象;同時,IRCAM 也配有最先進 的電腦設備,除了作為將各式研究與音樂結合之用外,也以這些設備做為聲音合 成以及即使演算的樂器平台;除了許多知名的作曲家都曾經在 IRCAM 中工作過 外,現在年輕一輩的作曲家們,也都深受其影響。3. 3. 本段文字彙整自 Morgan, Robert P.. Twentieth-Century Music: A History of. Musical Style in Modern Europe and America. New York: Norton, 1991. 7.

(14) 第一節 Max/Msp. Max 程式,最初是在 1980 年中期,由位在法國 IRCAM 工作室的帕凱特(Miller Puckette, 1959-, 後文簡稱為帕凱特)為了麥金塔電腦(Macintosh, 簡稱 Mac)而設 計。大量實際應用上,則於 1989 年,當時 IRCAM 使用 NeXT 軟體公司生產出的 新的「即時演算合成器效能卡」(Real-Time Synthesizer Card)又稱 IRCAM Signal Processing Workstaion(簡稱 ISPW),帕凱特針對這個效能卡引入這套新的程式,也 就是被稱為 Max/FTS 的這套程式。 1990 年,Max 程式藉由 Opcode Systems 公司開始了對外商業性的販售。自 1999 年至今,則轉為 Cycling’74 公司出版、支持並加以販售。在 1996 年,帕凱特開始 研發新的程式-Pure Data(簡稱為 PD)。4 在 PD 研發完成後不久,吉卡瑞里(David Zicarelli,後文簡稱為吉卡瑞里)開始 研發具有 PD 基礎演算技術,同時在功能上也 Max/FTS 的啟發,最終行成了 Max/MSP(但當時還沒應用到 PD 中),也以此為基礎不斷改進,成為今日以 PD 為 基礎來創作的 Max/MSP,最後附上 Max 程式開發的歷史簡表(見表 2-1-1):. 4. Pure Data(PD):研發目標上和 Max/FTS 不同,但卻同樣具有即時信號演算能力 (Real-Time Signal Processing)。儘管最初是在 SGI 平台上開發,現在 PD 可以在 Windows、 Linux 和 Mac 系統中運行。. 8.

(15) 【表 2-1-1】Max 開發歷史簡表(以官方查詢到的版本年代為準): 年(西元). 事件. 1989. 帕凱特研發出 Max/FTS。. 1990. Opcode Systems 開始對外販售 Max/FTS。. 1996. 帕凱特開始從事研發 PD,吉卡瑞里隨之研發 Max/MSP。. 1999. Cycling’ 74 公司取得出版權。. 2002. Max/MSP 4.1 發布。. 2003. Max/MSP 4.2.1 發布。. 2004. Max/MSP 4.3.2 發布。. 2006. Max/MSP 4.5.7 發布。. 2007. Max/MSP 4.6 發布。. 2011. Max/MSP 5 發布。. 2012. Max/MSP 6 發布。. 9.

(16) 第二節 Eclipse/jMusic. 一、 Eclipse 發展背景: Eclipse 這個程式是在 1999 年由 OTI(Object Technology International)和 IBM 公 司共同合作開發而成的,主要是設計成一個整合開發環境(Integrated Development Enviroment, 後文簡稱為 IDE)。5 其前身據說為 Visual Age,但由於 Visual Age 無法由第三方進行擴充,所以開 發團隊才進而彙整當時其他 IDE 的共通項目開發 Eclipse,開發完成發布後,Eclipse 由於其效能及提供免費下載使用,很快就廣為受到利用。其開發歷史年表如本節 附表(見表 2-2-1)。 Eclipse 是開放原始碼的綜合開發環境,它是以 EPL(Eclipse Public Lisence)這 一原始碼授權發布。也因此使得它得以讓人免費使用,也能自由閱覽它的原始碼。 而它受到廣大利用的原因,除了它免費容易取得之外,它在功能上的高完成度、 跨平台以及外掛程式的擴充性,也是讓眾多使用者選擇這個程式的原因。 就完成度而言,它備有建立、編寫、執行、除錯 Java 程式碼之基礎功能,同 時也具備了協作版本系統(Concurrent Versions System, 簡稱 CVS)6 之類的團隊功 能等等。就跨平台開發而言,它雖然是以 Java 語言為開發的基礎,但藉由加入外 掛程式的方式,它亦可以 C、C#、HTML、XML 等語言進行開發。就外掛程式的 擴充性而言,除了上述項目中提到,可以使其以不同程式語言進行開發外,Eclipse. 5. 整合開發環境(IDE):是一種輔助程式開發人員開發軟體的應用軟體,其中通常包 括了程式語言編輯器、自動建立工具、除錯器等等,有些 IDE 可以支援多種程式語言, 但大多還是針對特定的程式語言來研發。 6 協作版本系統(CVS):又稱併發版本系統,是一種版本控制系統,方便軟體的開發 商和使用者協同工作,也因此,能達到多方共同更改和改進,同時也能夠確保由不同人所 編輯的同一程式都能保持同步。. 10.

(17) 開發廠商和其他第三方廠商亦提供俱各種不同功能的需附費、免費的外掛程式, 提供使用者取其所需、客製自己的 Eclipse;而本論文中在創作上使用的 jMusic 也 算是這種外掛程式的一種。. 【表 2-2-1】Eclipse 開發版本歷史年表 年(西元). 事件. 1999. OTI 和 IBM 開始開發 Eclipse。. 2000. Eclipse Tech 發布。. 2001. 6 月 Eclipse 0.9 發布,10 月 Eclipse 1.0 版本發布。 11 月 IBM 公司開放原始碼。. 2002. Eclipse 2.0 發布。. 2003. Eclipse 2.1 發布。. 2004. Eclipse 3.0 發布。. 2005. Eclipse 3.1 發布。. 2006. Eclipse 3.2 (Callisto) 發布。. 2007. Eclipse 3.3 (Europa) 發布。. 2008. Eclipse 3.4 (Ganymede) 發布。. 2009. Eclipse 3.5 (Galileo) 發布。. 2010. Eclipse 3.6 (Helios) 發布。. 2011. Eclipse 3.7 (Ilndigo) 發布。. 2012. Eclipse 4.2 (Juno) 發布。. 11.

(18) 二、 jMusic 發展背景: 對於 jMusic 的研究,始於 1990 年晚期,由澳洲昆士蘭科技大學(Queensland University of Technology, 簡稱 QUT)的音樂學院研發。 研發的初衷是希望能將 jMusic 作為在電腦音樂創作的一個協助平台。在設計 上,jMusic 被設計為一個開方式的空間,但其中內涵了經過組織過、結構化的一 些函式指令;因此,在操作上不需因需求而去編寫個別單一類別,只需要查詢既 有類別指令即可,對於提升操作上的便利性有很大的幫助;而除了音樂創作外, jMusic 亦可作為分析以及音樂教育之用途。 jMusic 同時具有一個類別庫(Liberaries)。以類別庫而言,jMusic 在操作上是以 java 的程式語言在操作,同時,藉由 java 所完成的檔案也較易於在跨系統的各式 平台上使用,換言之,此類型的檔案在其中若沒有任何指令是特別呼叫某單一系 統中的程式時,它能在微軟公司所生產的 windows 系統和麥金塔公司所生產的 mac 系統中運作。 最後,藉由 jMusic 創作出的作品,能以存取為樂器數位類型的檔案(Music Instrument Digital Interface, 簡稱為 MIDI)的方式,匯出和匯入其他不同類型的音樂 創作軟體,像是最常見的 Finale 和 Sibelius 等等;藉由這種方式,能將這些程式語 言樂譜化,提升其使用上的便利性。. 12.

(19) 第三節 Max 與 Eclipse 比較. 關於 Max 和 Eclipse 兩個程式間的差異,從程式本質來比較,Max 是一種附合 型態的程式(Max 處理的是訊息、MSP 處理音樂訊號以及 Jitter 作為影像處理),在 操作上,Max 已是經程式設計師設計好的一個完整程式,使用者能在事先經過規 劃並設計過的介面下進行指令的連結或是額外載入或串連其他程式。這樣也代表 著使用者們是在所需功能都已備齊的情況中工作,可以自由載入音訊檔案做後置 調整或是自由混合成自己要的電子樂器等工作,其成品的性質屬於一種資料,舉 個例子,就像是以打譜軟體 Finale 所完成的檔案,在沒有轉換成圖檔的情況下, 就無法在沒有安裝該程式的電腦中使用檔案,即便是執行可以讀取的圖檔,缺少 了程式主體也無法進行編輯的工作;倘若是在沒有安裝 Max 這套軟體的電腦中, 也是無法進行編輯的功能。 反觀 Eclipse,雖然同樣為一種創作平台,但 Eclipse 創作時所操作的是屬於基 本的程式碼編寫,所謂的程式碼,它的運作,凡舉電腦開機後如何持續運行,或 是當使用者在使用任何一個程式中一個選單的條列、在選完選項後要執行什麼功 能等等,都是經由程式設計師將這些程式碼事先建構完才有辦法達成;另外成品 導向方向,Eclipse 創作出的成本不論其內容的複雜度,都已經是屬於一種程式, 這也意味著,若是在編寫程式時把條件本身設定好,它完成後將能在各種平台上 被執行,包括現在極為風行的各種平板電腦及手機。 就程式介面而言,Eclipse 在有經驗的程式設計者使用下,可以憑藉自己喜好 跟習慣自由調整,程式本身只是一個根基,而 Max 則是已經預先設定好定型的操 作介面(像是物件、訊息等指令的不同);操作用語上,Eclipse 使用的 Java 語言是. 13.

(20) 承襲並整合過去慣用的程式語言而成,因此對於非音樂專業背景的使用者而言, 所需要的只是多出來對於音樂創作上一些指令的理解,剩餘的可以憑藉自己編寫 程式的邏輯進行創作;而 Max 有著獨特的操作方式與連結上的邏輯概念,操作上 屬於全新的獨立技術,對於不管是否為音樂專業背景出生的操作者,都需要從零 開始學習,無法快速的上手。. 14.

(21) 第三章 Eclipse 內涵. 第一節 Java 程式語言簡介與基本應用. 一、 Java 程式語言的內涵與背景 Java 程式語言的開發始於 1991 年昇陽公司(Sun Microsystems)於公司內部設立 了一個以 C++語言7 為基礎發展新的程式語言的專案,此專案在當時雖然一度面臨 取消的危機,但隨著 1993 年全球資訊網路(World Wide Web)的興起,昇陽公司評 估 Java 程式語言對於建立帶有互動介面和動畫的動態內容(dynamic content)類型網 頁上具有潛力,因此使得研究專案得以繼續,並在 1995 年的 5 月對外發布有關 Java 的消息。 而現在的 Java 則是由 Oracle 公司代理,按照用途分成標準版(Java Standard Edition, 簡稱為 Java SE)、企業版(Java Enterprise Edition, 簡稱為 Java EE, 用於大 型、分散式的網路應用)、精簡版(Java Micro Edition, 簡稱為 Java ME, 用於小型且 記憶體受限的裝置)。 Java 程式是由類別(class)所組成,類別之中包涵方法(method),它能夠執行工. 7. C 與 C++語言:C語言是由利奇(Dennis Ritchie, 1941-2011)於 1972 年以 1967 年理 查(Martin Richards, 1940- )所研發的 BCPL 和 1972 年由湯普森(Ken Thompson, 1943-)所研 發的 B 兩種語言為基礎研發而成,而 C++語言由史特勞斯特魯普(Bjarne Stroustrup, 1950- ) 以 C 語言為基礎加入「物件導向程式設計」的功能擴充,使得它同時能個別和混合使用 C 和物件導向兩種方式撰寫程式。. 15.

(22) 作,並且也能在完成工作後回傳資訊。程式設計師可以依其所需建置自己所需的 各個類別,但也可以利用已經經過彙整的 Java 類別庫(Java class libraries, 後文以 API 簡稱之)來撰寫程式。8 因此,在以 Java 程式語言撰寫程式前,使用者必須先 熟悉 Java 的程式語言本身,進而能以此設計屬於自己的類別,同時,也得學習使 用各種不同的類別庫,才有辦法達到有效的應用。. 二、 Java 程式的開發環境 Java 程式的開發需要經過五個階段:編輯(edit)、編譯(compile)、載入(load)、 驗證(verify)以及執行(execute),詳見說明。 (一) 第一階段:建立程式 建立程式所使用的是編輯器程式(editor program)又簡稱為編輯器(editor) 藉由鍵入 Java 程式碼(source code)的方式來編輯檔案。Java 原始碼程式的副檔 名(extension)為「.java」,許多軟體供應商都提供了 IDE 來支援軟體開發,包 括用來撰寫和編輯程式的編輯器,以及找出程式中邏輯錯誤的除錯器。 (二) 第二階段:將 Java 程式編譯為中間碼 在第二階段,程式設計師使用 Javac 指令來編譯程式,即為使用 Java 編譯 器(Java compile)來將原始碼編譯成中間碼(bytecode)。 舉例來說,假如要編譯名為“Music.java”的程式,需要將以下指令“Java Muisc.java”鍵入到系統的命令視窗,在常用的 Windows 中是命令列提示符號 (Command Prompt),在 Mac OS X 是終端應用視窗(Terminal application),程式. 8. Java 類別庫又稱做為 Java API(Java Application Programming Interface, Java 應用程式 介面),是程式設計師使用(呼叫)的功能性程式,內涵多個函式及指令組合,由於和個別輸 入單一指令是相同的操作方式,對於設計師而言相對方便操作,像是 jMusic 即為一個 Java API。. 16.

(23) 編譯過後,編譯器會產生副檔名為“.class”的檔案。以上述例子而言,編譯過 的程式碼將以“Music.class”呈現。 這個階段所產生之中間碼即為第五階段中所要執行的工作。中間碼是以 Java 虛擬機器(Java Virtual Machine, 後文簡稱為 JVM)來執行,JVM 是屬於 JDK 的一部分,9 也是 Java 平台之基礎。虛擬機器(Virtual Machine, 後文簡稱 為 VM)是一種軟體應用程式,可以獨立於作業系統及硬體之外來模擬電腦運 作。因此當一個 VM 實作可以支援多個平台時,那麼藉由此 VM 所能執行的 程式也能在那些平台上使用,也因此使得 JVM 成為目前最廣泛使用的虛擬機 器之一。 但機器語言本身會因為電腦硬體不同而有所差異,唯獨中間碼是獨立於平 台的執行指令,因此可以說,Java 的中間碼具有可攜性,也是使得 Java 語言 可以跨平台使用的原因。 (三) 第三階段:將程式載入 程式執行前需先載入記憶體,以類別載入器(class loader)抓取檔案中內含 “.class”的檔案,並將其轉送至主記憶體中。類別載入器也裝載其他由 Java 程 式提供,在程式內需要的“.class”檔案。載入的途徑可以藉由系統磁碟或網路 兩個管道。 (四) 第四階段:驗證中間碼 在這個階段,藉由「中間碼驗證器」(bytecode verifier)檢查中間碼,確認 檔案沒有違反 Java 安全規定。 (五) 第五階段:執行. 9. JDK(Java Develop Kit):Java 開發套件,為昇陽公司針對 Java 開發人員發行的免費 軟體開發套件(Software Develop Kit, 簡稱 SDK)。. 17.

(24) 以 JVM 執行程式中間碼。現今典型的 JVM 是以「Java 熱點編譯器」(Java HotSpot compiler)以「直譯和即時編譯」(just-in-time compilation, 簡稱為 JIT) 的方式,分析解釋中間碼並找尋其中常用的熱點(hot spots),最後將中間碼編譯 成低階的機器語言,以加快其處理速度。 上列五個步驟套用到 Eclipse 程式的使用時,簡單的說,當在輸入編寫程式碼 時即為「編輯」階段,而若是在編寫過程中沒有任何錯誤的情況下,當儲存這個 檔案,程式本身就會自動完成「編譯」工作,後續三個步驟則是當使用 Eclipse 中 執行(run)選項時,在無形中自動完成。. 三、 Java 程式編寫基本架構與列印字元 Java 語言的指令相當多樣化,基本上而言,Java 語言是一種「物件導向」(Object oriented)的程式語言。10 以這種語言設計稱為「物件導向程式設計」(Object-Oriented Programming, 後文簡稱 OOP)。在 Java 設計中,程式設計單元是用來具現化 (instantiate, 即為建立)物件的類別,而類別中包含方法(method, 用來實作運算,類 似 C 語言中的函式)和欄位(field, 用來實作屬性)。 而在編寫 Java 程式之前,首先必須要先分析成品所要達成的需求,進而才能 決定要如何編排程式碼,如何去寫出滿足這些需求的設計。而這種以物件導向的 觀點來分析和設計系統的程序,被稱為是一種物件導向分析與設計成序 (Object-Oriented Analysis and Design, 簡稱為 OOAD),這樣的方式對於程式社記者 而言不僅節省時間,甚至可以減少程式本身的犯錯率。. 10. 物件導向設計(Object-oriented design, 簡稱 OOD),將相同特徵的物件(object)歸類 為同一類別(class),同時 OOD 也具有繼承(inheritance)這種保有既存類別的特性,進而衍 生加入出自己獨立特性產生成新的物件類別的優點。另外,OOD 會將屬性和運算 (operatrion)封裝(encapsulate)成物件。. 18.

(25) (一) 基本架構與列印字元: 在編寫 Java 程式前,先提供 Java 應用程式編寫時類別基礎架構範例(範例 一): 【範例一】Java 應用程式編寫基礎架構 1. public class Classname 2. { 3. public static void main ( String args [ ] ) 4. { 5. 程式內容 6. } 7. } 在這個基本的架構中含有幾個重要概念,首先是第一列“public class ClassName”為一個以 ClassName 為名的類別宣告(class declaration)。每個 Java 程式至少都要包含一個由設計師所設定的類別宣告,這種類別宣告是所謂的 「程式設計師定義類別」(programmer-defined classes)或是「使用者定義類別」 (user-defined classes)。這種類別宣告的開始是由其中的關鍵字 class(class keyword)引導,關鍵字又被稱為保留字(reserved words)有很多種,但都是由小 寫字母拼成。 後續接著的 ClassName 為類別名稱(class name),類別名稱的第一個字母 都要從大寫開始,但有時類別名稱是由多個字母組成的情況,此時當中的每 個單字的第一個字母也需使用大寫字母(像是例子中的 ClassName)。Java 類別 的名稱是一種識別字頭(identifier),其組成可以是一串字母也可以包含數字或 是底線(_)和金錢符號($),但不能以數字開頭,亦不能包含任何空白字元。另 外,大寫字母除了在類別名稱中特別要求外,在 Java 應用程式的編寫上字母 有大小寫的分別(case sensitive),像 A1 和 a1 兩者就是不同的。 第 3 列的“public static void main ( String args [] )”是所有應用程式的起. 19.

(26) 點,識別字 main 之後的小括號(parentheses)代表程式的組合區塊,裡面放置的 參數(argument)是告訴電腦該要給這個方法提供哪些型別的資料,整個類別的 宣告也是一種方法(method)的宣告。通常類別的宣告會包含一個或一個以上的 方法,但宣告中含有 main 關鍵字的,在一個 java 應用程式中只能有一個,且 一定要定義否則 JVM 無法執行。關鍵字 void 代表的則是這個方法在執行時不 會回傳資訊。 而方法宣告的主體部分是位於第 4 和 6 列的大括號(})中所輸入的部分, 則是方法宣告的主體部分(body of the method declaration),也就是這個方法具 體的執行方式。同時這裡也提供 Java 應用程式編寫的重要概念:在編寫過程 中有使用到大括號或是小括號都必須要左右成對,否則無法執行。 接著套入架構,命令 Eclipse 執行列印文字“This is beginning!”的指令,如 下列範例(範例二): 【範例二】列印文字範例 1. /* Print Example 2. (1)2 ways print one line 3. (2)Separate in different line 4. */ 5. 6. public class PrintExample { 7. 8. // main method begins execution of Java application 9. 10. public static void main(String[] args) { 11. 12. System.out.println( "This is beginning!"); 13. 14. /* System.out.println("This is "); 15. System.out.println("beginning!");*/ 16. 17. //System.out.println("This\nis\nbeginning!"); 18. 19. } 20. 21. } 20.

(27) 在這段例子中,第 6 和 10 列的是基本架構中提出的兩個宣告,第十二列 大括號裡面的“System.out.print( "This is beginning!");”為這個方法的主體內 容,使電腦印出雙引號中的字串(string),方法的主體每一個指令都需要加上 分號(;),否則也會被視為一個錯誤。在這道指令中,System.out 是「標準輸出 物件」(standard output object),它允許 Java 應用程式在執行的命令式窗 (comment window)裡顯示字元,而 “.println”即為方法。 同一個例子中還有//和/*兩個符號,雙斜線稱為「單行註解符號」(single-line comments)或「行末註解符號」(end-of-line comments),使用時是以「// 註解 內容」的方式呈現,代表與此符號在同一列的內容電腦不會執行;而斜線加 上星號稱為「多行註解符號」(multiple-line comments),使用方式為「/*註解 內容*/」,和雙斜線符號類似的情況,只是在這符號間的多列內容會被電腦忽 略不予執行。這類註解的功能,除了方便設計者自己閱讀外,也助於其他人 閱讀並了解程式。 另外,在範例中的第 12 列“System.out.println( "This is beginning!");”和第 14、15 列“System.out.println ( "This is ");”加上“System.out.println ( "beginning! ");”的組合這兩種敘述式的編寫方式,雖然編寫方式不同,但兩者產生的結果 是一樣的,都會列印出"This is beginning!"的結果。同樣是不同的編寫方式, 第 17 列敘述式的“System.out.println("This\nis\nbeginning!");”的情況就和上方 兩種不同,由於中間加入了“\n”為一個換行字元,以至於在後面的字元會回到 下一行的開始處,最終將產生以下結果: This is beginning! 21.

(28) 反斜線符號(\)被稱為是逸出字元(escape character),它可以命令 System.out 物件的 println 方法輸出特殊字元(即為例子中接在\n 後方的字元),而這類的逸 出字元加上一個英文字元形成「逸出序列」(escape sequence)的不同有不同用 法,常見的逸出字元如下表(表 3-1-1): 【表 3-1-1】常見的逸出序列 逸 出 字 說明 元 \n. 換行字元。將游標移到下一行起始處。. \t. 水平定位鍵。將游標移到下一個定位點。. \r. 歸位字元。將游標移回目前該行的開端,後續字元會覆蓋原先顯示字元。. \”. 雙引號字元。可以列印出雙引號。. 另外,輸出時的方式還有一種為格式化輸出,指令格式為 “System.out.printf(“%s”, “輸出內容”);”,其中的“%s”為一個佔位符號,所謂的 佔位符號是由一個百分比符號加上一個資料型別的英文字母組成,下表(表 3-1-2)列出其中四種: 【表 3-1-2】四種不同佔位符號 Java 符號. 名稱. %s. 字串的佔位符號. %d. 整數資料的佔位符號. %f. 浮點數資料的佔位符號. %b. 布林值的佔位符號. 22.

(29) 佔位符號的使用,主要是在輸出內容包含多種型別時,為了簡化並且避 免錯誤,將輸出內容先選擇其中一種型別為主體,其餘的為佔位符號的型式 代替。舉例來說,假如要輸出 “I am 24 years old.”這句話,在輸出時,可以選 擇以字串為主體,分離出整數型別的 24 的方式,寫成 “System.out.printf(”I am %d years old.”, 24); ”,如此,就能在輸出時避免型別不符而出現錯誤的可能性。這種佔位符 號也能在輸出內容包含多種型別的狀況下使用,能藉此省去針對各種不同型 別個別輸出的繁複手續,改以一次輸出的方式完成。 (二) 基本資料型別(primitive data type): 型別(type)在 Java 這種規類為強調型別語言(strongly typed language)的程 式語言中是一個不可或缺的要素。在 Java 語言的編寫過程當中,若是遇到使 用變數的情況時,對於每個變數都必須加以定義一個型別。而型別的不同, 牽涉到的是電腦記憶體中佔有值的不同,在 Java 語言中有八種基本資料型 別,如下表所表示(表 3-1-3):. 23.

(30) 【表 3-1-3】八種不同的基本資料型別 關鍵字. 型別名稱. 記憶體佔用量. 範圍 true 或 false (即 1 或 0,預設為. 布林值. boolean. 8 bits false). byte. 位元組. 8 bits. -128~127. char. 字元. 16 bits. 0~65535. short. 短整數. 16 bits. -32768~32767. int. 整數. 32 bits. -(231)~(231)-1. long. 長整數. 64 bits. -(263)~(263)-1 1.4E-45~3.4E+38. 單精度浮點數. float. 32 bits 或-1.4E-45~-3.4E+38 4.9E-324~1.97E+308. 倍精度浮點數. double. 64 bits 或-4.9E-324~-1.97E+308. 在過去的 C 語言和 C++語言中,即便是同一種型別,在不同電腦間也不 一定會佔有相同的值,但 Java 語言改善這個缺點,使得同種型別的記憶體佔 有值在任何平台上得以統一;舉例來說,型別中的 int,以往 C 語言和 C++語 言可能在某些電腦佔有 16 位元(即為 2 個位元組),有些則佔有 32 個位元(即 為 4 個位元組),但在 Java 裡,int 的值固定都是 32 個位元。 八種基本型別中,整數類(即 short, int, long)和浮點數類(即 float, double) 在本質上都是整數和浮點數,只是按其位數和佔有位元數的不同而有所差 異。所以,在編寫 Java 程式時,通常整數慣用型別為 int,浮點數慣用型別為 double。 24.

(31) 另外,除了上列基本型別外,亦可以依個別需求,在編寫時組合出新的 型別。舉例來說,先宣告一個名為 test 類別: 1. public class test 2. { 3. int i; 4. double j; 5. } 經過宣告,能藉由建立這個 test 類別的物件,形成一個新的資料型別 “test object = new test();”,這個資料型別的內容包含了一個連續的記憶體空間,如 同宣告中定義的,這個型別的連續空間是由 int 和 double 組合而成。 而除了八種基本型別可以做為新定義型別的基礎外,也能使用自定義的 物件為基礎。以例子 test 做延伸,把 test 物件當作基礎組合,宣告新的 test2 類別: 1. public class test 2 2. { 3. test t; 4. int i; 5. } 同理,在建立新的 test2 類別的物件“test object = new test2();”後,就可以 產生一個包含 test 和 test2 裡面內含的連續空間,也就是形成了含有兩個 int 和一個 double 的新類別。. 25.

(32) 第二節 Java 語言下的數學與邏輯. 一、 Java 中的數學概念 Java 應用程式在編寫時,主要就是一種數學和邏輯推演的概念,所寫出來的 程式內容包含一道又一道的運算式跟邏輯判斷式,交由電腦這個演算工具來做各 種高度精密的運算;像是前文中提及各種 API 中的類別,即是由程式設計師們有 系統的將以數學演算出的概念編寫而成,八種基本資料型別也明顯的反應出 Java 與數學的關連性。 而在以 Java 程式語言編寫數學算式時,也運用下列五種類型的運算子來構成: (一) 算數運算子(arithmetic operators): 在 Java 程式編寫的過程中所使用的各種運算子,即為在數學中使用的符 號(見表 3-2-1),其中要注意的為除法運算子(/)和餘數運算子(%)功能上的不 同,除法運算子會產生出整數的商,舉例來說,5 / 3 在運算後將會回傳 1;餘 數運算子(亦稱為模數,modulus)是給予兩數相除後的於數值,舉同樣例子, 在 5 % 3 運算過後,電腦將會回傳 2: 【表 3-2-1】各種算數運算子 Java 符號. 名稱. +. 加法運算子. -. 減法運算子. *. 乘法運算子. /. 除法運算子. %. 餘數運算子. 26.

(33) 在編寫各種算式時,都必須要寫成是單行的型式,即為 a + b, a / b 等等, 電腦在運算時將由左到右運行。而運算規則和數學概念相同,乘法、除法和 餘數會先行運算,然後才是加法和減法;假如想要先運算加法和減法部分, 則需要將加法或減法的運算式放在括號之中。 (二) 等號運算子和關係運算子: 條件式的運算式,主要是讓電腦判定其真(true)或偽(flase)。在後面章節 中,將會使用到 if 結構敘述式(if statement),在下表(表 3-2-2)中列出在其中使 用的等號運算子以及關係運算子。 【表 3-2-2】各種等號運算子及關係運算子 Java 符號. 範例. 名稱. ==. x==y. 等於. !=. x!=y. 不等於. >. x>y. 大於. <. x<y. 小於. >=. x>=y. 大於等於. <=. x<=y. 小於等於. 雖然說每個的功能都是在於判定是否符合條件式裡的關係,但>=和<=是 只要符合其中一項條件即會回傳為真。 (三) 複合指定運算子(compound assignment operators): 複合型態的運算子是以簡化的方式,縮短指定運算式,第一種類型就是. 27.

(34) 將原先完整的算數公式予以簡化的方式,只要敘述式符合下列型式: variable = variable operator expression; 就能簡化成下列型式: variable operator= expression; 舉例來說:x = x + 2,可以利用加法複合指定運算子轉換成 x += 2 寫法, 如此一來,運算子會將運算子右方的運算數值和左方的變數值相加後,再存 回左方的變數,也就是說即便再例子中看到的是 x = x+2,但就結果而言等號 左方和右方的數值並不相同,這類的運算子由於對應的算數運算子的不同, 也分成五種(見表 3-2-3)。 【表 3-2-3】指定運算子 指定運算子. Java 表式方式. 一般表示式. +=. x += y. x = x+y. -=. x -= y. x = x-y. *=. x *= y. x = x*y. /=. x /= y. x = x/y. %=. x %= y. x = x%y. 另外還有一種運算子可以使得變數的質遞增或遞減 1,這兩種運算子稱做 為遞增運算子(increment operator)和遞減運算子(decrement operator),而這兩種 運算子在使用上又可以各別分成前置遞增和後置遞增以及前置遞減與後置遞 減兩類,如下表(表 3-2-4)所表示。. 28.

(35) 【表 3-2-4】遞增、遞減運算子 定義. 運算子. Java 表示方式 x++. 遞增. ++ ++ x x--. 遞減. --- x. 前置與後置的不同,在於前置的++ x 和--x 是在運算式中使用先加過和減 過的新的 x 值,後置的 x++和 x--則是先套用目前 x 的值,然後在進行運算的 動作。 (四) 邏輯運算子: 邏輯運算子在使用上不是用於計算,而是在各種敘述式(像是 if, for, while) 中,將簡單的條件式組合成較複雜的條件式,而這類的運算子有以下六種(見 表 3-2-5):. 29.

(36) 【表 3-2-5】條件運算子 運算子符號. 範例. 結果. (假設 x = T, y = F) 條件 AND. 條件 OR. &&. ||. 布林邏輯 AND. 布林邏輯包含 OR. 布林邏輯互斥 OR. 否定邏輯. &. |. ^. !. x&&y, y&&x. F, F. x&&x, y&&y. T, F. x||y, y||x. T, T. x||x, y||y. T, F. x&y, y&x. F, F. x&x, y&y. T, F. x|y, y|x. T, T. x|x, y|y. T, F. x^y, y^x. T, T. x^x, y^y. F, F. !x. F. !y. T. 就以上範例的結論,在條件 AND 的情況下,比較的值中包含一個偽(錯誤) 即會回傳為偽,反之在條件 OR 的情況下,只要比較的值中包含一個真即為 真;互斥的情況下,兩個比較值為相反為真,相同則為偽,否定邏輯則是將 原先的性質予以否定,產生相反的結果。. 30.

(37) 二、 Java 語言中的選擇敘述式 Java 語言在編寫中,在許多地方會需要讓程式本身有條件的做出選擇。這類 牽涉選擇邏輯的句子就稱為選擇敘述句(selection statement),這類的選擇敘述句總 共 有 三 種 , 單 一 選 擇 敘 述 式 (single-selection statement) 、 雙 重 選 擇 敘 述 式 (double-selection statement)以及多重選擇敘述式(multiple-selection statement)。 在後文各種範例中會使用到資料輸入的方式,將會運用到 Scanner 類別的 API(即為 java.util.Scanner),當在編寫程式碼時,若是需要使用到各種 API,將會 在最開始以 Import 宣告引入類別,以引入 scanner 為範例,必須要在最開始編寫: import java.util.Scanner; 才能在後文建立物件: Scanner input = new Scanner( System.in ); 當以上兩個步驟完成後,可以藉由執行時輸入不同的數值使程式讀取,以整 數 int 為例,可以用下列方式先假設一個自行輸入的整數變數 a,以下列方式: int a; a = input.nextInt(); 使得使用者得以用鍵盤輸入對應數值,也可以輸入倍精度浮點數、空白字元 以及字串…等,即為把.nextInt()改成.nextDouble(), .next()以及.nextLine()。 接著是對於單一選擇敘述式、雙重選擇敘述式以及多重選擇敘述式這三種類 別的說明、結構圖以及範例: (一) 單一選擇敘述式:if 單一選擇敘述式,是使程式能從多種替代方案中選擇一種的方式,主要 結構依照編寫習慣,可以有下表(表 3-2-6)中所列出的三種表現方式:. 31.

(38) 【表 3-2-6】單一選擇敘述式結構圖 結構一. if ( 布林條件式 )條件為真時執行區段;. 結構二. if ( 布林條件式 ) 條件為真時執行區段; if( 布林條件式 ). 結構三. { 條件為真時執行區段; }. 以數學的概念來講,單一選擇敘述式用於常見的「當 x 大於等於某數值, y 則為正數(狀況 a);反之,當 x 小於某數值,y 則為負數(狀況 b)」,這類非 a 即 b 的邏輯概念。 舉例來說,假如以基分 100 為條件,100(含 100)以上即過關,不到 100 則挑戰失敗的概念來寫成敘述式(見範例三)。 【範例三】單一選擇敘述式範例(使用第二種結構編寫) 1. import java.util.Scanner; 2. 3. 4. public class IfExample { 5. public static void main( String args[] ) 6. { 7. 8. Scanner input = new Scanner( System.in ); 9. 10. int score; 11. 12. System.out.print ( "Enter the score : " ); 13. score = input.nextInt(); 14. 15. if ( score >= 100 ) 16. System.out.println( "Passed" ); 17. 18. }. 32.

(39) 這段程式碼中,單一選擇敘述式的部分為第 15 和 16 列的 if 敘述式,第 15 列的(score >=100)為這個敘述式的條件,第 16 列是使得程式判定若是積分 大於 100 則印出”Passed”的字樣,若未達到條件則不會回報。 前文中提到的 Scanner 類別的建立物件及宣告方法,分別編寫在第 8(建立 物件)、第 10 和第 13 列中(宣告方法)。 (二) 雙重選擇敘述式:if…else 雙重選擇敘述式為單一選擇敘述式的延伸,同為在一個規則下判定結 果。但單一選擇敘述式只可以另程式在滿足條件的情況下給予結果,雙重選 擇敘述式則是把前面文章中提到的「當 x 大於等於某數值,y 則為正數(狀況 a);反之,當 x 小於某數值,y 則為負數(狀況 b)」這種數學邏輯概念的 a 和 b 兩面都表示出來。基本結構有兩種表式方式,如下表(表 3-2-7): 【表 3-2-7】雙重選擇敘述式結構圖 結構一. if ( 布林條件式 ) 條件為真時執行區段 esle 條件為假時執行區段 if ( 布林條件式 ) { 條件為真時執行區段 } else { 條件為假時執行區段 }. 結構二. ; ;. ;. ;. 延續單一選擇敘述式的例子,只要在原先第 15 和 16 列的 if 敘述式後面 加入 else 的條件,如下方範例(範例四): 【範例四】範例三改以 if…else 敘述式的方式 15.. if ( score >= 100 ) 33.

(40) 16. 17. 18.. System.out.println( "Passed" ); else System.out.println( "Failed" );. 在這個範例中,if…else 敘述式只在 if 後方設立有條件,else 後方則沒有, 但可以想成在 else 後面接有( score < 100 )這個條件會更容易理解。而這段程式 碼在執行後,在單一條件式時,不回報為滿足條件的情況就會消失,取而代 之的當輸入小於 100 的值會回報”Failed”。 (三) 多重條件敘述式:switch 多重條件敘述式用於根據某一變數,或是某一運算式的可能數值執行不 同的工作。每個工作會和一個整數常數表示式(constant integral expression)相 關。11 Switch 敘述式會判定演算數值與哪一個整數常數表示式相等,進而採 取後續動作,基本結構如下表(表 3-2-8): 【表 3-2-8】多重條件敘述式結構圖 Switch 結構. 結構 : switch ( 控制運算式 ) { case 整數常數表示式 : 程式區段 ; break; case 整數常數表示式 : 程式區段 ; break; case 整數常數表示式 : 程式區段 ; break; default : 程式區段 ; break; }. 11. 整數常數表示式為型別是 byte, short, int 或是 char 的常數值,但不包含型別 long。. 34.

(41) 從結構圖中可以看到,每一個表示式都是一個 case,case 和 case 間需要 以 break 分隔,才能使得程式在執行時可以區分每個不同 case 的區段。下面 是延續前面分數範例予不同分數範圍不同等級判定的範例(範例五): 【範例五】多重條件敘述式範例 1. import java.util.Scanner; 2. 3. 4. public class SwitchExample { 5. public static void main( String args[] ) 6. { 7. 8. Scanner input = new Scanner( System.in ); 9. 10. int score; 11. 12. System.out.print( "Enter the score : " ); 13. score = input.nextInt(); 14. 15. switch((score-100)/20) 16. { 17. 18. case 5: 19. System.out.print("A"); 20. break; 21. 22. case 4: 23. System.out.print("B"); 24. break; 25. 26. case 3: 27. System.out.print("C"); 28. break; 29. 30. case 2: 31. System.out.print("D"); 32. break; 33. 34. case 1: 35. System.out.print("E"); 36. break; 37. 38. default: 39. System.out.print("Standerd"); 35.

(42) 40. 41. 42. 43. 44. 45. }. break; } }. 如同範例所表示,此switch的控制運算式為第15列switch後方括號內的 (score-100)/20,意即扣除了標準分100後,以20分的範圍為一個等級差距,case 後面銜接的數字即為運算式中的結果數值,以範例而言韻算出來的商為5則會 回報為A,商為4則會回報為B,以此類推。default為首的情形,即為不符合上 述任何一種情況時的所要執行並回報的結果。 在前文中提到以break來做為每個case的區隔,若是在上述範例中把case5 和case4中的break移除,再輸入商為5的數值的情況下,程式將會連續執行兩 個case,並在最後回報AB。 另外除了switch的敘述外,尚能使用if…else這種雙重選擇敘述式串聯的方 式編寫,以範例五為基礎將第15到41列的區塊換成下面範例(範例六)的if…else 程式碼: 【範例六】if…else程式碼替換 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.. if ( score >= 200 ) System.out.println( "A" ); else if ( score >= 180 ) System.out.println( "B" ); else if ( score >= 160 ) System.out.println( "C" ); else if ( score >= 140 ) System.out.println( "D" ); else if (score >=120 ) System.out.println( "E" ); else System.out.println( "Standard" ); 即可得到相同的結果,但此方式相對的必需在每個if後方須重新定義,在. 多種情況運用下較為麻煩;優點在於,它可以對應各種算式和規則,不像switch 36.

(43) 只能對應在整數常數表示式的情況,在使用的層面上較為廣泛。因此,對於 程式編寫者而言,也必須就方便性及效率考量來決定要使用哪種方式編寫。. 三、 Java 語言中的迴圈敘述式 迴圈敘述式(looping statement,亦稱為重複敘述式,repetition statement,或簡 稱為迴圈,loop)在執行時,可以在條件為真的情況下,讓程式本身持續重複動作。 這類的敘述式常用的分成三種:while 迴圈敘述式、for 迴圈敘述式以及 do… 迴圈敘述式,三種敘述式中,while 迴圈敘述式和 do…while 迴圈敘述式兩者本質 上是相同的,只是在編寫時的結構相反,結構如下表(見表 3-2-9): 【表 3-2-9】while 和 do…while 迴圈敘述式的結構 while 迴圈敘述式結構. while ( 迴圈繼續條件式 ) { 迴圈主體內容; } do. do…while 迴圈敘述式結構. { 迴圈主體內容; }while(迴圈繼續條件式). 從表中可以看到,兩者的差異在於判斷和執行的先後順序,while 迴圈敘述式 是先判斷才執行,相反的,do…while 迴圈敘述式則為先執行後才判斷;邏輯上相 同的部份是這兩者在編寫時,並無法預期是否會有終點,等同於可能會有無窮迴 圈的可能。說明部分如下列範例(範例七)中表示:. 37.

(44) 【範例七】while 迴圈敘述式範例 1. public class WhileLoop { 2. 3. public static void main( String args[] ) 4. { 5. int number = 1; 6. 7. while ( number <= 100 ) 8. { 9. System.out.printf( "%d\n", number ); 10. number = number + 2; 11. } 12. 13. } 14. } 此範例要執行的概念,具體來說是要讓程式回報出所有小於 100 的奇數,第 5 列先宣告一個整數 number 是 1,第 7 列 while 後方的小括號中設定了執行繼續條 件為 number <=100,具體執行的內容為第 10 列的 number = number+2,假如換成 do…while 迴圈敘述式的情況就把原先 while 的區塊替換成下列範例(範例八),會得 到相同的結果: 【範例八】do…while 迴圈敘述式範例 7. do 8. { 9. System.out.printf( "%d\n", number ); 10. number = number + 2; 11. } 12. while( number <= 100 ); 這個範例由於在預設條件時是有一個範圍的,所以執行上是有終點的情況。 但若是要改變成是一個無限制迴圈敘述式的情況,只需把條件部分從原先 number <= 100 改成 number > 0,電腦本身就會就其運算效能回報出無限累加的結果。 for 迴圈敘述式和上述 while 迴圈敘述式及 do…while 迴圈敘述式則不同的地方 就在於在設計時,設計者本身已確定有終點,所以在編寫時,除了原先在 while 和 do…while 中的條件式之外,另外還包含了起點和遞增量,其結構為“for ( 初始式; 38.

(45) 迴圈繼續條件式; 遞增量 ){迴圈主體內容 ;}”,若是同樣要做成條列出比 100 小的 所有奇數的範例,編寫的邏輯就得改成下列範例(範例九)中的形式: 【範例九】for 迴圈敘述式範例 1. public class ForLoop { 2. public static void main( String args[] ) 3. { 4. 5. for(int number = 0; number <= 99; number++){ 6. number = number +1; 7. System.out.printf( "%d\n", number); 8. 9. } 10. } 雖然同樣是得到相同結果,但就邏輯上而言,不管在初始值、條件和執行內 容都有些微的落差,之所以有這種差異性是在於,在while和do…while的情形中, 整數number是把初始值和每次運算的結果重複帶入執行的內容去得到結果,但for 的情況則是以小括號中:number從0開始且每次得出number還要遞增1再帶入,最 終number只能在99以下的方式得出結論為1, 3, 5, 7…99的奇數,換言之,for迴圈敘 述式在執行時,每次執行結果都要再次經過遞增量的條件重新帶入,假如把原先 number = number+1換成number = number+2即可看出明顯的差異,在此改變下,回 報數值就會變成2, 5, 8, 11…的等差數列,但實際上條件裡只有設定number+2,於 此,即能看出遞增量對於for敘述式的影響。就結論而言,while和do…while是在判 斷前後都只執行括號內的工作,for則是在每次的執行行為結束後,都會再重新帶 回條件式中判斷。 再用一個更簡單明瞭的範例來解釋,假如執行下方範例(範例十)的程式碼: 【範例十】for迴圈敘述式範例(二) 1. public class ForLoop2 { 2. public static void main( String args[] ) 3. { 39.

(46) 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. }. int n = 0; for (n = 0; n < 5; n++) { System.out.println( n ) ; } System.out.println( ) ; System.out.println( n ) ; } 此範例最終回報出的結果為:0, 1, 2, 3, 4,並在空一列後回報5,於此,能從. 範例判讀,即使沒有任何經過運算的過程,每一次在執行迴圈中的指 令”System.out.println( n ) ;”後,都會帶回到for後面條件的遞增量再多加一次運算。 即回報出來的值:0, 1, 2, 3, 4, 5雖然都是n的數值,但0, 1, 2, 3, 4是迴圈內部n 的帶入值,5則是迴圈結束後最後的結果值。若是要解釋其運作的邏輯,必須解釋 為:在回圈內部帶入的值並沒有大於5,可是最終執行5次迴圈過後,4帶入遞增完 後最終值為5。結論為:在小括號中的遞增量,其實可以當作為迴圈執行的倒數第 二個動作,最後一個動作則是使用條件比對條件有沒有成立。. 40.

(47) 四、 Java 語言中的陣列 陣列是一群包含數值的變數(稱為元素,elements;或稱為分量,component, 後文將以元素稱之),且這些數值都為同一種型別的元素。在型別的分類中,型別 可以分成基本型別和參照型別兩類。而陣列本身屬於參照型別,但其內函的元素 卻有可能是兩者其中的任一種,再要使用陣列中的特定元素時,必須要指出陣列 的參照名稱,以及該元素的位置編號,而元素的位置編號通常被稱為是元素的索 引(index)或是下標(subscript)。 接著第一個步驟是宣告與建立一個空陣列,在宣告一個陣列建立的運算式 (array-creation expression)時,需指名陣列元素的型別以及元素數目,從下面的範例 (範例十一)中: 【範例十一】空陣列宣告範例 int a[]; a = new int [10]; 陣列的宣告和前面宣告新的變數或型別時的方式是相同的,都要以關鍵字 new 來建立。在這個範例中,型別是一個整數(int),參照的變數或是這個陣列本身的名 稱為 a,中括號([],square brackets)中的數字代表這個陣列中含有的元素數量(即為 此陣列的大小)。有一個重要的觀念是,每個陣列的第一個元素,在索引時為 0(index zero),又稱為第零元素(zeroth element)因此在這個陣列中的元素依序為:a[0], a[1], a[2]…a[9],即索引數為括號中的數減一。 同時陣列宣告的方式也有下列的簡化寫法: int a[] = new int[10]; 假如在編寫程式碼過程中要以陣列中的元素來做運算,在編寫上,就以元素 索引代替元素的值,像是要求其中奇數元素的組合,可以編寫成”sum = a[1]+ a[3]+ 41.

(48) a[5]+ a[7]+a[9];”,或者要將其中一個元素做乘法運算,可以寫成”x = a[0]*2”以此 類推。 (一) 空白陣列的使用: 空白陣列的使用情況是,當程式碼太多時,為了方便閱讀,會事先宣告, 並在後面的程式碼終把內容填上。也就是說上述的宣告完之後,空白陣列中 是沒有任何數值的。下面範例(範例十二)是以範例十的宣告為基礎來延伸,先 運用輸出的程式碼,將其索引和值條列出: 【範例十二】範例九索引及數值條列 1. public class Array1 { 2. public static void main( String args[] ) 3. { 4. int a[] = new int[10]; 5. a = new int[10]; 6. 7. System.out.printf("%s%8s\n", "Index", "Value"); 8. 9. for(int counter=0; counter< a.length; counter++) 10. System.out.printf("%d%8d\n", counter, a[counter]); 11. } 12. } 輸出的結果會是: Index 0 1 2 3 4 5 6 7 8 9. Value 0 0 0 0 0 0 0 0 0 0. 在範例裡,空白陣列的內容是以迴圈的方式處理,只設定條件是要在元 素數量內(counter < a.length),且每次逐漸累加(counter++),下方沒有提供任何. 42.

(49) 關於數值的條件。但倘若在 for 迴圈下方增加關於數值的條件,譬如說,增加 算式”a[counter]= counter*counter;”,如此一來,輸出的索引和數值將會變成為 索引號的平方: Index 0 1 2 3 4 5 6 7 8 9. Value 0 1 4 9 16 25 36 49 64 81. (二) 陣列初始設定式(Array initializer): 不同於空白陣列的宣告,陣列初始設定式可以將內部元素初始化,意即在 編寫時,可以在一開始定義內容的初始數值,而陣列大小程式本身將會就設定 數值的元素個數自動判定。自定義的元素內容,將會以大括號將由逗號分隔的 運算式(稱做是初值列,initializer list)包覆的方式呈現,像是以下範例(範例十 三): 【範例十三】陣列初始設定式 int a[]= {1,3,5,7,9,11,13,15,17,19}; 這段程式碼可以解讀成,此為一奇數組成的陣列,且這個陣列內含 10 個 元素,舉例來說,這個陣列的 a[0]為 1,a[9]為 19,每個相應的數值已給予定 義。而這種方式的宣告就不用關鍵字 new 來定義,且元素的數值也可以是重複 的數字或是多個數字的群組,如同下方範例(範例十四)的表示方式。 【範例十四】陣列初始設定式之數字群組 int a[][]= {{1,3,5},{7,9},{11,13,15,17},{19}};. 43.

(50) 由多個數字組成群組的情況下,同樣的每個元素也要在以大括號包覆,在 範例十二中,這個陣列的元素個數總共有四個,宣告時用 a[][]方式呈現,之所 以用兩個中括號,是在呼叫陣列中的元素時所需,一個括號是陣列中的第幾個 元素,另一個是該元素中的第幾個元素,也就是說 a[2][2]即為 15。 五、 Java 語言中的數學類別和亂數類別 除了上述幾個基本的運算子跟敘述式外,Java 程式語言數學類別的 API(即為 java.lang.Math)中,也有將一些原先需要經過繁複記算過程才能得到結果的數值, 用簡化後的方法指令來作替代,像是求三角函數的正弦值(sin)、正切值(cos)或是指 數、對數…等等,這一類的方法眾多,在下列表格(表 3-2-10)中僅列出部分較常用 的方法:. 44.

(51) 【表 3-2-10】數學類別中常用方法 方法. 說明. abs(x). 求 x 的絕對值. ceil(x). 求大於 x 的最小整數. floor(x). 求小於 x 的最大整數. cos(x). 求 x 的餘弦函數值(x 為弧度). sin(x). 求 x 的正弦函數值(x 為弧度). tan(x). 求 x 的正切函數值(x 為弧度). exp(x). 取 x 的指數(e^x). log(x). 取 x 的對數值(基底為 e). sqrt(x). 取 x 的平方根. pow(x,y). 取 x 的 y 次方值. max(x,y). 取較大值. min(x,y). 取較小值. random(). 回傳一介於 0.0 到 1.0 間的係數. 在這一類的資料型別中,不管輸出和輸入都是 double 型別,宣告的方式以求變 數 x 絕對值變數 f 為例,寫成 “double f = Math.abs( x );”。 另外,數學類別中雖然有亂數的方法“random()”,但它只能對應 double 型別。 因此,假如要遇到要使用亂數指令的情況,Java 程式語言的 API 中也有亂數類 別”java.util.Random”,其用途比起原先數學類別中的亂數更廣泛,涵蓋多種型別, 在後文的音樂創作中,也是一種較常使用的方法,下表(表 3-2-11)列出的也是較. 45.

(52) 為常用的亂數物件方法: 【表 3-2-11】亂數物件方法 方法. 說明. nextBoolean(). 傳回隨機 boolean 型別的布林值 傳回隨機 double 型別的浮點數值. nextDouble() (介於 0.0 到 1.0 之間) 傳回隨機 float 型別的浮點數值 nextFloat() (介於 0.0 到 1.0 之間) 傳回隨機 int 型別的整數值. nextInt(). 傳回隨機 int 型別的整數值 nextInt(int n) (介於 0 到 n 之間) 傳回隨機 int 型別的長整數值. nextLong(). 這類方法的建立有分成兩種,一種是求隨機的亂數,另一種則是求固定的亂 數,在執行亂數類別敘述式之前,必須要以無範圍的“Random randomNumber = new Random();”;或是以建立固定亂數(seedValue 為 long 型別的數值) 的“Random randomNumber = new Random( seedValue );”這兩種方式來編寫。 在上述程式碼為先決條件情況下,後方只要用“randomNumber.*”(星號部分可 以使用表 3-2-11 中任一方法),即可以執行亂數指令;但表中“nextInt(int n)”的方法 雖然可以設定上限值,但有些時候在亂數時不僅需要上限值,同時也需要非 0 的 下限值(即負數或 0 以上的數值),因此在這種時候需要加上平移值,以「平移值 +randomNumber. nextInt(縮放比例係數);」的結構來編寫,小括號中所謂的縮放比. 46.

(53) 例係數,以“randomNumber.nextInt(99);”為例,意思是等同於這個亂數指令將從 0 到 99 之間隨機挑選,但假如在編寫時需要下限值為 10,就必須要在前方加上 10(即 平移值)而變成“10+randomNumber.nextInt(99);”,不過這樣調整後,這道亂數指令 的範圍變成了 10 至 109 之間,上限值會隨之變化,所以若是要將範圍侷限在 10 至 99 的情況,則必須在下限值增加的同時,上限值也隨著減少相同數值,以此為 例子,最終必須要寫成 “10+randomNumber.nextInt(89);”,才會是在提升下限值後, 上限值維持在相同數值的狀態;反之若是在下限值往下調整(即為負數值)的情況 時,上限值若是想維持不變,則需要把減少的值加回來。. 47.

(54) 第三節 數學概念帶入音樂. 在第二節中,使用 Java 語言編寫程式時所需要的基礎邏輯概念,諸如提供條 件的選擇敘述式還是在符合限制條件下使得本身能夠不斷運作的迴圈敘述式等等 都以提供範例與說明,但 Java 語言在使用上,扣除了這些基礎敘述式外,仍有許 多延伸的指令以及更功能多元的各式類別庫,接下來將在本章節中介紹音樂創作 上重點 API “jMusic”裡操作上所需俱備的一些基本概念。 一、 jMusic 中 MIDI 製作相關基礎常用物件名稱 以 jMusic 創作時,整體檔案構成結構和譜面創作時的結構是相同的,在樂譜 (score)底下包含聲部(part),底下一層是樂句(phrase),最小元素為音符(note),如同 下圖(圖 3-3-a)所表示: 【圖 3-3-a】jMusic 創作階層樹狀圖 總譜(包含數個聲部及其之下階層) 聲部(包含數個樂句及其之下階層) 樂句(包含數個音符) 音符. jMusic 的使用,和使用其他 API 時都必須經過的步驟相同,必須要先編寫引 入指令,而套件位置都是以“jm”為首,而“jm.*”也是其中一類,這一類型的類別庫 則是已經經由程式設計師把一些關鍵字定義過,像是音高、音長等等,其他尚有 六個不同類型的宣告,詳見下表(表 3-3-1):. 48.

(55) 【表 3-3-1】jMusic 中常用的六個不同功能類別庫引入指令 指令. 說明. jm.music.data.*. 使得檔案得以使用音樂類型數據. jm.music.tools.*. 讓使用者可以操作、產生或是編輯 jm 類型檔案. jm.midi.*. 使檔案可以讀取或編寫 SMF 類型檔案. jm.midi.events.*. 使檔案可以執行 MIDI 類型中的事件,如 NoteOn, NoteOff 等. jm.audio.*. 使檔案得以產生、讀取、匯出和編寫 audio 類型檔案. jm.until.*. 包含類別中使得檔案得以轉換和修改 jMusic 的檔案. 一般而言,大部分的 jMusic 的檔案的引入敘述式至少有下面範例(範例十五) 中的三列: 【範例十五】jMusic 基本引入敘述式 1. import jm.JMC; 2. import jm.music.data.*; 3. import jm.util.*; 有了上列三個引入敘述式後,後面所有編寫程式碼才得以執行,不會有錯誤 產生。接著,以此引入敘述式為基礎,編寫一個單音發聲 A 的範例(範例十六): 【範例十六】jMusic 範例:單音發聲 1. import jm.JMC; 2. import jm.music.data.*; 3. import jm.util.*; 4. 5. public class PracticeMusic1 implements JMC { 6. 7. public static void main(String[] args) { 8. 9. Note n = new Note(A4, 1); 10. 11. Phrase phr = new Phrase(); 12. phr.addNote(n); 49.

(56) 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. } 23.}. Part p = new Part(); p.addPhrase(phr); Score s = new Score("Bing"); s.addPart(p); Write.midi(s,"Bing.mid"); Play.midi(s);. 這個範例明顯顯示出圖 3-3-a 階層相扣的概念,各類型的宣告方式和第二章數 學中宣告變數的概念相同,即為使用 “new”關鍵字來做宣告。在本範例中第 5 列 的 “public class PracticeMusic1 implements JMC ”在之後任何使用 jMusic 編寫一 個新的類別時,都需要以 “public class 類別名稱 implements JMC”的格式來編 寫,使得該程式碼能使用 JMC 類別中的物件。其他部分,第 9、11、14 及 17 列 就是對應音符、樂句、聲部以即樂譜名稱的宣告;接續第 12、15、18 和 21 列即 是 使 其 將 前 一 個 階 層 代 入 , 代 入 的 部 分 皆 以 “ 新 的 階 層.addNote/.addPhrase/.addPart(要套用較低階層名稱);”這種型式編寫,只是在音 符、樂句及聲部之間抽換。 (一)音符與樂句-音高的宣告及陣列的應用 在範例十四中另外一個重點是關於音高的宣告,jMusic 對於音符個輸入 結構是以 “Note(pitch, length)”的方式輸入,音高輸入的內容有兩種,一種是 以絕對音名的輸入方式,12 另一種則是以 MIDI 標準音高來輸入。13 以範例. 12. 絕對音名是以科學音調表示法(scientific pitch notation)這種使用英文字母和數字組. 合而成的紀錄法,在這種紀錄法中數字部分為頻率的基頻,舉例來說,和中央 C 同個八 度的高音譜記號的第二間 A 即可標示為 “A4”或是 “A440”。 13. MIDI 標準音高主要是針對絕對音名輸入可能產生的認知上的問題而延伸出來的. 紀錄方式。主要是將原先的基頻 f 以 p = 69+12*log2(f/440)這道算式轉化為數字 p 的方. 式來表示。這種方法將原先絕對音名隨著高低不同八度調整大小寫字母及數字的 50.

參考文獻

相關文件

檢視 檢視「 「 「 「輸出 輸出 輸出 輸出」 」 」 」視窗表示 視窗表示 視窗表示 視窗表示 程式碼沒有任何錯誤

敦煌患文雖然是禮懺法門的應用文書,有點格式化與過分老套的語言形式,但是卻保存

關於理解和連結的後設認知、以及對數學價值 的賞識態度。包括「為什麼要這樣」、「為什 麼是這樣」等問題的理解。「識」很難被翻譯

二、 學 與教: 第二語言學習理論、學習難點及學與教策略 三、 教材:.  運用第二語言學習架構的教學單元系列

•三個月大的嬰兒在聆聽母語時,大腦激發 的區域和成人聆聽語言時被激發的區域一

有關於 Java 程式語言,下列何者敘述不正確?(A)Java 程式語言透過 extends 提供多重繼承 (Multiple

多跟孩子說故事及看圖書,既可 訓練孩子專注力,又可鼓勵孩子

語音四要素 語音四要素與朗誦的關係 音高 語音的高低抑揚顯示語言的節奏感 音強