2024/10/31

Beyond 粵語歌曲歌單

Beyond 是香港搖滾樂隊。在主唱黃家駒在 1993 年在日本東京富士電視台錄制遊戲節目《想做甚麼,就做甚麼》上因為節目設計問題而意外去世後, Beyond 其它成員(主音吉他: 黃貫中、貝斯: 黃家強、鼓: 葉世榮)與滾石簽五年約,繼續以 Beyond 的名義發展。

下面是我讀一些新聞以後的想法。在一些訪談中,有提到黃家駒在意外幾個月前聊天時其實就有提過他擔心他會跌倒發生意外的事情。如果觀察整個 Beyond 的發展歷史,那麼或者黃家駒在樂隊成為香港的頂尖樂隊之後就開始有了這種預感, 因為可以觀察到,雖然黃家駒是主唱,但是在專輯裡其它三人也有一些個人創作並且在一些歌曲擔任主唱的時候, 就像是為了預防他如果意外離開,其它三人如果想繼續(即使是個人單飛發展),就可以繼續自己的音樂路。

而在黃家駒意外死亡後,這個時候 Beyond 其實有三種選擇:

  1. 從外界選擇一個新主唱。這個想法不可行的原因是 Beyond 是個極為優秀的創作樂團,所以如果要接下這個位置, 除了唱功要好,至少還需要優秀的作曲與編曲能力,這讓人選近乎為零。
  2. 不用設置主唱,而是三人各自以及合作創作,該歌曲的主創作人就是該歌的主唱。
  3. 三個人裡選擇一個新的主唱,而從使用樂器以及才華來說,就算不如黃家駒, 音樂才華也是十分優秀的黃貫中足以帶領 Beyond 繼續前進,同時樂隊也重新有了創作中心。

事後來看,這就是黃家強身為黃家駒的弟弟與黃貫中的不可協調之處。 一開始的時候是選項二,但是在滾石五年約快結束的時候黃貫中與黃家強在葉世榮不知道的情況有過談判, 葉世榮是選項二和選項三都可以,但是黃家強只接受選項二(因為是黃家駒的弟弟,所以他心裡只接受主唱是他哥哥), 黃貫中卻從幾個專輯的製作中意識到因為三個人有不同的音樂風格,如果要繼續走下去,他認為 Beyond 需要一個新主唱作為創作中心, 而他希望那就是他,但是黃家強直接而且不留餘地的否決,所以 Beyond 暫時解散及三人各自發展。

而後,在 2003 年為了紀念樂隊成立 20 周年,所以又短暫合體,並且把黃家駒一首遺作重新編曲出版,成為紀念周年作《抗戰二十年》。 但是問題一樣存在,而黃家強一樣堅持自己的想法,結果就是 Beyond 正式解散。這也是為什麼黃家強說 Beyond 緣盡了, 黃家強和黃貫中的主張在他們的立場而言都是正確的,但因為黃家強太愛他的哥哥,所以完全沒有調和的可能性。

我以聽 Beyond 國語歌曲為主,不過歌單中還是有放一些粵語歌曲(不固定,所以這只是我現在的歌單)。

  • 再見理想

    原為講述舊一代玩樂隊和在夜總會伴奏的樂手的際遇,其中由黃家駒獨唱的版本收錄在 1986 年自資發行的同名專輯《再見理想》中。 由樂隊四名成員共同參與演唱的版本收錄在 Beyond 1988年發行的粵語專輯《秘密警察》中。 歌名可以有二個意思,黃家駒獨唱的版本像是再見了理想,而四名成員合唱的版本則是再見到了理想。

  • 昔日舞曲

    有一天黃家駒拿著吉他走到街上,經過天橋時,橋下有個乞丐拉住了黃家駒的吉他,黃家駒對他說自己也沒有錢給他了。 可是那個乞丐並不是想要錢,黃家駒不懂他的意思。於是乞丐叫黃家駒坐下,向黃家駒訴說了自己昔日的理想,過去從事的事業、奮鬥的歷程以及歷經的輝煌等。 乞丐這番話使得黃家駒感慨頗深,並激勵了年輕的黃家駒在今後的音樂生涯中不斷奮鬥不斷超越自己。於是黃家駒寫了《昔日舞曲》這首歌, 以此紀念那個乞丐與他的談話,表達對音樂理想的不懈追求。這首歌收錄在 EP《永遠等待》中。

  • 亞拉伯跳舞女郎

    Beyond 第一張商業專輯《亞拉伯跳舞女郎》的同名主打歌。 《亞拉伯跳舞女郎》是一張充滿中東風情的概念專輯,專輯中充滿幻象與歷奇的場景。

  • 東方寶藏

    由《Long Way Without Friends》重新填詞並且加上中東音樂風格的版本, 收錄在《亞拉伯跳舞女郎》中。

  • 舊日的足跡

    《舊日的足跡》創作於 1985 年,歌曲靈感來自於黃家駒的一位好友 Mike Lau。 Mike Lau 故鄉在北京,為了學電影而遠赴美國, 十年後終於回到故鄉,感觸頗深。他來到香港後與黃家駒暢談自己的感想,黃家駒便將他這份思念故鄉的情懷寫進《舊日的足跡》一曲之中。 《舊日的足跡》最早收錄於 1986 年自資發行的《再見理想》中,而後在《現代舞台》中也有將前奏改為鋼琴的版本。我喜歡的是改為鋼琴的版本。

  • 冷雨夜

    《冷雨夜》由黃家駒作曲。黃家強聽到該曲的小樣之後,非常喜歡這首歌,並挑選了它收錄進 Beyond 樂團的專輯裡。 在 1991 年的演唱會裡,黃家強在《冷雨夜》表演的貝斯獨奏是為人稱道的經典。 國語版為《緩慢》。

  • 大地

    《大地》(1988年粵語、1990年國語)由黃家駒作曲,由黃貫中主唱(粵語及國語)。 《大地》歌詞隱喻兩岸中國人長年分隔的骨肉分離的滄桑。

  • 喜歡妳

    《喜歡妳》是黃家駒寫給和自己已經分手的女友的一首歌。最初做音樂時,由於某些原因黃家駒不得不放棄深愛著的女友, 把時間和精力放到音樂之中,這令他十分愧疚。所以他便寫了《喜歡妳》這首歌,表達對失去愛情的苦楚。

  • 真的愛妳

    《真的愛妳》收錄於《Beyond IV》大碟,為該專輯的主打歌。歌曲以讚頌母愛為主題,表達了對母愛的讚揚。

  • 歲月無聲

    《歲月無聲》收錄於 1989 年的專輯《真的見證》。此曲原本由麥潔文主唱,最初以情歌風格編曲, 其後由 Beyond 重新以搖滾風格演繹。因為被認為與六四有關,所以成為中國禁曲 (一說是因為版權的關係,所以無法在中國音樂網站搜尋到此曲)。

  • 灰色軌跡

    這首歌是 1990 年劉德華、吳倩蓮主演的電影《天若有情》的插曲。

  • 光輝歲月

    《光輝歲月》的粵語版是一首讚美南非的非洲人國民大會主席納爾遜·曼德拉的歌曲,以歌頌他在南非種族隔離時期為黑人所付出的努力, 當時曼德拉在監禁 28 年後剛被釋放,光輝歲月表達他的一生。在國語版裡面,這首《光輝歲月》是為激勵年輕人努力拼搏而作, 而當中的種族議題被淡化。

  • Amani

    《Amani》是樂團為呼籲資助非洲難民兒童,呼喚和平而創作的歌曲。

  • 不再猶豫

    《Beyond日記之莫欺少年窮》的主題曲,為 Beyond 的合唱歌曲,同時也是其著名的勵志歌曲。 國語版為《候診室》。

  • 誰伴我闖蕩

    《Beyond日記之莫欺少年窮》的插曲,國語版為《十字路口》。

  • 完全的擁有

    這是鼓手葉世榮在 Beyond 的第一首主唱歌曲,也是黃家駒去世前的惟一一首。

  • 長城

    《長城》由黃家駒作曲及擔當主音、劉卓輝作詞、Beyond 和梁邦彥共同編曲、喜多郎創作前奏;日語版《THE WALL》由真名杏樹填詞; 國語版歌詞由詹德茂改編。粵語版本收錄於Beyond第8張專輯《繼續革命》,並為該大碟之主打歌;日語版本收錄於《超越》,國語版本收錄於《信念》。 黃家駒在一段由香港無綫電視為此曲製作的音樂錄像表示,寫此歌是要「描寫中國人一貫的民族意識」。在歌詞裡,長城反映一個封閉的國度,是強權暴政的產物,是犧牲了無數血肉之軀築成的,然而後人大多只會以它為榮,無視值得反思之處。歌詞是借物描寫這種民族思想和境況,並借古諷今,並非只是寫長城和遠古的中國。 因為被認為與六四有關,以及在香港 2014 「和平佔中」、「雨傘運動」成為抗議者的演唱歌曲,或者被用來影射目前的中國政治, 所以曾經(或者在某一些特別日子)是中國禁曲。

  • 農民

    《農民》原曲為《文武英傑宣言》,而後重新填詞為《農民》,有廣東話和國語部份,內容大抵是描述一個中國農民的生活,如何在艱困的生活中逆境自強。 廣東話和國語的版本卻有著極大不同。廣東話版本是由劉卓輝填詞,是對山區農民生活的影射;而國語版則由姚若龍填詞,內容更為廣泛, 是描述北方人重視固有生活的個性。

  • 不可一世

    Beyond 在香港成名後前經理陳健添就更加變本加厲的密密麻麻安排商業娛樂性重的工作,陳健添還因經理人佣金和分紅和 Beyond 起糾紛, Beyond 早已厭倦陳健添這種為利是圖處處算計的人壓榨逼迫,以及他安排下過的違背意願的奉迎生活, 他們寫的《不可一世》是諷刺逼迫控制他們越緊的經理人陳健添,而不是陳健添口中所說的諷刺電視台高層。 重新填詞的國語版《今天就做》則是表達了一種生活態度。

  • 海闊天空

    《海闊天空》被視為黃家駒最具代表性的遺作,同時也是粵語流行音樂的巅峰之作,收錄在專輯《樂與怒》與國語精選專輯《海闊天空》中。 這首歌是記錄 Beyond 十年心路歷程的歌曲,歌詞承載了黃家駒與樂隊赴日本發展的艱辛與對理想的堅持, 也表達了黃家駒內心深處對香港樂壇的掙扎和失望。曲帶給人們的是一種積極向上的生活態度,堅持自己的理想,永遠不放棄的信念。 當年黃家駒在編寫《海闊天空》一曲時,曾將歌詞其中一句定為「也會怕有一天會跌倒 Oh Yeah」,但黃家強認為意思不對,遂修改為「……Oh No」, 沒料到黃家駒在完成此曲後不足2個月真的意外身亡。

  • 狂人山莊

    收錄在專輯《樂與怒》的硬搖滾作品。在專輯《樂與怒》中 Beyond 嘗試了更多的音樂風格, 但是卻仍然能夠被大多數人欣賞,顯示了 Beyond 成熟且優秀的音樂創作能力, 也因此黃家駒在 1993 年日本節目上意外去世才讓人惋惜。

  • 全是愛

    收錄在《樂與怒》與精選專輯《海闊天空》的作品,我會放這首是因為我喜歡這首歌的前奏。

  • 和平與愛

    Beyond 一首關注第三世界的音樂作品,收錄在《樂與怒》與精選專輯《海闊天空》的作品。

  • 情人

    《情人》是 Beyond 為各自的愛人創作的歌曲,不過該曲作詞人劉卓輝後來稱,這首原本叫《大陸情人》的歌曲, 其實是藉分隔兩地的感情來隱喻內地與香港的關係。

  • 總有愛

    《總有愛》是黃家強在 Beyond 經歷黃家駒去世的打擊後創作的歌曲, 他創作這首歌是為了感謝在 Beyond 最困難的時期依然無悔奉獻、關心支持他們的歌迷朋友。 國語版為《一輩子陪我走》。

  • 教壞細路

    《教壞細路》中的「細路」的意思是小孩子。《教壞細路》直白的揭露了彼時香港媒體的過度商業和虛假, 也因此歌曲一發行 Beyond 就遭到了香港 TVB 的封鎖。


  • 《霧》由黃偉文作詞,黃貫中作曲並演唱,Beyond、黃仲賢、劉志遠共同編曲,收錄在 Beyond 1997 年 12 月由滾石唱片發行的專輯《驚喜》中。 《霧》以流行搖滾的曲調呈現,吉他伴奏有重型的夢幻流行,編曲用格調化的手法。 《霧》的歌詞寫的是愛情,在迷霧中讀不懂、看不清,最後只能感嘆歲月已過。

  • 不見不散

    《不見不散》這張 1998 年發行的專輯流露出三人創作野心,除了 Beyond 3 位成員外,還有邀請樂隊早期成員劉志遠參與, 此專輯出現三人自己的音樂個性。《不見不散》也是同名專輯中的一首歌曲,由黃貫中作詞作曲。

  • 抗戰二十年

    2003 年是 Beyond 成立 20 週年的日子,家強在家駒生前留下的 demo中,選了一首重新製作作為主題曲, 特別之處是歌曲直接用了 demo 中的一段作前奏,由家駒自彈自哼出旋律,到中間其他隊友加入,鑄成四子不可思議的合作。 《抗戰二十年》這首歌與《海闊天空》、《光輝歲月》均被視為 2014 年香港 6.22 民間全民投票、七一大遊行、 學界大罷課與讓愛與和平佔領中環/雨傘革命爭取自由民主的主題歌曲,同時也被一些人認為有暗示六四的歌詞, 所以《抗戰二十年》也是一首中國禁曲。

  • 長空

    《無間道2》的主題曲,也是 Beyond 正式解散前的最後一首歌,該曲獲得第 23 屆香港電影金像獎最佳原創電影歌曲獎。

2024/10/30

Rexx

Rexx (Restructured Extended Executor) 是 Mike Cowlishaw 在 IBM 任職時, 於 1979 年 3 月 20 日到 1982 年中作為個人專案開發的程式語言,而後被 IBM 採用, 主要用於 IBM 的 Mainframe computer 上,而在其它大部份的平台也可以找到解釋器或編譯器。 Rexx 還有物件導向的版本,稱為 Object Rexx。

自由軟體的實作主要為符合 1996 年 ANSI 標準實作的 Regina Rexx Interpreter, 加入物件導向程式設計的 Open Object Rexx, 以及與 Java 整合的 NetRexx。 我在學習時使用的是 ooRexx。

Rexx 是一個不區分大小寫 (Case-insensitive) 的程式語言。

下面就是 Rexx 版的 Hello World 程式:

/* Main program */ 
say "Hello, World!"

就如同上面的例子所看到的,Rexx 的註解使用 /**/,中間的文字就是註解要寫的說明。

Variables

In Rexx, all variables are bound with the '=' statement. Variables in Rexx are typeless, and initially are evaluated as their names, in upper case. Thus a variable's type can vary with its use in the program:

say hello /* => HELLO */
hello = 25
say hello /* => 25 */
hello = "say 5 + 3"
say hello /* => say 5 + 3 */
interpret hello /* => 8 */
drop hello
say hello /* => HELLO */

Rexx has no direct support for arrays of variables addressed by a numerical index. Instead it provides compound variables. A compound variable consists of a stem followed by a tail. A . (dot) is used to join the stem to the tail. If the tails used are numeric, it is easy to produce the same effect as an array.

do i = 1 to 10
    stem.i = 10 - i
end

do i over stem.
    say i '-->' stem.i
end

ooRexx 提供了 do over 的方式可以用來迭代 stem 內的值(注意:這不是 REXX 標準所規範的語言特性)。

Control Structures

對於迴圈而言,Rexx 提供了 do loop, do while loop 與 do until loop 等方式。

do while [condition]
  [instructions]
end
do until [condition]
  [instructions]
end

Like most languages, Rexx can loop while incrementing an index variable and stop when a limit is reached:

do index = start [to limit] [by increment] [for count]
  [instructions]
end

Rexx permits counted loops, where an expression is computed at the start of the loop and the instructions within the loop are executed that many times:

do expression
  [instructions]
end

Rexx can even loop until the program is terminated:

do forever
  [instructions]
end

Like PL/I, Rexx allows both conditional and repetitive elements to be combined in the same loop:

do index = start [to limit] [by increment] [for count] [while condition]
  [instructions]
end
do expression [until condition]
  [instructions]
end

下面是一個迴圈的例子:

/* Main program */ 
do i = 1 to 9 by 1
    do j = 1 to 9 by 1
        say i 'x' j '=' i*j
    end
end

對於條件判斷來說,Rexx 提供了 ifselect 等方式。

if [condition] then do
  [instructions]
  end
else do
  [instructions]
end

For single instructions, DO and END can also be omitted:

if [condition] then
  [instruction]
else
  [instruction]

SELECT is Rexx's CASE structure.

select
  when [condition] then
  [instruction] or NOP
  when [condition] then
  do
  [instructions] or NOP
  end
  otherwise
  [instructions] or NOP
end

The NOP instruction performs "no operation", and is used when the programmer wishes to do nothing in a place where one or more instructions would be required.

下面是使用 select 的例子:

/* Main program */
say "Enter your temperature in degrees Celsius:"
pull degrees

select
    when DataType(degrees) \= "NUM" then
        say "That's not a number. I can't help you."
    when degrees < 36.5 then
        say "Your body temperature is a bit low."
    when degrees > 37.5 then
        say "I think you have a fever."
    otherwise
        say "You're temperature seems normal."
end

Write a program that displays the digits from 1 to n then back down to 1; for instance, if n = 5, the program should display 123454321. You are permitted to use only a single for loop. The range is 0 < n < 10.

/* Main program */
parse arg n

if DataType(n) \= "NUM" then do
    say "That's not a number."
    exit
end


if n < 1 | n > 9 then do
    say "Out of range."
    exit
end

select
    when n == 1 then
        say "1"

    when n == 2 then
        say "121"

    when n == 3 then
        say "12321"

    when n == 4 then
        say "1234321"

    when n == 5 then
        say "123454321"

    when n == 6 then
        say "12345654321"

    when n == 7 then
        say "1234567654321"

    when n == 8 then
        say "123456787654321"

    when n == 9 then
        say "12345678987654321"

    otherwise
        say "Please input 0 < n < 10"
end

exit

使用迴圈的解法:

/* Main program */
parse arg n

if DataType(n) \= "NUM" then do
    say "That's not a number."
    exit
end


if n < 1 | n > 9 then do
    say "Out of range."
    exit
end

positive = 1
count = 0
do forever
    if positive == 1 then do
        count = count + 1
        call charout , count
        if count == n then do
            positive = 0
            iterate
            end
        end
    else do
        count = count - 1
        if count > 0 then
            call charout , count
        else
            leave    
    end
end
say

exit

下面是一個簡單的猜測數字遊戲:

/* A guess number game */
the_number = random(1, 1000)

do forever
    call charout , 'Please input a number: '
    pull the_guess

    if the_number = the_guess then do
        say 'You guesses it!'
        leave
        end
    else if the_number > the_guess then do
        say 'Please guess more higher'
        iterate
        end
    else do
        say 'Please guess more lower'
        iterate
    end
end

exit

Numbers

Rexx 一般而言預設處理的位數為 9(或者使用 digits() function 取得目前的設定)。 因此如果在程式使用的位數超過預設值,需要使用 numeric digits 設定。

numeric digits 12

Subroutines

Rexx 的程式可以分割為 function 或者是 subroutine,二者的差別在於 function 一定會傳回回傳值, 而 subroutine 沒有(或者說不一定有)回傳值。

下面是一個 function 的例子:

/* Main program */ 
say add(5,6) 
exit 

add: 
PARSE ARG a,b 
return a + b

下面是 recursive function 的例子:

/* Main program */ 
do n = 1 to 5 
    say 'The factorial of' n 'is:' factorial( n ) 
end 
return  

/* Function to get factorial */ 
factorial: procedure 
n = arg(1) 
if n = 1 then 
    return 1
return n * factorial( n - 1 )

我們可以使用 call statements 來呼叫 subroutine。如果呼叫之後有回傳值返回,可以使用 RESULT 變數取得其值。

/* Main program */
call subr
exit 0

subr:
say 'You are inside internal subroutine.'
return

如果要取得參數的數目,可以使用 arg() 取得。

/* Main program */ 
call add 1, 2 
exit

add: 
PARSE ARG a,b 
say 'Arg number:' arg() 
c = a + b 
say 'Result:' c
return

File IO

下面是讀取檔案的例子,一行一行的從 /etc/os-release 讀出資料,然後判斷目前 Linux distribution 的名稱。

/* Main program */
filename = '/etc/os-release'
do while lines(filename) > 0  
    line_str = linein(filename)
    parse var line_str key "=" value
    
    if compare(key, 'NAME') == 0 then do
        say value
        leave
    end
end

System Commands

REXX 支援執行外部程式的能力,下面是一個例子:

/* Main program */ 
'ls'
if rc == 0 then 
    say 'The command executed successfully' 
else 
    say 'The command failed, The error code is =' rc

再來是另外一個例子,1-9位數不重複印出來的練習問題,
使用者輸入1 印1-9
使用者輸入2 印1-98 (11, 22, 33等重複的不印)
使用者輸入3 印1-987 (121, 988, 667等有重複的不印):

call charout , 'Please input a number: '
pull num

if num < 1 | num > 9 then do
    say "Out of range."
    exit
end

'seq '10**num - 1 '| egrep -v "([0-9]).*\1"'

To send a command to a specific environment, use this format of the address instruction:

address environment expression

下面就是一個使用的例子:

address system 'ls'

address 也可以作為輸入與輸出的重新導向的設定(input, output 與 error),下面是一個例子:

/* Main program */ 
address system 'ls' with output stem files.

do i = 1 to files.0
    say files.i
end

在上面的例子中,輸出的結果將會放到 files. 這個 compound variable 中, 而 files.0 會記錄結果的數目。

下面則是從 /etc/os-release 檔案取得內容,然後輸出到 compound variable 的例子。

/* Main program */ 
address system 'cat' with input stream '/etc/os-release' output stem files.
do i = 1 to files.0
    say files.i
end

參考資料