去南京

南京拥有着悠久的历史,所谓「六朝古都,十朝胜会」,又叫做「金陵城」。是三国时期吴国、东晋、宋齐梁陈的首都。明太祖朱元璋,太平天国也曾定都在这里。 养育过王羲之等才子,有很多名句诗词,「旧事王谢堂前燕」「夜泊秦淮近酒家」说的就是这里。额……也出了个秦桧。

我们是国庆前决定来的,所以没有提前准备,也没做功课,所以只去了一些名气大的景点。也非常急。听说夫子庙接待的游客到了60万,此言不虚。

一出地铁,就看到宣传标语。直到今天,南京在政治上都有举足轻重的地位。

p2273913969

南京街头

这座城市不经意间就会透漏出他的年龄,公交站,地铁站都是以XX门,XX宫来命名的,听起来到处都是景点。

p2273913905

宣武门

夫子庙和秦淮河。根本感受不到任何古代的有关诗词的浪漫气息,随处可见的假冒石头,廉价纪念品商店,不正宗的外地小吃,让你觉得这就是一条人挤人的低俗商业街。

秦淮河

秦淮河

幸运的是,第一次看到了皮影表演。

p2273913953

皮影戏

Joyme吐槽说——「他们的表情一模一样诶」,是真的  – -。

p2273913955

玄武湖的大树显示着它的年龄。

p2273913906

玄武湖

朱元璋的明孝陵东,就是中山先生的陵墓。听说孙中山病危之际,宋庆龄亲自上山选墓地,看风水。最终定在了小茅山一带。青山何其有幸。

中山陵

中山陵

三民主义

三民主义

陵墓内有先生起草的「建国大纲」,谒陵要保持沉默,禁止拍照,内有官兵把守。

p2273913900

陵墓门前

南京市长江大桥。我们徒步走到了另一头,结果一晚上都因为尾气不舒服。而且桥很长,比网上说的长,因为有上桥和下桥的封闭路段,中间没有车停。所以尽量不要试图步行走过去。亲历者说。

南京市长江大桥

南京市长江大桥

南京大屠杀纪念馆,建造水平非常高。在这里表达的不是仇恨,而是对失去的生命的惋惜,和对和平和呼唤,有这样经历的一座城市,这样的价值观,是正确的,也是很难得的。

南京大屠杀纪念馆

南京大屠杀纪念馆

纪念碑

纪念碑

出口

出口

《我在伊朗长大》这部电影中有一句话,是对仇恨很好的解释:

一生中,你会碰到很多混蛋。如果他们伤害你 ,是因为他们的愚蠢。不要对他们的恶行有所回应,因为再没有比怨恨和抱复更糟糕的了,永远保持自尊和自我。

有很多人宣扬,南京大屠杀纪念馆是日本人出资建造的,我们不需要纪念馆,我们要仇日,日本人不能来南京。这些人,和当年犯下罪行的日本人同样愚蠢。

 

树莓派控制3641BS数码管显示数字

3641BS数码管是一个小LED显示器,可以显示4位数字和4个小数点。它是没有驱动的,使用它的方法就是控制每一个LED灯的亮起和熄灭。这个型号的数码管长这个样子:

NFD-3641

硬件准备

  • 树莓派
  • 显像管 – 不是3641BS也可以,最好是位,没有驱动
  • 至少12根杜邦线 – 连接GPIO和显像管引脚
  • 排线,T形扩展板,面包板 – 非必须,方便调试,保护树莓派

原理

控制数码管显示数字的原理,简单来说就是让相应的LED亮起来。要让它亮就需要有电流通过,电流形成的条件是有电压。所以我们只要控制一个LED两端一端是高电平,一端是低电平,就可以让它发光了。

从上图看来,这个显像管一共有8(每个数字加点)X4=32个LED,一个LED需要两个引脚的话,那么一共需要64个引脚啦?

当然不是,树莓派一共才40个引脚呢。首先,每个数字的LED的一端格子控制电压,另一端公用,就可以达到控制电压的效果。例如显示一个数字的时候,将公用端设为低点平,在每个LED控制的一端,需要亮起的部分设置为高电平,不需要亮的部分设置低电平,就可以让它发光。公用端根据阳极和阴极的不同分为共阳极和共阴极显像管。在内部的公用电路是这样的:

7segLed

那这样的话,8个独立的加上一个公用的,只需要9个就行了,这样4个数字需要36个。也不是的,下图是3641的线路图:

3461

最下面的图中,我们可以发现,四个数字除了共阴极的一端,其余的9个引脚都是公用的。事实上只有12个引脚。这种显示方式称为扫描显示,比如(共阳极为例)显示1234的话,第一个共阴极低电平,其余的共阴极高电平,要显示的字形按照上一个原理,亮起的是高电平,就在第一位上显示出1.其实这个时候,第一位灭掉的是低电平,其余的共阴极是高电平,也形成了回路,但是它们不会亮的,因为二极管单向导电,只能从阳极流向阴极。1ms之后,将第一共阴极拉高,熄灭第一位,亮起第二位,1ms之后亮第三位。这样循环显示,叫做「扫描显示」。人类的视觉停留时间是1/16s,所以不会有闪烁的效果,看起来就和静态显示一模一样。

代码

Python代码使用了GPIO,懂了上面的原理之后,代码看起来就非常简单了,基本不用赘述。值得一提的是,我使用的BCM编码的引脚,如果你昨晚之后发现某个LED不正常,可以对照这两幅图的LED编号-显像管引脚编号-GPIO编号找到不正常的那个LED,再找到引脚,顺着杜邦线找到现在使用的GPIO,然后换一个GPIO。

220px-7_segment_display_labeled.svg

222348nccs4w5s4zicr8wn

参考资料

树莓派GPIO入门05-驱动数码管显示数字:这个链接中还有加了按钮的实现,还有更快速的C版本的实现。

 

树莓派通过邮件上报实时IP,随时随地远程登录树莓派

树莓派接上键鼠和显示器就是一台普通的Linux的主机了,这样没什么好玩的。我的想法是只接网线和电源,将它作为一台永久运行的个人服务器,随时随地可以远程登录它,在上面跑耗时的爬虫代码等任务。

除了一台装好Linux系统(Raspbian)的树莓派,一根路由器给的网线,合适的放置环境,我们还需要做软件方面的配置。主要是如何从外网ssh登录到树莓派,昨天晚上写了个脚本解决了这个问题,这里分享一下。

电信分给用户的IP是动态的,我使用的一般是2天变化一次,重启路由器的话立即改变。ssh需要的就是ip和用户名,所以只要解决了ip的问题,就可以做到随时登录了。

1.路由器静态分配内网IP

路由器在内网分配的ip也是动态的,以我的为例,是tplink的路由器,内网的ip两个小时换一次,电脑重启立即改变。

解决方案比较简单。

  1. 打开路由器的管理页面(通常是192.168.1.1,不同型号也可能不同)。
  2. 在DHCP服务中将地址池设置为192.168.1.100-200,这样动态分配的ip会在这个范围。
  3. 设置静态分配。添加一个静态分配的规则,添加树莓派的MAC地址和静态分配的IP(要在局域网的网段,通常是192.168.1.XXX,而且不要在Step2设置的地址池范围内),我使用的是192.168.1.20.

JINGTAIFENPEI

如果不知道自己的MAC地址,可以在打开DHCP服务的时候查看一下。或者在树莓派中用ifconfig命令查看HWaddr

到此为止,任何时候只要你连接了这个路由器,就可以使用192.169.1.22登陆到树莓派系统了(通常情况下,路由器的设置都需要重启生效)。

2.外网IP和端口映射到内网

如果想要从外网登陆的话,还需要做一步映射。因为路由器分出了很多ip,如果外网访问某一端口的话,到底是访问了哪一个ip呢?

在路由器的「转发规则」页面添加一个对22端口(这个就是ssh端口)的转发,到192.168.1.20(你在上一节设置的IP)上。

zhuanfaguize

设置成功,你可以在 http://www.ip138.com/ 查看一下自己当前的ip是多少,然后尝试使用这个ip ssh登陆,正常情况下,是可以登陆的。

3.解决外网IP变化的方法

外网的IP一旦改变,原来的你记住的ip就失效了,解决这个问题,我用的方案是:树莓派每一个小时检查自己的公网ip,如果改变,就向我的邮箱发送一封邮件报告自己的最新ip。

原理是使用Linux的crontab添加定时任务,任务就是一个脚本,这个脚本来做check ip和发送邮件的功能。

操作步骤:

  1. 在树莓派上登录Root账户(sudo -s),因为这个程序要放在/root/rootcrons下而且添加为root的例行程序。
  2. 执行git clone https://github.com/laixintao/Report-IP-hourly.git /root/rootcrons/下载脚本代码(如果放在别的目录下,要注意调整后面的步骤相应的路径)。
  3. vi reportip.py设置邮件信息,修改代码的e-mail config部分:
    • smtpserver:你的SMTP服务器
    • username:你登陆SMTP的用户名
    • password:密码
    • sender:发送人,注意要和SMTP登录的账户对应,通常都是一个一个邮箱账户。
    • receiver:收信人列表
    • subject:邮件主题

    具体的修改信息,在代码中有详细的注释。

  4. 执行crontab /root/rootcrons/rootcron,将rootcroon的任务添加到crontab列表中。
  5. 重启crontab,使配置立即生效。/etc/init.d/cron restart

这时整个定时检查ip并发送邮件的功能已经实现了,下一节是解释代码和更高级的配置,如果没有兴趣可以跳过,去读一下「特别注意」(我惨痛的教训)。

如何得到树莓派的内网ip?

开一个socket,然后用python直接获得此socket的名字。代码像这样:

3.5添加开机启动

通过使用了一段时候之后,我发现,如果ip变化了,而树莓派启动的时间不是在整点的话,你只能等到下一个整点才能收到邮件了。所以这里我们再加一步,将脚本添加至开机启动里面。

这一步很简单,只要 vim /etc/rc.local ,然后添加下面一句话就可以了。

4.代码原理

最新版本的代码请看这里:https://github.com/laixintao/Report-IP-hourly

脚本会先检查网络是否连通,连通才会有后续的步骤。方法是访问百度是否正常返回结果(百度的主要功能是检查自己在不在线,不是搜索引擎)。

如果联通,则尝试获得公网ip,使用一个lastip.txt来保存ip地址,每次检查的结果和这个ip对比,如果相同,则不发送邮件。

那么如何获得公网ip呢?我的方法是去访问一个测试ip的网站,得到的html中用正则表达式去找ip。脚本中提供了三个网址,如果失败或者访问超时(默认20s),则尝试下一个。如果不能满足需要大家可以添加更多。

有朋友指出,我这里的地址已经失效了,并提供了下面两个可以获取ip的地址。

  • http://www.ip138.com/ip2city.asp
  • http://ipv4.icanhazip.com/
  • https://httpbin.org/ip  (这也比较稳定哦)

运行结果像下面这样:

reportip

详细的代码和注释请见github吧。

关于crontab

crontab filename是将任务添加到定时计划中,如果有需要可以更改rootcron的配置来控制脚本的执行频率。rootcron中的代码像下面这样:

  • 第1列分钟1~59
  • 第2列小时1~23(0表示子夜)
  • 第3列日1~31
  • 第4列月1~12
  • 第5列星期0~6(0表示星期天)
  • 第6列要运行的命令

例如,数字表示第x分钟或者小时来执行,*表示每分钟/小时等执行。详细介绍见文末参考。

5.特别注意

  1. 树莓派放置环境,注意温度不能太高。
  2. 如果1 2小节设置完毕之后测试失败,试一下重启路由器,路由器的设置一般都是在重启之后生效的。不同的路由器相应地菜单和设置方法可能是不一样的,有一些甚至没有提供转发功能。
  3. 不要使用常用邮箱给树莓派做发送用,这样不安全,最好申请一个邮箱专门给树莓派发送报告用。
  4. 添加到crontab之前最好手动执行一下(python reportip.py)来看一下代码是否能够正常执行,可以的话再添加到crontab。
  5. 如果代码有授权失败异常(503),先不要怀疑是自己的配置出错了,去邮件提供商,看一下设置里面的「客户端SMTP」是否允许了(别问我怎么知道的,申请了三个邮箱才反应过来啊!)。
  6. 收信箱请设置一个规则,例如标题带[RPI]的放到[RPI]的放到一个RPI文件夹,不提示。这样自己就不会被打扰,邮件也不会被扔到垃圾箱了。
  7. 特别重要!crontab执行脚本的时候运行环境是和我们直接在shell执行不一样的!!!所以crontab文件中的命令全部写绝对路径,例如/usr/bin/python /root/rootcrons/reportip.py这样。脚本中所有用到的配置都要写绝对路径,例如file文件存放的目录(两个小时才找到这个bug啊衰!手动执行正常,crontab就是不正常!)。

6.推荐使用

  • TP-link路由器:提供了映射服务,我的路由器支持花生壳动态解析,挺好用的。
  • Secure Shell for Chrome:配色好看,而且使用这个,无论你用Windows,mac,linux还是什么系统,只要有Chrome,就可以随时登陆ssh。

SCURESHELL-FOR-CHROME

JUICESSH

  • what for ios?:我没有iPhone,iPhone用户自求多福吧 :)。

7.其他获得解决动态变化的IP的方案

这些方法我也考虑过,有兴趣的朋友可以实现以下:

  1. 发送邮件的方式改为用网页公开。写一个html网页,然后用ftp上传到自己的服务器,这样每次想要看最新的ip的话只要打开这个网页看一下就行了。缺点:总觉得树莓派不安全,放这里ftp密码有点不放心。
  2. 有一种叫做动态解析的东西。缺点:花钱。

8.树莓派做服务器的缺点

树莓派做到7×24运行,不知道靠不靠谱,我是个稳重的人,所以给树莓派贴了两片散热铜片还装了个风扇。只是…………这破烂玩意太吵了,这么点个风扇比机箱还吵。

安卓使用app无法ssh登陆,估计是22端口被屏蔽了,因为我用vpn访问是正常的。

9.参考资料

最后,如果你遇到了本文没有解决的问题,可以留言或电邮,会在6个小时之内得到回复。

 

WordPress网站迁移方案

我的博客最近就要过期了,不知不觉这个小站已经到了400M左右大小(基本都是图片占用的资源),服务器空间续费的话需要升级更高配置的套餐了,当然也要花更多的钱。但是不选择续费,而重新购买一次空间的话,就可以便宜一百左右。动动手指麻烦一下,省下一百块,还是蛮值得的。网站迁移的方法记录一下,以后可能有用。

我的网站迁移过一共三次,第一次是从新浪博客(广告实在太多了,一点都不好用)搬到了一个独立的小站。这次迁移没有什么好说的,因为新浪没有提供导出的功能,只好一篇一篇地复制过来,幸好那时候写的东西还不是很多。不过新浪的图片还有防盗链,整篇复制过来之后,图片是无法显示的,只能再下载到本地,然后上传到新的博客,太坑了啊!

然后用了Godaddy的主机,很便宜,但是速度在国内访问实在是太慢了啊!于是我又换了一家国内的空间服务商,经历了一段惨痛的备案经历之后,选择了港台服务器。就是现在用的这样,速度还凑活吧。从Godaddy换到港台服务器的经历也很痛苦,使用的Wordpress的导入导出功能,步骤如下:

  1. 从旧的Wordpress导出xml文件。
  2. 在新的空间安装好Wordpress,然后导入xml。
  3. 导入xml。
  4. 从源站的content/uploads中down下来所有的图片,上传到新的站点。
  5. 布置新的站点,更换主题,做googlefont替换成国内的等等。

这种方式缺点很明显,基本是重新建一个站,只是文章一样。而且我上传图片的时候,由于是用一台Windows下载,然后再上传的,导致了图片名字的编码出现了问题,所有图片名字含中文的都无法显示了。(这也提醒我们,在往Wordpress传图片的时候最好使用英文文件名字)。

现在这一次还是同一家服务商,不过因为折扣的原因没有续费而是新开一个空间。吃了以前的亏,这一次使用的方案就简单得多,只花了十几分钟吧。

  1. 将旧站Wordpress的根目录(注意不是所有目录,注意不公开的隐私文件的安全性)使用ftp下载然后上传到新站。最好使用和网站相同的操作系统,否则可能出现编码不一致的问题。如果新网站的panel上提供了类似ftp或者网站搬家的功能,就在方便不过了,只要输入旧站的ftp用户名和密码,就可以直接拷到新网站。我的空间就有,而且速度很快,400M不到一分钟。
  2. 这时候数据库的配置文件还是旧站的,不能正常连接。解决方法是:删除Wordpress根目录下地config.php,打开主页,这时候就和第一次安装Wordpress一样,要求输入数据库的信息,配置完毕后,主页可以正常打开了。
  3. 将旧站的数据库数据迁移过来。使用PHPmyadmin或者空间提供商提供的MySQL备份导出源数据,再进行导入就可以了。
  4. 最后一步,不要忘了将域名指向新的空间地址。

好了,本站的迁移也已经完成了。话说一年的空间又花了好多钱,还因为国内坑爹的备案制度不能用大陆的服务器多掏了几百块,好心疼……

还是好好写博客吧,不能浪费了这些钱。

 

动听的代码:音乐编程语言Alda

什么是Alda?

Alda是一种强大灵活的音乐编程语言,只需要在编辑器中写一些代码,然后通过软件将其编译成声音,就可以产生各种风格的音乐。它的作者Dave竭尽所能来让这门语言简单易用,对初学者友好。Alda的目标之一就是让编程经验不多甚至没有编程经验的人试用其进行创作。通过它的口号——为音乐家设计的一门音乐编程语言——也能看出它传达出的对无编程经验者友好的价值理念。

尽管Alda语法的目标是至简易用,但是扩展性依然很好,提供给用户的自由度很高。通过音乐编程的方式来带给作曲家最少的限制,或许可以激发创作潜能,这也是作者的一个心愿。

目前,Alda可以使用通用乐器数字接口中的所有乐器来创作曲谱。在不久的将来,Alda将会支持从基本声波、音乐文件中的片段或者其他形式的声音来合成音乐。Dave的初衷是,让所有的程序员和非程序员都可以轻松地创作各种形式的音乐,从古典乐到8位音乐到实验音景——只需要通过一个编辑器和Alda解释器。

这篇文章将会介绍如何安装并使用Alda写一些基本的乐谱。但开始之前,我们要先来了解一些历史。

UNC和MML

Alda的起源可以追溯到2004年。那时Dave在北卡罗来纳大学学习作曲和电子乐的创作方式。他尝试了FruityLoops但是没有什么进展。后来,开始沉迷于音乐编程的世界。敲门砖就是MML,在当时(可能现在依然是)那是创作任天堂的8位数字音乐最佳的方式。读了NullsleepMML指南并开始学习如何创作基本的任天堂音乐之后,Dave就沉迷于凭直觉创作音乐当中。但那时候一颗音乐编程的种子也在他的心里悄悄埋下了。

MML对Alda的影响很大。Dave很痴迷在文本编辑器中创作音乐的过程,但是他想将音乐变成扩展到更广泛地领域中去,他想取代通过MML创作音乐的方式并将其应用到音乐合成、电子乐甚至是古典音乐中去。

古典音乐?

Dave在成为一个职业的程序员之前,他所受的音乐教育使他对各种各样创作音乐的形式产生了兴趣。生活在计算机文化氛围浓厚的环境中,Dave也尝试过使用图形界面的程序来作曲,比如用过Guitar Pro来写吉他谱,对于传统的音乐谱子,他还尝试过CakewalkNoteworthy ComposerFinaleSibelusMuseScore等等。

其中,Sibelius用的比较多,这款软件可以生成乐谱的数字版本,从而得到每一种乐器的乐谱,不同的音乐家就可以方便地了解自己所负责演奏的部分。这个功能非常实用。

像Sibelius这样的音乐谱曲软件对专业的作曲家来说是一种重要的工具。然而对于同样是作曲家和程序员的Dave来说,这种GUI音乐谱曲软件存在很多局限性:

容易使人分心

在软件普及之前音乐是写出来的,所有的科技就是纸和笔。乐谱的布局、音符等等各种东西都是产生自大脑而流于笔尖。但是使用图形界面程序的时候,要选择一个音符就要在一层一层的菜单中查找,注意力就这样被转移了: 1. 找到你想要的东西很不便捷,当你找到的时候,灵感已经走了; 2. 所有的音符都列出来供你查找同样让人分心,Dave使用Sibelius的时候就常常在长时间寻找音符的时候走神。

相比之下,使用文本编辑器编程来创作音乐的方式可以更让人集中尽力。

限制太多

Dave认为作曲家所需要的创作环境应该回归根本——从一张白纸开始。还要可以借助于21世纪科技的力量,电脑应该可以解释乐谱并转化成音频以查看效果。如果可以方便地转化成传统的乐谱供音乐家阅读就更好啦。

图形化的作曲软件在当下已经做得不错了,不过他们走了捷径——跳过了“从白纸开始”。当然,如果你用Sibelius从头开始创作,看起来也像是从白纸开始,但是却比物理上的手稿纸差的多。你不能拿起笔来就开始写下心中的灵感,那些图形界面背后隐藏的数字限制住了你。

所有图形化的音乐编辑器都走了这种捷径。为了将你心中的音符表现出来,这些限制是必须的。音乐编程语言同样有这种限制(从某种意义上说这是所有的软件都避免不了的),但是因为它的可视化需求不高,也不需要维持一个图形用户界面,这种限制就小得多,降到了可以接受的范围之内。Dave作为一个作曲家,觉得这恰到好处,令人鼓舞。

安装

注意:由于Alda还在开发中,所以必须按照下面的过程来安装和运行,Dave尽可能将这些步骤设计的直观,如果发生问题可以通过电子邮件来联系他。相信在将来,Alda一定会更加简单易用。

开始安装之前,你需要两个工具:

  • Clojure的编译工具Boot。如果你的操作系统是Mac OS X,可以选择使用Homebrew安装,命令是brew install boot-clj。其他平台的安装方式可以查看这里
  • Alda执行文件,可以将下面的代码复制到终端运行安装:

现在alda命令行工具就已经安装好了。它可以解释和播放Alda文件,或者接收一行Alda代码来作为命令的参数。你也可以通过Alda的REPL(Read-Evaluate-Play Loop,阅读、评估、播放循环)来迭代创作乐曲。

Alda 101

我们先来通过Alda的REPL来体验一下Alda的语法吧,通过下面这个命令可以在命令行启动REPL:

注意:Alda使用了一个叫做FluidR3的音色库使MIDI听起来更舒服,首次启动的时候需要花几分钟下载一个125M的文件,如果不愿意下载这个文件可以使用alda repl --stock命令使用Java虚拟机内建的MIDI合成器(效果很糟糕)。

FluidR3下载完成之后,你将会看到下面这样的界面:

现在你就可以尝试在REPL中输入一些Alda代码了,按下回车就可以立刻听见效果。

上文已经提到,MML和LilyPond对Alda的影响很大,尤其是它们简单的语法。下面将会描述它们像MarkDown一样简单的语法,基本上可以达到所见即所得的效果。

音符

先从简单的开始,将下面这个形式的乐谱改写成Alda代码:

一共有四个音符:C,D,E,F.相应地Alda代码是:

试着在REPL中输入然后按下回车……什么都没发生对不对?因为没有指定乐器呀!先用钢琴来试试:

这次你应该听到钢琴弹奏的这四个音符了。你会发现提示符从>变成了p>ppiano的缩写,表示目前的乐器是钢琴,除非做出更改,否则接下来的代码都会以钢琴播放。

音阶

让我们来试试更多的音符。

你应该注意到了钢琴声从C大调持续上升。>在Alda语法中表示下一个音阶上升。在科学音调符号中音阶从C大调开始上升至B,一旦超过B,就在一个新的音阶上重新从C开始。在Alda中,每一种乐器都从音阶4开始,知道你告诉它改变音阶它才会变。改变音阶有两种方式:使用><来提高或降低音阶;或者使用o接一个数字直接指定一个音阶。如下例:

变音记号

音调升高或降低可以在后面加+或者-号。

连续使用两个升/降调也可以:

事实上,音符和升/降调在Alda中可以随意组合,虽然两个以上的升/降调没有什么用,但是语法中也没有强制制止这种行为:

上面是代替E调的不必要且笨拙的做法。

音符长度

Adla中音符的默认长度是1/4,可以通过在音符后面接数字来改变,数字代表音符长度类型,例如4代表1/4音符,8代表1/8音符,16代表1/16音符等。当你指定了一个音符的长度之后,接下来的音符都会默认使用这个长度。

上例中使用了|符号。这个符号用来分隔两段音乐,在Alda语言中是可选的,编译器会忽略这个符号。|的作用是让程序可读性更高。

休止符

休止符在Alda中和音符差不多,类似于“听不见”的音符。休止符用r表示。

附点音符

Alda也支持附点音符,使用方法是在音符长度后面加.,可以加一个或多个。

连接符

通过连接符可以将两个音符连接在一起,Alda中的符号是~

和弦

在同一时间用一种乐器演奏不同的音符,这就是和弦。在Alda中,和弦用/分隔多个音符来表示。

注意,就像连续的音符一样,指定了一个和弦的音符会影响后面的音符的长度。

在Alda里一个和弦中不需要所有的音符都用一个长度,这个特性使创作音乐时和弦的使用非常方便。

在和弦中也可以使用><来改变音阶,这样描述和弦的升降音就很方便了。

声部

Alda中多音符同时演奏的另一种表现方式是声部。上面用和弦表达的例子也可以组合和弦和声部来表现:

退出REPL,只需要键入bye然后回车。

写一章乐谱

刚刚,我们已经在Alda里尝试了一些代码,并且听到了效果。这种方式在确认一段音乐之前测试片段非常有用,当确认了曲调的时候,就该把它们写成乐谱了。

在Alda中,乐谱就是文本文件,你可以使用任何你喜欢的文本编辑器来写。按照约定,文件名应该使用.alda结尾。在终端的当前文件夹下建立一个新文件,并命名为test.alda来试一下吧。

然后在文本中键入以下内容:

运行alda play --file test.alda,你将会听到优美的巴松管曲调。

属性

你可能会发现在这里用到了新的语法,下面就解释以下这部分。(quant XX)(XX的范围是0-99)是改变音符的长度,但是不改变它的持续时间。数值表示的是听到的音符长度的百分点。当你听到上面的音乐的时候,F音符和G音符(调整至30%)很短而且是间断的,最后的A音符(调整至99%)就很长而且是连续的。

quant(quantization的缩写)是一种可以在Alda中设置的属性。volume也是一种属性,可以设置音符的声音。像大多数的属性一样,volume(也可以写作vol)的取值也是0-100.可以通过逗号分隔多种属性。

试一下编辑test.alda如下:

运行alda play --file test.alda你将会听到前两个音符和后三个音符的不同。

说句题外话,你可能会发现每次运行alda命令都会等上一段时间。这是选择使用Clojure的一个坏处:Clojure有一个众所周知的毛病就是启动很慢。你也可以通过REPL来测试——只要启动一次,之后的使用中就不会受到影响了。

在不久的将来,Alda会实现提前编译,单独运行,速度将会得到提升。

乐器合奏

终于,到了最好玩的地方了:写多个乐器合奏的乐谱。

Alda乐谱支持无限多的乐器同时合奏,可以在test.alda文件中尝试下面的代码:

在这里两种乐器是单独谱曲,小号和长号,但是当播放乐谱的时候,两种乐器会同时和谐地一起演奏。

也可以一次只写一部分,像下面这样:

这段代码和上面的例子效果完全一样。值得一提的是,当你切换成另一种乐器的时候,之前使用的乐器部分依然存在,只不过处于一种“暂停”的状态,当你切换回来的时候,可以从上次的地方继续写。

全局属性

上文中介绍了改变volume属性,tempo(节奏)是另一个可以改变的属性,下面就来试一下:

听见了吗?小号的声音变成了200bpm的速度,但是长号依然没有变,是默认的120bpm。这不是bug,而是一项特性。Alda中tempo是基于每一项乐器来设置的,这样就可以给两件乐器设置不同的节奏。

设置全局属性可以更改所有的乐器设定,方法如下:

tempo!属性通过加一个!改变全局乐器的节奏,可以试一下(tempo! 200)等。

标记

接下来要介绍的是Alda的特殊功能——它可以使乐器完美的互相配合。

标记的概念是,给一个音乐段标注一个名字。名字可以包含数字、字母、撇号、破折号、加号、圆括号,前两个符号必须是字母。下面是一些合法的例子:

  • chorus
  • voiceIn
  • last-note
  • verse(2)
  • bass+drums

使用标记功能需要两步。第一步,在一个名字的开头加一个%给音乐段命名;第二步,使用@接名字来将乐器插入这个音乐段。如下例,可以将大号(tuba)插入到小号(trumpet)的last-note部分。

到这里,目前Alda的所有功能就介绍完了,如果有任何问题和建议通过邮件来和Dave联系。这个项目是开源的,如果你是一个Clojure程序员,可以通过PR来贡献代码