永远的拉赫玛尼诺夫第三钢琴协奏曲 作者:温蒂

1909年10月,拉赫玛尼诺夫带着他刚刚完成的《D小调第三钢琴协奏曲》乐谱踏上了美利坚大陆。这块被欧洲人称为“美丽的新世界”的美洲大陆,在二十年前迎来过这位俄罗斯作曲家的伟大同胞彼得•伊里奇•柴科夫斯基,它在本世纪注定成为俄罗斯受迫害艺术家的一块心灵的自由栖息之地:诗人布罗茨基、小说家纳博科夫、音乐家斯特拉文斯基……而生他养他的俄罗斯家园成为他们眼泪归去的方向。这是拉赫玛尼诺夫第一次踏上美洲大陆,八年以后,他再一次选择美国作为艺术的发展之地,而将深爱的母亲和亲人留在了俄罗斯,他的音乐,钢琴,管弦乐团,波修瓦歌剧院,伊凡诺夫卡庄园,他的马匹,图画,汽车,门前的紫丁香留在了俄罗斯。

在拉赫玛尼诺夫创作《D小调第三钢琴协奏曲》之前,他完成了一部19世纪音诗的压卷之作《死之岛》,这是一部音乐史上阴郁的代表画作,它在19世纪的地位好比勋伯格的《升华之夜》,死亡力度令人联想到柴科夫斯基的《悲怆》交响曲,马勒的《亡儿之歌》。拉赫玛尼诺夫在《死之岛》的首演之后不久便成为俄罗斯皇家音乐会的副主席,到美国演出是受他的一位美国朋友亨利•沃尔夫邀请的。拉赫玛尼诺夫还不十分乐意踏上这趟劳顿的旅程。但他想到美国这块新土地上喷着浓烟前进的火车,想到纽约大街上繁华的商业气息,刚刚从二月革命的血腥场面过来的拉赫玛尼诺夫觉得似乎缺少“物质”方面的享受了,他甚至打算用此次在美国巡回演出的收入买一辆汽车。我曾经见过一张拉赫玛尼诺夫倚着钢琴站立的照片,这是高高大大的拉赫玛尼诺夫(2米高的个子)和一架同样高大宽厚的钢琴,他的脸部稍长,表情严肃,那里没有俄罗斯伟大的浪漫诗人普希金少年般的纯真眼神,也没有俄罗斯人特有的浓密的须髯,倒很像是一位英国绅士。拉赫玛尼诺夫出身于一个非常显赫的家族,外祖父是戎马半生的将军,父亲是一名军官。拉赫玛尼诺夫这个姓氏源于拉赫玛尼(rachmany),俄语意为“亲切”、“慷慨”。

拉赫玛尼诺夫是莫斯科的一位贵族,但作为音乐家,他的音乐是属于俄罗斯人民的,就像出身于贵族的小说家托尔斯泰,出身于皇族的女诗人阿赫玛托娃,而不是一生靠女人资助的柴科夫斯基。

拉赫玛尼诺夫是在横渡大西洋的轮船上练习《第三钢琴曲》的,到了美国之后,他的资助人沃尔森家族给他安排了20场音乐会。而这首曲子的第三场演出是由新上任的纽约爱乐乐团音乐总监古斯塔夫•马勒指挥的,两位音乐大师站在了一起,我们应该记住1910年1月16日——德国和俄国两条宽阔的音乐之河一起流淌。虽然他们的相遇没有像18世纪贝多芬遇见莫扎特那样成为一个神话,对于生活在20世纪的爱乐者来说,算是一件幸事。

《第三钢琴协奏曲》的构思在很大程度上是对《第二钢琴协奏曲》的继续,如两者饱满的情绪和沸腾般的生命力,而《第三钢琴协奏曲》是一首充满紧张的戏剧性发展的作品,拉赫玛尼诺夫的风格在《第三钢琴协奏曲》中初显端倪,多种多样的钢琴技法被织入作品里,清淡的华彩、经过句、双音、浓密的复调织体、轻快机敏的断音和大量宏伟的和弦等等,这些好比一个现代派小说家采用的写作技巧,隐喻、象征、意识流、超现实,不过一切手法都是为作品服务。协奏曲第一乐章的第一主题是由一个非常俄罗斯化的古代典礼歌曲引出,任何一个接触过普希金的诗歌或托尔斯泰的小说的人——哪怕他从来未曾听过拉赫玛尼诺夫,这样富有温柔、暖性和冥想的歌曲性旋律不会不使他沉谧,想到俄罗斯牧笛升起在夏日乡村的苍穹,想到无尽的平静大草原。这个歌唱性的主题成为拉赫玛尼诺夫最迷人的旋律,成为二十世纪最暖性的阳光。俄罗斯人听到它好比捷克人听到斯美塔纳《我的祖国》里伏尔塔河的“日夜流淌”,中国人听到《二泉映月》里的“明月松间照”。但是这个如歌的主题很快失去了田园诗的风味,它在第一、第二乐章逐渐发展,许多不安的因素加进来,歌唱的钢琴变成了沉思的钢琴,美丽的俄罗斯小溪开始汇入波澜壮阔的伏尔加河。随着铜管乐器严厉的行进,钢琴变成了一把沉重的铁锤,所有的激昂、愤怒、不安、恐惧、失望、抗争和悲悼被高举。澳大利亚电影《钢琴师》里的主人公在弹奏《第三钢琴协奏曲》的演奏会上当场昏厥,你可想象作品将琴手击倒的力量!

拉赫玛尼诺夫1909年对美国的访问是他日后躲避国内战争和政治灾难定居美国的前奏,这部《第三钢琴协奏曲》是时代选择拉赫玛尼诺夫成为它的最后一个击鼓者,拉赫玛尼诺夫加入流亡者的行列,他将不仅仅作为音乐家,而将作为二十世纪人类良知和道德的发言人!他如济慈所言:“你远在人类中。”消失于人类、消失于人群。逃离原来的人群是一件难事,但逃离却是对现有环境的无声抗议。布罗茨基在《小于一》里叙述了在一个冬天的早晨,他在一节课的中途站起身来走出学校大门的经历,他记得那一刻支配他的情感的是一种老是长不大,老是被身边的一切所控制而生出的厌恶感。另外,“还有那种由于逃跑、由于洒满阳光的一眼望不到的大街所勾起的朦胧却幸福的感觉。”一边是俄罗斯的风景,俄罗斯的春天,俄罗斯的白雪,俄罗斯的森林和湖泊而忧伤,一边是死于炮火死于饥寒的俄罗斯民众,一个诞生了契诃夫、果戈理、托尔斯泰、陀思妥耶夫斯基、鲍罗丁、柴科夫斯基、里姆斯基-柯萨科夫等的伟大文学家和音乐家的民族即将崩溃。布罗茨基在1987年接受诺贝尔文学奖时无不痛心地说:“在俄国,它(文明)已结束;如果我要说它是以悲剧结束的,那么首要的依据就是人的牺牲的数量,已降临的社会和历史转变将他们掳掠而去。真正的悲剧中,死去的不是主角——死去的是合唱队。”

拉赫玛尼诺夫深知自己无法摆脱掉俄罗斯文化的旧传统,它已像血液一样渗入到他身体的各个部分,哪怕他定居到美国,作为抒情和悲壮的俄罗斯音乐形象将永远升起在他抚琴的十指底下。拉赫玛尼诺夫在《第三钢琴协奏曲》中对俄罗斯冬天满怀深情的歌唱,是柴科夫斯基对1812年的歌唱,也是托尔斯泰对战争后的和平大地的歌唱。

我们把《拉赫玛尼诺夫第三钢琴协奏曲》简称为”拉三”,而在欧洲,它被同样简称为”RACH 3″,这不约而同的简称中除了实用的因素,还有一种热爱。还像我们呼唤一个朋友的小名。拉赫玛尼诺夫是一个传奇性的人物,他的前三首钢琴协奏曲的创作历程,可以说伴随着整个人生最大的痛苦和喜悦,所幸的是他是先忆苦后思甜的。现在我们已经无法洞悉19世纪末人们的欣赏口味,特别是结合着时代思想背景的音乐习惯。我们现在惊奇地是当时像”拉一”这样不算太杰出的作品,竟然会被当时的《格罗夫音乐词典》第五版誉为:”在拉赫蚂尼诺夫的一生中,某些极为流行的作品似乎难以维持久远。”这句斩钉截铁的评价当时是多么重地打击了拉赫玛尼诺夫,以致于他差不多三年没有再拿起笔作曲。

需要提到的一个人是列夫•托尔斯泰。在拉赫蚂尼诺夫需要来自心灵和思想的力量的时候,朋友将他引见给这位《战争与和平》的作者。当时已经快要70岁的老托尔斯泰对他说:”年轻人,你能想像我人生是一切顺利的吗?你能假设我豪无烦恼,从不犹豫而且从未丧失过信心吗?你真认为信心总是和力量相等吗?其实我们每个人都会有遭逢困难的时候,但这就是人生!抬起你的头,坚持你所要走的路。”

这一段现在看来很像汪国真语录的话,当时使拉赫玛尼诺夫恢复了不少的信心,但后来他和老托尔斯泰关于艺术歌曲上的见解分歧,使大家不欢而散,而拉赫玛尼诺夫在这之后的深深地自责演变到要去看心理医生,他被推荐给达尔医师。在催眠术疗法的治疗下,拉赫玛尼诺夫渡过了一生中最痛苦的阶段,他在随后的时光里渐渐走向了幸福:他的第二钢琴协奏曲获得了不小的成功,而接下来,在去美国发展的前后一段时间,他写下了一生中最灿烂的乐篇——《拉三》,并且在新世纪的新大陆找到了知音,不仅它的弹奏技巧艰深为人瞠目结舌,而且它给聆听者建构的音乐世界是如此变化莫测,充满激情,使它简直已经与摇滚给人的冲击不相上下。

不需要给你详细地解说《拉三》,做为一个现代人,就算从没有接触过这首曲子,你只需要认真地听上三遍,就会彻底被它的旋律所编织的东西迷住,那是一种欲罢不能的像经历过山车带给人的起伏一样的巨大的享受。

听《拉三》的时候,好像每一个音符都在它自己最理想的位置,在细致的指挥下,分期分批地亮起来,一会儿像国庆礼花布满天空时的绚丽,一会儿像礼花放完第一批第二批开始装弹时的间歇里寂静下来的夜空。你会期待着那些东西以新的形式再次腾空而起,而且,你不知道接下来的绚丽将有多高,因为每次你听它的时候,最好在高潮阶段带给你的刺激并不是你上次所经历的,它可能更好,也可能更差,每一次都将是新的。

曾经用海浪比较过拉三。好像你在海边,看到平静的大海,开始出现一些小小的浪花,后来看到此起彼伏的一些白色,那时风浪又大了一些的浪尖,当你感到风的力量的时候,发现面前的大海已经不再平静,二三米高的浪头开始出现,大雨也在你的头上降临,你正在酣畅淋漓地感受这些的时候,你正在以为这些将转化成一个几十层楼高的巨大海浪的时候,一切都悄悄平息下来,雨过天晴一般,大海又开始平静,甚至你看到海滩上多了不少游泳的人,蓝天白云中,天边不知到是什么东西出现了,以很快的速度过来了,这时,当人们看清这是什么的时候,一个巨大的如同中天广场般的浪,伴随着周围依然平静的海面,神话般地出现在你面前,想一想那种奇特的震撼和接下来浪打下来的样子,你一下子被音乐的海洋深深地吞没了。愉快地吞没了。你呼喊变成气泡,你失去依托,挥舞在深蓝之中。

Creating a vector class

Assignment requirements:

  • Remember: You need to use a Linux or other unix-like computer.
  • One of the very powerful aspects of Matlab is the ability to simply perform operations with matrices and vectors.
  • For this project you will create a vector class, with an array of doubles in it, a constructor, a destructor, etc.
  • You also need to overload the operators +, -, *, and / to perform these operations between vectors (ie add two vectors together, etc.). These will be “in place” operators. That is, if we have a=[2.0 3.0] and b=[5.0 6.0], then a*b=[10.0 18.0] and a/b=[2.0/5.0 3.0/6.0].
  • In addition, overload the operator “&” to perform a vector dot product. If a and b are as defined above, then we’d have: a&b = 2.0*5.0 + 3.0*6.0 = 28.0
  • You also need to use exception handling to first check to see if the vectors are the same length . If they are not, then you should tell the user to enter vectors that are the same length. The program cannot crash. (I have added some c++ exception handling examples to my exception handling slides and my list of example codes
  • You also need to do exception handling on the / operator, by first making sure the denominators are not too small.
  • BY THE WAY…. in C++ when you use “1” in a code it is an integer. “1.0” is a double, and “1.0f” is a float. Do not use use integers when you really mean doubles or floats. This can lead to hard to find errors. For example, 1/2 returns zero!

My code:

 

socket library in Python

This is a simple practice from Coursera.com within Using Python to Access Web Data.

After running this python file in terminal, the output we got below.

在什么情况下应当声明虚函数

使用虚函数时,有两点要注意:

  1. 只能用virtual声明类的成员函数,使它成为虚函数,而不能将类外的普通函数声明为虚函数。因为虚函数的作用是允许在派生类中对基类的虚函数重新定义。显然,它只能用于类的继承层次结构中。
  2. 一个成员函数被声明为虚函数后,在同一类族中的类就不能再定义一个非virtual的但与该虚函数具有相同的参数(包括个数和类型)和函数返回值类型的同名函数。

根据什么考虑是否把一个成员函数声明为虚函数呢?主要考虑以下几点:

  1. 首先看成员函数所在的类是否会作为基类。然后看成员函数在类的继承后有无可能被更改功能,如果希望更改其功能的,一般应该将它声明为虚函数。
  2. 如果成员函数在类被继承后功能不需修改,或派生类用不到该函数,则不要把它声明为虚函数。不要仅仅考虑到要作为基类而把类中的所有成员函数都声明为虚函数。
  3. 应考虑对成员函数的调用是通过对象名还是通过基类指针或引用去访问,如果是通过基类指针或引用去访问的,则应当声明为虚函数。
  4. 有时,在定义虚函数时,并不定义其函数体,即函数体是空的。它的作用只是定义了一个虚函数名,具体功能留给派生类去添加。

需要说明的是:使用虚函数,系统要有一定的空间开销。当一个类带有虚函数时,编译系统会为该 类构造一个虚函数表(virtual function table,简称vtable),它是一个指针数组,存放每个虚函数的入口地址。系统在进行动态关联时的时间开销是很少的,因此,多态性是高效的。

 

有时在基类中将某一成员函数定为虚函数,并不是基类本身的要求,而是考虑到派生类的需要,在基类中预留了一个函数名,具体功能留给派生类根据需要去定义。

例如在前边的例12.1(详情请查看:什么是C++虚函数)程序中,基类Point中没有求面积的area函数,因为“点”是没有面积的,也就是说,基类本身不需要这个函数,所以在例12.1程序中的Point类中没有定义area函数。

但是,在其直接派生类Circle和间接派生类Cylinder中都需要有area函数,而且这两个area函数的功能不同,一个是求圆面积,一个是求圆柱体表面积。

有的读者自然会想到,在这种情况下应当将area声明为虚函数。可以在基类Point中加一个area函数,并声明为虚函数:
virtual float area( )const {return 0;}
其返回值为0,表示“点”是没有面积的。

其实,在基类中并不使用这个函数,其返回值也是没有意义的。为简化,可以不写出这种无意义的函数体,只给出函数的原型,并在后面加上“=0”,如:
virtual float area( )const =0;  //纯虚函数
这就将area声明为一个纯虚函数(pure virtual function)。

纯虚函数是在声明虚函数时被“初始化”为0的函数。声明纯虚函数的一般形式是
virtual 函数类型 函数名 (参数表列) = 0;

 

关于纯虚函数需要注意的几点:

  1. 纯虚函数没有函数体;
  2. 最后面的“=0”并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”;
  3. 这是一个声明语句,最后应有分号。

纯虚函数只有函数的名字而不具备函数的功能,不能被调用。它只是通知编译系统:“在这里声明一个虚函数,留待派生类中定义”。在派生类中对此函数提供定义后,它才能具备函数的功能,可被调用。

纯虚函数的作用是在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。

如果在基类中没有保留函数名字,则无法实现多态性。如果在一个类中声明了纯虚函数,而在其派生类中没有对该函数定义,则该虚函数在派生类中仍然为纯虚函数。

利用虚函数就很好地解决了这个问题。可以看到:当把基类的某个成员函数声明为虚函数后,允许在其派生类中对该函数重新定义,赋予它新的功能,并且可以通过指向基类的指针指向同一类族中不同类的对象,从而调用其中的同名函数。由虚函数实现的动态多态性就是:同一类族中不同类的对象,对同一函数调用作出不同的响应。

虚函数的使用方法是:

  1. 在基类用virtual声明成员函数为虚函数。
    这样就可以在派生类中重新定义此函数,为它赋予新的功能,并能方便地被调用。在类外定义虚函数时,不必再加virtual。
  2. 在派生类中重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体。
    C++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。因此在派生类重新声明该虚函数时,可以加virtual,也可以不 加,但习惯上一般在每一层声明该函数时都加virtual,使程序更加清晰。如果在派生类中没有对基类的虚函数重新定义,则派生类简单地继承其直接基类的 虚函数。
  3. 定义一个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象。
  4. 通过该指针变量调用此虚函数,此时调用的就是指针变量指向的对象的同名函数。
    通过虚函数与指向基类对象的指针变量的配合使用,就能方便地调用同一类族中不同类的同名函数,只要先用基类指针指向即可。如果指针不断地指向同一类族中不 同类的对象,就能不断地调用这些对象中的同名函数。这就如同前面说的,不断地告诉出租车司机要去的目的地,然后司机把你送到你要去的地方。

需要说明;有时在基类中定义的非虚函数会在派生类中被重新定义(如例12.1中的area函 数),如果用基类指针调用该成员函数,则系统会调用对象中基类部分的成员函数;如果用派生类指针调用该成员函数,则系统会调用派生类对象中的成员函数,这 并不是多态性行为(使用的是不同类型的指针),没有用到虚函数的功能。

From: http://c.biancheng.net/cpp/biancheng/view/246.html

 

Cousera.com: 理性认识C程序 导论 编程题

编程题#1:苹果和虫子

编程题#2:大象喝水

编程题#3:最高的分数

编程题#4:最大奇数与最小偶数之差的绝对值

编程题#5:分离整数的各个数位

 

 

 

 

C/C++ 取整函数ceil(), floor()

#include <math.h>

使用 floor 函数. floor(x) 返回的是小于或等于 x 的最大整数。
如: floor(10.5) == 10    floor(-10.5) == -11
使用 ceil 函数. ceil(x) 返回的是大于 x 的最小整数。
如: ceil(10.5) == 11    ceil(-10.5) == -10

floor() 是向负无穷大舍入, floor(-10.5) == -11
ceil() 是向正无穷大舍入, ceil(-10.5) == -10