<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>鬼の领地 &#187; 音乐</title>
	<atom:link href="http://blog.upsuper.org/tag/%e9%9f%b3%e4%b9%90/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.upsuper.org</link>
	<description>the place where there are some ghost appearing...</description>
	<lastBuildDate>Thu, 17 Jun 2010 08:12:24 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>鼠标控制音乐播放的小程序</title>
		<link>http://blog.upsuper.org/a-little-program-for-music-player-control-by-mouse/</link>
		<comments>http://blog.upsuper.org/a-little-program-for-music-player-control-by-mouse/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 12:06:03 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[D-Bus]]></category>
		<category><![CDATA[gtk]]></category>
		<category><![CDATA[Netbook]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[音乐]]></category>
		<category><![CDATA[鼠标]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=895</guid>
		<description><![CDATA[看这个标题一定很奇怪：难道我以前控制音乐播放不用鼠标么？这个文章的标题看起来像鼠标刚刚发明的推广期的文章……不过，当然不是这样的！
其实只是想：如何把我的小本合上放书架上，当作一个音乐播放器+功放，并用我的无线6键鼠当遥控器遥控控制之。
想想其实还是蛮有意义的功能，这样我做作业的时候可以不用戴耳机，不用用MP3，直接把本当播放器；同时，我不会看到屏幕上的东西，可以安心做作业~再看看我的6键无限鼠，那额外的功能键平时根本不用，也想不出能有什么用……这么好的东西就这样被我浪费了……（话说，拿本当音乐播放器是不是更浪费？）
说干就干！

首先提出构想：左键用于暂停和播放，滚轮调节音量，侧边的两个功能键用来切换上一首和下一首。至于右键和中键……再说吧，说不定以后可以扩展更多功能？说不定以后高兴了弄个鼠标手势什么的~嘿嘿
接下来查找资料。印象中我的 Audacious 是可以用 D-Bus 控制的。简单地查阅了一下相关资料，发现了一个叫做 MPRIS 的播放器控制接口。为此，我还专门学习了一下 python-dbus 的使用。
插一句话：python-dbus 怎么没有中文教程啊！英文教程看得还是蛮吃力的……
连接播放器的代码很简单：

1
2
3
import dbus
bus = dbus.SessionBus&#40;&#41;
player = bus.get_object&#40;'org.mpris.audacious', '/Player'&#41;

其中 org.mpris.audacious 指的是 audacious，支持 MPRIS 的其他播放器还可以有如下：

org.mpris.bmp
org.mpris.vlc
org.mpris.xmms2

至于那个 /Player 指的是我们要获取的是一个叫 Player 的对象，用于控制播放器。在 MPRIS 中除了 Player 以外，还有根对象 (&#8216;/&#8217;) 和 TrackList 对象 (&#8216;/TrackList&#8217;) 两个，具体的用法其文档里详细说明。这里我只用到了 Player 对象……
看看 Player 对象的方法还挺多，这里我用了这几个：

Next() &#8211; 切换到下一首歌曲
Prev() &#8211; 切换到上一首歌曲
Pause() &#8211; 暂停/继续
Play() &#8211; 播放歌曲
VolumeGet() &#8211; 获取当前音量
VolumeSet() &#8211; 设置音量

根据前面写的需求，这些已经足够了~
怎么用这些？很简单嘛！就像平时在 Python 里面调用类的方法一样~类型转换？不，那完全不需要你关心！
Python 程序拥有控制播放器的能力了，可是鼠标呢？如何捕获鼠标的动作呢？
想想……屏幕都关了……你还能指望他为你显示什么呢？干脆建立一个窗口把整个屏幕盖住算了！然后让他截获鼠标事件。
快速学习了一下 pygtk [...]]]></description>
			<content:encoded><![CDATA[<p>看这个标题一定很奇怪：难道我以前控制音乐播放不用鼠标么？这个文章的标题看起来像鼠标刚刚发明的推广期的文章……不过，当然不是这样的！</p>
<p>其实只是想：如何把我的小本合上放书架上，当作一个音乐播放器+功放，并用我的无线6键鼠当遥控器遥控控制之。</p>
<p>想想其实还是蛮有意义的功能，这样我做作业的时候可以不用戴耳机，不用用MP3，直接把本当播放器；同时，我不会看到屏幕上的东西，可以安心做作业~再看看我的6键无限鼠，那额外的功能键平时根本不用，也想不出能有什么用……这么好的东西就这样被我浪费了……（话说，拿本当音乐播放器是不是更浪费？）</p>
<p>说干就干！<br />
<span id="more-895"></span><br />
首先提出构想：左键用于暂停和播放，滚轮调节音量，侧边的两个功能键用来切换上一首和下一首。至于右键和中键……再说吧，说不定以后可以扩展更多功能？说不定以后高兴了弄个鼠标手势什么的~嘿嘿</p>
<p>接下来查找资料。印象中我的 Audacious 是可以用 D-Bus 控制的。简单地查阅了一下相关资料，发现了一个叫做 <a href="http://wiki.xmms2.xmms.se/wiki/Media_Player_Interfaces">MPRIS</a> 的播放器控制接口。为此，我还专门学习了一下 <a href="http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html">python-dbus</a> 的使用。</p>
<p>插一句话：python-dbus 怎么没有中文教程啊！英文教程看得还是蛮吃力的……</p>
<p>连接播放器的代码很简单：</p>

<div class="wp_codebox"><table><tr id="p89512"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p895code12"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> dbus
bus = dbus.<span style="color: black;">SessionBus</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
player = bus.<span style="color: black;">get_object</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'org.mpris.audacious'</span>, <span style="color: #483d8b;">'/Player'</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>其中 org.mpris.audacious 指的是 audacious，支持 MPRIS 的其他播放器还可以有如下：</p>
<ul>
<li>org.mpris.bmp</li>
<li>org.mpris.vlc</li>
<li>org.mpris.xmms2</li>
</ul>
<p>至于那个 /Player 指的是我们要获取的是一个叫 Player 的对象，用于控制播放器。在 MPRIS 中除了 Player 以外，还有根对象 (&#8216;/&#8217;) 和 TrackList 对象 (&#8216;/TrackList&#8217;) 两个，具体的用法其文档里详细说明。这里我只用到了 Player 对象……</p>
<p>看看 Player 对象的方法还挺多，这里我用了这几个：</p>
<ul>
<li>Next() &#8211; 切换到下一首歌曲</li>
<li>Prev() &#8211; 切换到上一首歌曲</li>
<li>Pause() &#8211; 暂停/继续</li>
<li>Play() &#8211; 播放歌曲</li>
<li>VolumeGet() &#8211; 获取当前音量</li>
<li>VolumeSet() &#8211; 设置音量</li>
</ul>
<p>根据前面写的需求，这些已经足够了~</p>
<p>怎么用这些？很简单嘛！就像平时在 Python 里面调用类的方法一样~类型转换？不，那完全不需要你关心！</p>
<p>Python 程序拥有控制播放器的能力了，可是鼠标呢？如何捕获鼠标的动作呢？</p>
<p>想想……屏幕都关了……你还能指望他为你显示什么呢？干脆建立一个窗口把整个屏幕盖住算了！然后让他截获鼠标事件。</p>
<p>快速学习了一下 pygtk 的用法（其实就是照着 Hello World 打了一遍），差不多就知道怎么用了。窗口的建立代码大约如下：</p>

<div class="wp_codebox"><table><tr id="p89513"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p895code13"><pre class="python" style="font-family:monospace;">window = gtk.<span style="color: black;">Window</span><span style="color: black;">&#40;</span>gtk.<span style="color: black;">WINDOW_TOPLEVEL</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">fullscreen</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
gtk.<span style="color: black;">main</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>这段代码很好理解了，第一行就是创建窗口对象，第二行令其全屏，第三行设置其显示，第四行开始 GTK 的主循环。</p>
<p>下面就是鼠标事件的问题了~添加事件用的是类似下面的代码：</p>

<div class="wp_codebox"><table><tr id="p89514"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p895code14"><pre class="python" style="font-family:monospace;">window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'key-press-event'</span>, key_press<span style="color: black;">&#41;</span>
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'destroy'</span>, <span style="color: #ff7700;font-weight:bold;">lambda</span> widget, data = <span style="color: #008000;">None</span>: gtk.<span style="color: black;">main_quit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>第一个是注册了键盘按键的事件捕获，将 key-press-event 事件绑定上 key_press 这个函数，而把窗口的销毁事件 destroy 连接到退出 GTK 主循环。说一句废话，连接事件的语句要放在 gtk.main() 之前……key_press 主要用来实现当点击 escape 时退出：</p>

<div class="wp_codebox"><table><tr id="p89515"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p895code15"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> key_press<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">if</span> gdk.<span style="color: black;">keyval_name</span><span style="color: black;">&#40;</span>event.<span style="color: black;">keyval</span><span style="color: black;">&#41;</span> == <span style="color: #483d8b;">'Escape'</span>:
    window.<span style="color: black;">destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>好了，下面是鼠标点击事件 button-press-event：</p>

<div class="wp_codebox"><table><tr id="p89516"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p895code16"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> button_press<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">print</span> event
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'button-press-event'</span>, button_press<span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>试试？不行的！差了一番后，发现 Window 这个东西默认是不打开鼠标点击的事件捕获的，逼近大家很少会点窗口本身，都是点里面的按钮什么的……下面的代码要求窗口打开鼠标点击事件的捕获：</p>

<div class="wp_codebox"><table><tr id="p89517"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p895code17"><pre class="python" style="font-family:monospace;">window.<span style="color: black;">add_events</span><span style="color: black;">&#40;</span>gtk.<span style="color: black;">gdk</span>.<span style="color: black;">BUTTON_PRESS_MASK</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>接下来就可以了~event.button 表示的是点击的键是哪个。检查了一下，左键是1，右键是3，中键是2，功能键1是8，功能键2是9。滚轮呢？</p>
<p>原来滚轮有自己的事件 scroll。</p>

<div class="wp_codebox"><table><tr id="p89518"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p895code18"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> scroll<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">print</span> event
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'scroll-event'</span>, scroll<span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>直接可以用了。识别滚轮方向的是 event.direction，应该是 gtk.gdk.SCROLL_UP、SCROLL_DOWN、SCROLL_LEFT、SCROLL_RIGHT 其中的一个。</p>
<p>下面根据最初的设想，把他们都拼起来就形成了最初的版本：</p>

<div class="wp_codebox"><table><tr id="p89519"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
</pre></td><td class="code" id="p895code19"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> pygtk
pygtk.<span style="color: black;">require</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'2.0'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">import</span> gtk
<span style="color: #ff7700;font-weight:bold;">from</span> gtk <span style="color: #ff7700;font-weight:bold;">import</span> gdk
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> dbus
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> button_press<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  button = event.<span style="color: black;">button</span>
  <span style="color: #ff7700;font-weight:bold;">if</span> button == <span style="color: #ff4500;">1</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> player.<span style="color: black;">GetStatus</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == <span style="color: #ff4500;">2</span>:
      player.<span style="color: black;">Play</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
      player.<span style="color: black;">Pause</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #ff4500;">9</span>:
    player.<span style="color: black;">Prev</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #ff4500;">8</span>:
    player.<span style="color: black;">Next</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> scroll<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">if</span> event.<span style="color: black;">direction</span> == gdk.<span style="color: black;">SCROLL_UP</span>:
    player.<span style="color: black;">VolumeSet</span><span style="color: black;">&#40;</span>player.<span style="color: black;">VolumeGet</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> + <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> event.<span style="color: black;">direction</span> == gdk.<span style="color: black;">SCROLL_DOWN</span>:
    player.<span style="color: black;">VolumeSet</span><span style="color: black;">&#40;</span>player.<span style="color: black;">VolumeGet</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> - <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> key_press<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">if</span> gdk.<span style="color: black;">keyval_name</span><span style="color: black;">&#40;</span>event.<span style="color: black;">keyval</span><span style="color: black;">&#41;</span> == <span style="color: #483d8b;">'Escape'</span>:
    window.<span style="color: black;">destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
bus = dbus.<span style="color: black;">SessionBus</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
player = bus.<span style="color: black;">get_object</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'org.mpris.audacious'</span>, <span style="color: #483d8b;">'/Player'</span><span style="color: black;">&#41;</span>
&nbsp;
window = gtk.<span style="color: black;">Window</span><span style="color: black;">&#40;</span>gtk.<span style="color: black;">WINDOW_TOPLEVEL</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'destroy'</span>, <span style="color: #ff7700;font-weight:bold;">lambda</span> widget, data = <span style="color: #008000;">None</span>: gtk.<span style="color: black;">main_quit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">add_events</span><span style="color: black;">&#40;</span>gdk.<span style="color: black;">BUTTON_PRESS_MASK</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'button-press-event'</span>, button_press<span style="color: black;">&#41;</span>
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'key-press-event'</span>, key_press<span style="color: black;">&#41;</span>
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'scroll-event'</span>, scroll<span style="color: black;">&#41;</span>
window.<span style="color: black;">fullscreen</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
gtk.<span style="color: black;">main</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>OK 看起来不错了，也能控制了。可是，作为一个程序员，怎么能不考虑各种意外呢？试想，如果我们控制着控制着，突然，一个不明真相的窗口弹了出来怎么办呢？！这是一个问题……</p>
<p>最容易想到的方法：把这个窗口永久置顶！</p>
<p>事实上也确实找到了这么个方法，就是把窗体注册成 dock。我们知道 dock 是需要永久置顶的~</p>
<p>用如下方法可以让窗体变成 Dock：</p>

<div class="wp_codebox"><table><tr id="p89520"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p895code20"><pre class="python" style="font-family:monospace;">window.<span style="color: black;">set_type_hint</span><span style="color: black;">&#40;</span>gtk.<span style="color: black;">gdk</span>.<span style="color: black;">WINDOW_TYPE_HINT_DOCK</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>但是问题又来了：dock 似乎没法接受键盘输入。因为 dock 只是形式上覆盖，并且可以拦截一切在他上面发生的鼠标事件，可键盘焦点就未必在他那里了~</p>
<p>那么我们就不要键盘事件了吧~于是我就把键盘退出给删了，改成了双击退出~查了下资料，双击事件也通过 button-press-event 发送的，必须根据 event.type 来判断是单击、双击还是三击。此外，双击和三击中的每一次点击都会引发一次单击事件。</p>
<p>OK，于是我们把 button_press 函数改成下面这样：</p>

<div class="wp_codebox"><table><tr id="p89521"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code" id="p895code21"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> button_press<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">if</span> event.<span style="color: #008000;">type</span> == gdk._2BUTTON_PRESS:
    window.<span style="color: black;">destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> event.<span style="color: #008000;">type</span> == gdk._3BUTTON_PRESS:
    <span style="color: #ff7700;font-weight:bold;">return</span>
  button = event.<span style="color: black;">button</span>
  <span style="color: #ff7700;font-weight:bold;">if</span> button == <span style="color: #ff4500;">1</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> player.<span style="color: black;">GetStatus</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == <span style="color: #ff4500;">2</span>:
      player.<span style="color: black;">Play</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
      player.<span style="color: black;">Pause</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #ff4500;">9</span>:
    player.<span style="color: black;">Prev</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #ff4500;">8</span>:
    player.<span style="color: black;">Next</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>然后删掉键盘处理，最后就成了这样：</p>

<div class="wp_codebox"><table><tr id="p89522"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
</pre></td><td class="code" id="p895code22"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> pygtk
pygtk.<span style="color: black;">require</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'2.0'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">import</span> gtk
<span style="color: #ff7700;font-weight:bold;">from</span> gtk <span style="color: #ff7700;font-weight:bold;">import</span> gdk
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> dbus
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> button_press<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">if</span> event.<span style="color: #008000;">type</span> == gdk._2BUTTON_PRESS:
    window.<span style="color: black;">destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> event.<span style="color: #008000;">type</span> == gdk._3BUTTON_PRESS:
    <span style="color: #ff7700;font-weight:bold;">return</span>
  button = event.<span style="color: black;">button</span>
  <span style="color: #ff7700;font-weight:bold;">if</span> button == <span style="color: #ff4500;">1</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> player.<span style="color: black;">GetStatus</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == <span style="color: #ff4500;">2</span>:
      player.<span style="color: black;">Play</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
      player.<span style="color: black;">Pause</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #ff4500;">9</span>:
    player.<span style="color: black;">Prev</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #ff4500;">8</span>:
    player.<span style="color: black;">Next</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> scroll<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">if</span> event.<span style="color: black;">direction</span> == gdk.<span style="color: black;">SCROLL_UP</span>:
    player.<span style="color: black;">VolumeSet</span><span style="color: black;">&#40;</span>player.<span style="color: black;">VolumeGet</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> + <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> event.<span style="color: black;">direction</span> == gdk.<span style="color: black;">SCROLL_DOWN</span>:
    player.<span style="color: black;">VolumeSet</span><span style="color: black;">&#40;</span>player.<span style="color: black;">VolumeGet</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> - <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>
&nbsp;
bus = dbus.<span style="color: black;">SessionBus</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
player = bus.<span style="color: black;">get_object</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'org.mpris.audacious'</span>, <span style="color: #483d8b;">'/Player'</span><span style="color: black;">&#41;</span>
&nbsp;
window = gtk.<span style="color: black;">Window</span><span style="color: black;">&#40;</span>gtk.<span style="color: black;">WINDOW_TOPLEVEL</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'destroy'</span>, <span style="color: #ff7700;font-weight:bold;">lambda</span> widget, data = <span style="color: #008000;">None</span>: gtk.<span style="color: black;">main_quit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">add_events</span><span style="color: black;">&#40;</span>gdk.<span style="color: black;">BUTTON_PRESS_MASK</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'button-press-event'</span>, button_press<span style="color: black;">&#41;</span>
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'scroll-event'</span>, scroll<span style="color: black;">&#41;</span>
window.<span style="color: black;">set_type_hint</span><span style="color: black;">&#40;</span>gdk.<span style="color: black;">WINDOW_TYPE_HINT_DOCK</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">fullscreen</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
gtk.<span style="color: black;">main</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>完成了！</p>
<p>以后就可以拿我的小本来当音乐播放器+功放啦~</p>
<p>参考资料：</p>
<ul>
<li><a href="http://wiki.xmms2.xmms.se/wiki/MPRIS">MPRIS &#8211; XMMS2</a></li>
<li><a href="http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html">dbus-python tutorial</a></li>
<li><a href="http://www.pygtk.org/pygtk2tutorial/index.html">PyGTK 2.0 Tutorial</a></li>
<li><a href="http://library.gnome.org/devel/pygtk/stable/">PyGTK 2.0 Reference Manual</a></li>
<li><a href="http://www.daa.com.au/pipermail/pygtk/2004-January/006832.html">[pygtk] how to generate scroll wheel mouse event.</a></li>
<li><a href="http://topic.csdn.net/t/20030910/11/2243673.html">如何让窗口置顶？ Linux/Unix社区 / 程序开发区 &#8211; CSDN社区 community.csdn.net</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/a-little-program-for-music-player-control-by-mouse/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>SQL随机的小技巧</title>
		<link>http://blog.upsuper.org/sql-random-order-tip/</link>
		<comments>http://blog.upsuper.org/sql-random-order-tip/#comments</comments>
		<pubDate>Wed, 21 Jan 2009 02:48:08 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[雕虫小技]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[随机]]></category>
		<category><![CDATA[音乐]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=637</guid>
		<description><![CDATA[很早以前就知道，SQL 如果要随机取可以用 ORDER BY rand() 来做（那是在做学校论坛的标题名人名言的时候查到的），这次做的学校征集各时段音乐的平台，为了去掉先提交者在显示位置上的绝对优势，我今天也给他加了个随机。第一次知道，随机排列也可以放第二关键字~
SQL查询语句由昨天的

1
SELECT * FROM `school_music` ORDER BY `type`

变成了

1
SELECT * FROM `school_music` ORDER BY `type`, rand&#40;&#41;

果然在类别内随机成功！
顺便，这里号召大家支持一下我传的 だんご大家族 ~off vocal ver.~ 做晚自习后的那音乐~要听完，很有感觉地说~
无损版下载：
完整版：http://www.rayfile.com/zh-cn/files/2aa66517-e538-11dd- 9288-0014221b798a/
去人声：http://www.rayfile.com/zh-cn/files/2ab65c7a-e538-11dd-bd6a- 0014221b798a/
]]></description>
			<content:encoded><![CDATA[<p>很早以前就知道，SQL 如果要随机取可以用 ORDER BY rand() 来做（那是在做学校论坛的标题名人名言的时候查到的），这次做的学校征集各时段音乐的平台，为了去掉先提交者在显示位置上的绝对优势，我今天也给他加了个随机。第一次知道，随机排列也可以放第二关键字~</p>
<p>SQL查询语句由昨天的</p>

<div class="wp_codebox"><table><tr id="p63725"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p637code25"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">`school_music`</span> <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> <span style="color: #ff0000;">`type`</span></pre></td></tr></table></div>

<p>变成了</p>

<div class="wp_codebox"><table><tr id="p63726"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p637code26"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">`school_music`</span> <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> <span style="color: #ff0000;">`type`</span><span style="color: #66cc66;">,</span> rand<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>果然在类别内随机成功！</p>
<p>顺便，这里号召大家支持一下我传的 だんご大家族 ~off vocal ver.~ 做晚自习后的那音乐~要听完，很有感觉地说~</p>
<p>无损版下载：<br />
完整版：<a href="http://www.rayfile.com/zh-cn/files/2aa66517-e538-11dd- 9288-0014221b798a/" target="_blank">http://www.rayfile.com/zh-cn/files/2aa66517-e538-11dd- 9288-0014221b798a/</a><br />
去人声：<a href="http://www.rayfile.com/zh-cn/files/2aa66517-e538-11dd- 9288-0014221b798a/" target="_blank">http://www.rayfile.com/zh-cn/files/2ab65c7a-e538-11dd-bd6a- 0014221b798a/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/sql-random-order-tip/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu之旅（九）</title>
		<link>http://blog.upsuper.org/ubuntu-trip-9/</link>
		<comments>http://blog.upsuper.org/ubuntu-trip-9/#comments</comments>
		<pubDate>Sat, 19 Jul 2008 15:03:40 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[探究学习]]></category>
		<category><![CDATA[AAC]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[正则表达式]]></category>
		<category><![CDATA[音乐]]></category>
		<category><![CDATA[音频]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=197</guid>
		<description><![CDATA[很久没继续，因为前一段时间迷恋 CLANNAD + 信息组培训……
话说这次因为要收新歌，所以研究了一下 Ubuntu 下的音频相关，发现了一个不错的小工具 Audio-convert-mod 音频魔方，安装有一点不同，参见上一篇日志。
安装好以后发现我不得不放弃以前收集时采用的 wma 格式，因为 Linux 下似乎很难找到转为 wma 的方法（虽然最后还是被我找到了，见此处，不过不想采用），而且经过网上一番查找对比，最终选定了 AAC 格式作为新一批的收录标准格式。AAC 的优点我在这里就不多阐述了，反正好像 wma 和 mp3 和它是没得比的，唯独就是 mpc 需要考量。
完成了标准格式的选定，我还需要符合我收藏标准的标签和文件命名方式。标签方面，用 Audacious 不能修改 AAC 的标签，而传说中强大的 Kid3 修改后，就不能播放了……今天下午刚刚发现一个很好的软件 EasyTAG （可直接用 apt 安装），声称支持 AAC。不过弄了半天一直不能现实出 .aac 的文件。开始以为是没有安装依赖的 libmp4v2，不过安装了还是没有。在官方的手册上看了一会儿，突然发现那里面只提到用 mpeg4ip 以兼容 mp4！！！我把扩展名改为 .mp4，EasyTAG 可以找到了，修改后重命名回去也可以正常播放。成功了哈~

最后是关于命名的问题。我的命名一向是“轨道编号-歌曲名”的方式命名的，但是网上下载的歌曲却多是“轨道编号.歌曲名”的。以前在 Windows 下用一个叫做拖把更名器的东西，还是很好用的。于是就在想 Linux 下有没有这样的东西呢？经过查找，发现了 rename 这个命令。这个命令支持 Perl 的正则表达式，因此功能变得十分强大，比如我的问题只要

1
rename 's/(\d{2})\.(.*)/$1\-$2/' *

就可以了。其中

1
s/(\d{2})\.(.*)/$1\-$2/

就是 Perl 的正则表达式，具体的使用方法可以参看Perl正则表达式详解，不过要特别注意的是，rename 推荐使用“$1”、“$2”这样的形式代替“\1”、“\2”，这似乎和 [...]]]></description>
			<content:encoded><![CDATA[<p>很久没继续，因为前一段时间迷恋 CLANNAD + 信息组培训……</p>
<p>话说这次因为要收新歌，所以研究了一下 Ubuntu 下的音频相关，发现了一个不错的小工具 Audio-convert-mod 音频魔方，安装有一点不同，参见<a href="http://blog.upsuper.org/installation-of-audio-convert-mod/">上一篇日志</a>。</p>
<p>安装好以后发现我不得不放弃以前收集时采用的 wma 格式，因为 Linux 下似乎很难找到转为 wma 的方法（虽然最后还是被我找到了，见<a href="http://semson.blogspot.com/2008/05/linux-audoi-wma.html" target="_blank">此处</a>，不过不想采用），而且经过网上一番查找对比，最终选定了 AAC 格式作为新一批的收录标准格式。AAC 的优点我在这里就不多阐述了，反正好像 wma 和 mp3 和它是没得比的，唯独就是 mpc 需要考量。</p>
<p>完成了标准格式的选定，我还需要符合我收藏标准的标签和文件命名方式。标签方面，用 Audacious 不能修改 AAC 的标签，而传说中强大的 Kid3 修改后，就不能播放了……今天下午刚刚发现一个很好的软件 EasyTAG （可直接用 apt 安装），声称支持 AAC。不过弄了半天一直不能现实出 .aac 的文件。开始以为是没有安装依赖的 libmp4v2，不过安装了还是没有。在官方的手册上看了一会儿，突然发现那里面只提到用 mpeg4ip 以兼容 mp4！！！我把扩展名改为 .mp4，EasyTAG 可以找到了，修改后重命名回去也可以正常播放。成功了哈~<br />
<span id="more-197"></span><br />
最后是关于命名的问题。我的命名一向是“轨道编号-歌曲名”的方式命名的，但是网上下载的歌曲却多是“轨道编号.歌曲名”的。以前在 Windows 下用一个叫做拖把更名器的东西，还是很好用的。于是就在想 Linux 下有没有这样的东西呢？经过查找，发现了 rename 这个命令。这个命令支持 Perl 的正则表达式，因此功能变得十分强大，比如我的问题只要</p>

<div class="wp_codebox"><table><tr id="p19729"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p197code29"><pre class="bash" style="font-family:monospace;">rename <span style="color: #ff0000;">'s/(\d{2})\.(.*)/$1\-$2/'</span> <span style="color: #000000; font-weight: bold;">*</span></pre></td></tr></table></div>

<p>就可以了。其中</p>

<div class="wp_codebox"><table><tr id="p19730"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p197code30"><pre class="regular" style="font-family:monospace;">s/(\d{2})\.(.*)/$1\-$2/</pre></td></tr></table></div>

<p>就是 Perl 的正则表达式，具体的使用方法可以参看<a href="http://blog.csdn.net/dreamnear/archive/2007/11/08/1872965.aspx" target="_blank">Perl正则表达式详解</a>，不过要特别注意的是，rename 推荐使用“$1”、“$2”这样的形式代替“\1”、“\2”，这似乎和 Perl 不大一样？</p>
<p>后面的 * 就是尝试对每一个文件重命名咯，很简单的。不过正则表达式可能要学一点时间，另外推荐我看的正则表达式的教程：<a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm" target="_blank">正则表达式30分钟入门教程</a>，写得比较不错，虽然和 Perl 的有些许不同，不过大同小异，学学也无妨。况且这个写得比较容易入门的说~</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/ubuntu-trip-9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>安装Audio-convert-mod</title>
		<link>http://blog.upsuper.org/installation-of-audio-convert-mod/</link>
		<comments>http://blog.upsuper.org/installation-of-audio-convert-mod/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 14:30:06 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[雕虫小技]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[音乐]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=158</guid>
		<description><![CDATA[今天下了 CLANNAD 的原声碟，想要转换格式进入我的音乐收藏。因为废掉了 Windows，在 Ubuntu 下也需要找一个好的转换软件代替。在网上查找了一番，发现一个很方便的东西 Audio-convert-mod，不过安装它不是那么一帆风顺的。
首先，从官方网站下载了源码包，因为没有提供 deb 包……然后解压后，在里面运行

1
2
3
sudo ./configure --prefix=/usr
sudo make
sudo make install

安装完成（我本来是没有用 sudo 和那个 &#8211;prefix 参数的，结果怎么弄都弄不清楚）。
在 bash 中执行 audio-convert-mod 提示：

1
python: can't open file '/usr/share/local/share/audio-convert-mod/acm-runapp.pyw': [Errno 2] No such file or directory

经过调查，发现 acm-runapp.pyw 出现在 /usr/share/audio-convert-mod 里，而根本不存在 /usr/share/local 这个目录……于是我就突发奇想，把 /usr 链接到 /usr/share/local 上，结果就可以了：

1
sudo ln -s /usr /usr/share/local

唉……有些东西还真是麻烦……
]]></description>
			<content:encoded><![CDATA[<p>今天下了 CLANNAD 的原声碟，想要转换格式进入我的音乐收藏。因为废掉了 Windows，在 Ubuntu 下也需要找一个好的转换软件代替。在网上查找了一番，发现一个很方便的东西 Audio-convert-mod，不过安装它不是那么一帆风顺的。</p>
<p>首先，从<a href="http://www.diffingo.com/content/view/13/47/lang,en/" target="_blank">官方网站</a>下载了源码包，因为没有提供 deb 包……然后解压后，在里面运行</p>

<div class="wp_codebox"><table><tr id="p15834"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p158code34"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> .<span style="color: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--prefix</span>=<span style="color: #000000; font-weight: bold;">/</span>usr
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></pre></td></tr></table></div>

<p>安装完成（我本来是没有用 sudo 和那个 &#8211;prefix 参数的，结果怎么弄都弄不清楚）。</p>
<p>在 bash 中执行 audio-convert-mod 提示：</p>

<div class="wp_codebox"><table><tr id="p15835"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p158code35"><pre class="text" style="font-family:monospace;">python: can't open file '/usr/share/local/share/audio-convert-mod/acm-runapp.pyw': [Errno 2] No such file or directory</pre></td></tr></table></div>

<p>经过调查，发现 acm-runapp.pyw 出现在 /usr/share/audio-convert-mod 里，而根本不存在 /usr/share/local 这个目录……于是我就突发奇想，把 /usr 链接到 /usr/share/local 上，结果就可以了：</p>

<div class="wp_codebox"><table><tr id="p15836"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p158code36"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>usr <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">local</span></pre></td></tr></table></div>

<p>唉……有些东西还真是麻烦……</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/installation-of-audio-convert-mod/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>H&amp;H, 我们的聚会</title>
		<link>http://blog.upsuper.org/h-h-our-gathering/</link>
		<comments>http://blog.upsuper.org/h-h-our-gathering/#comments</comments>
		<pubDate>Fri, 06 Jun 2008 14:03:02 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[琐事杂谈]]></category>
		<category><![CDATA[Mondialogo]]></category>
		<category><![CDATA[公园]]></category>
		<category><![CDATA[学校]]></category>
		<category><![CDATA[照片]]></category>
		<category><![CDATA[聚会]]></category>
		<category><![CDATA[音乐]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=105</guid>
		<description><![CDATA[今天纯粹是出去玩的，很开心！
先是到三中门口集合，作为一中学生，竟然跑到三中门口来集合，实在是满有趣的~我到的早，大概提早了半个小时，结果在那里遇到了骏哥和k姐，后来灵翔也来了，再后来又有一些不认识的人来了，然后他们就离开了。大概也是来聚会的吧？他们反正不肯告诉我。随后宝宝就到了，接下来是 Flora ，然后是 Yunkim ，很快 Silvia 也来了，然后我们就走向西湖。

不懂怎么走，走到了一个叫“更衣亭”的地方， cyy 到了西湖门口，我们就在那里等她。顺便拍了张照片~
等到了 cyy 就继续走，走向游乐区。
具体玩的顺序忘记了，好象是先去玩了海盗船。记得蛮小的时候去玩过，觉得很可怕，我还以为现在会好一些呢，结果去玩，那个接近90度的东西……还是怕了……很恐怖的……虽然我几乎没有叫，但是很难受的说……我们5个坐在一端， Yunkim 独自坐在另一端，十分沉着地举着手机给我们拍照……
后来还玩了碰碰车，也蛮不错的，很久没玩了。只是我觉得那方向盘很奇怪的说，不懂该怎么控制……随后还有很多有趣的游戏，唤起了童年的回忆~
离开西湖之后，就来到左海。很明显的感觉是，左海的游戏很贵！都比西湖贵了1倍以上，而且某些十分无聊，我就不说什么了……离开之前留了张影。
Slivia 因为家里有客，先回去吃饭了，我们则被 Yunkim 带着来到某店吃午饭。饭后，那两个女生竟然去逛商场逛得十分开心……我这下知道了，原来女的都一个样，喜欢逛商场啊！我们把 Slivia 叫来，随后就找了家KTV进去。
话说今天使我第一次在KTV里拿话筒唱，以前不想拿的。今天觉得大家都那么熟，就满拿咯~今天 Slivia 唱的歌被录了三首，其中一首还唱破音了。我们准备把那个发出来，尽情期待！
最后再来几张在KTV里的照片：

]]></description>
			<content:encoded><![CDATA[<p>今天纯粹是出去玩的，很开心！</p>
<p>先是到三中门口集合，作为一中学生，竟然跑到三中门口来集合，实在是满有趣的~我到的早，大概提早了半个小时，结果在那里遇到了骏哥和k姐，后来灵翔也来了，再后来又有一些不认识的人来了，然后他们就离开了。大概也是来聚会的吧？他们反正不肯告诉我。随后宝宝就到了，接下来是 Flora ，然后是 Yunkim ，很快 Silvia 也来了，然后我们就走向西湖。</p>
<p><span id="more-105"></span></p>
<p><a href="http://blog.upsuper.org/wp-content/uploads/2008/06/dsc00821.jpg"><img class="alignright size-medium wp-image-106" title="摄于西湖更衣亭" src="http://blog.upsuper.org/wp-content/uploads/2008/06/dsc00821-300x225.jpg" alt="" width="300" height="225" /></a>不懂怎么走，走到了一个叫“更衣亭”的地方， cyy 到了西湖门口，我们就在那里等她。顺便拍了张照片~</p>
<p>等到了 cyy 就继续走，走向游乐区。</p>
<p>具体玩的顺序忘记了，好象是先去玩了海盗船。记得蛮小的时候去玩过，觉得很可怕，我还以为现在会好一些呢，结果去玩，那个接近90度的东西……还是怕了……很恐怖的……虽然我几乎没有叫，但是很难受的说……我们5个坐在一端， Yunkim 独自坐在另一端，十分沉着地举着手机给我们拍照……</p>
<p>后来还玩了碰碰车，也蛮不错的，很久没玩了。只是我觉得那方向盘很奇怪的说，不懂该怎么控制……随后还有很多有趣的游戏，唤起了童年的回忆~</p>
<p><a href="http://blog.upsuper.org/wp-content/uploads/2008/06/dsc00835.jpg"><img class="alignright size-medium wp-image-107" title="dsc00835" src="http://blog.upsuper.org/wp-content/uploads/2008/06/dsc00835-300x225.jpg" alt="" width="300" height="225" /></a>离开西湖之后，就来到左海。很明显的感觉是，左海的游戏很贵！都比西湖贵了1倍以上，而且某些十分无聊，我就不说什么了……离开之前留了张影。</p>
<p>Slivia 因为家里有客，先回去吃饭了，我们则被 Yunkim 带着来到某店吃午饭。饭后，那两个女生竟然去逛商场逛得十分开心……我这下知道了，原来女的都一个样，喜欢逛商场啊！我们把 Slivia 叫来，随后就找了家KTV进去。</p>
<p>话说今天使我第一次在KTV里拿话筒唱，以前不想拿的。今天觉得大家都那么熟，就满拿咯~今天 Slivia 唱的歌被录了三首，其中一首还唱破音了。我们准备把那个发出来，尽情期待！</p>
<p>最后再来几张在KTV里的照片：</p>
<p><a href="http://blog.upsuper.org/wp-content/uploads/2008/06/dsc00856.jpg"><img class="alignnone size-medium wp-image-108" title="dsc00856" src="http://blog.upsuper.org/wp-content/uploads/2008/06/dsc00856-300x225.jpg" alt="" width="300" height="225" /></a><a href="http://blog.upsuper.org/wp-content/uploads/2008/06/dsc00860.jpg"><img class="alignnone size-medium wp-image-109" title="dsc00860" src="http://blog.upsuper.org/wp-content/uploads/2008/06/dsc00860-300x225.jpg" alt="" width="300" height="225" /></a><a href="http://blog.upsuper.org/wp-content/uploads/2008/06/dsc00864.jpg"><img class="alignnone size-medium wp-image-110" title="dsc00864" src="http://blog.upsuper.org/wp-content/uploads/2008/06/dsc00864-300x225.jpg" alt="" width="300" height="225" /></a><a href="http://blog.upsuper.org/wp-content/uploads/2008/06/dsc00865.jpg"><img class="alignnone size-medium wp-image-111" title="dsc00865" src="http://blog.upsuper.org/wp-content/uploads/2008/06/dsc00865-300x225.jpg" alt="" width="300" height="225" /></a><a href="http://blog.upsuper.org/wp-content/uploads/2008/06/dsc00866.jpg"><img class="alignnone size-medium wp-image-112" title="dsc00866" src="http://blog.upsuper.org/wp-content/uploads/2008/06/dsc00866-300x225.jpg" alt="" width="300" height="225" /></a><a href="http://blog.upsuper.org/wp-content/uploads/2008/06/dsc00873.jpg"><img class="alignnone size-medium wp-image-113" title="dsc00873" src="http://blog.upsuper.org/wp-content/uploads/2008/06/dsc00873-300x225.jpg" alt="" width="300" height="225" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/h-h-our-gathering/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>学校的新音乐</title>
		<link>http://blog.upsuper.org/school-new-music/</link>
		<comments>http://blog.upsuper.org/school-new-music/#comments</comments>
		<pubDate>Wed, 09 Jan 2008 11:06:51 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[琐事杂谈]]></category>
		<category><![CDATA[学校]]></category>
		<category><![CDATA[音乐]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=16</guid>
		<description><![CDATA[学校前几天又换音乐了，这里都贴出来：

起床音乐：《大地王国》(This Land)
选自：电影《狮子王》(The Lion King)
下载：链接到Good.gd下载
早出门音乐：第八a小调小提琴协奏曲第一章
选自：《和谐的灵感》(L&#8217; estro Armonico)
作曲：维瓦尔蒂 (Vivaldi)
下载：连接到Good.gd下载

指挥：内维尔·马里纳 (Neville Marriner)
乐团：圣马丁室内乐团 (Saint-Martin-in-the-Fields)
录音日期：1973
发行公司：DECCA
CD编号：443 477-2


午出门音乐：《D大调第一圆号协奏曲》(Horn Concerto No.1 In D)呈示部
选自：《圆号协奏曲》(Horn Concertos)
作曲：莫扎特 (Mozart)
下载：链接到Good.gd下载

指挥：内维尔·马里纳 (Neville Marriner)
乐团：圣马丁室内乐团 (Saint-Martin-in-the-Fields)
圆号独奏：艾伦·西维尔 (Allen Sivyer)


晚出门音乐：《芦笛舞曲》(f. Danse des Mirlitons)
选自：《胡桃夹子》(The Nutcracker)
作曲：柴科夫斯基 (Tchaikovsky)
下载：连接到Good.gd下载

指挥：麦克拉斯 (Mackerras)
乐团：伦敦交响乐团 (London Symphony Orchestra)
发行公司：TELARC
CD编号：CD-80140


晚自修后音乐：《月与海的子守歌》 (月と海の子守唄)
选自：Ever17
下载：链接到Good.gd下载

熄灯音乐：《G弦上的咏叹调》(Air On the G String)
选自：第三管弦组曲 (Orchestral Suite No.3)
作曲：巴赫 (Bach) 此曲由 威廉密 (August Wilhelmj) 改编
下载：链接到Good.gd下载

我们宿舍有一个人要，然后 Javran 就给我了一份，但没带回家。几首歌没找到以后再补充。
这里放的都是高音质抓取的版本压缩到MP3 128kbps，质量有保证，o(∩_∩)o&#8230;由于某些奇特的原因，似乎这些音乐在我的空间上会被机器人抓取，从而极大增加流量负担。所以就先放到Good.gd上~
]]></description>
			<content:encoded><![CDATA[<p>学校前几天又换音乐了，这里都贴出来：</p>
<ol>
<li><strong>起床音乐：</strong>《大地王国》(<em>This Land</em>)<br />
选自：电影《狮子王》(<em>The Lion King</em>)<br />
下载：<a href="http://good.gd/2103.htm" target="_blank">链接到Good.gd下载</a></li>
<li><strong>早出门音乐：</strong>第八a小调小提琴协奏曲第一章<br />
选自：《和谐的灵感》(<em>L&#8217; estro Armonico</em>)<br />
作曲：维瓦尔蒂 (<em>Vivaldi</em>)<br />
下载：<a href="http://good.gd/2097.htm" target="_blank">连接到Good.gd下载</a>
<ul>
<li>指挥：内维尔·马里纳 (<em>Neville Marriner</em>)</li>
<li>乐团：圣马丁室内乐团 (<em>Saint-Martin-in-the-Fields</em>)</li>
<li>录音日期：1973</li>
<li>发行公司：DECCA</li>
<li>CD编号：443 477-2</li>
</ul>
</li>
<li><strong>午出门音乐：</strong>《D大调第一圆号协奏曲》(<em>Horn Concerto No.1 In D</em>)呈示部<br />
选自：《圆号协奏曲》(<em>Horn Concertos</em>)<br />
作曲：莫扎特 (<em>Mozart</em>)<br />
下载：<a href="http://good.gd/2101.htm" target="_blank">链接到Good.gd下载</a>
<ul>
<li>指挥：内维尔·马里纳 (<em>Neville Marriner</em>)</li>
<li>乐团：圣马丁室内乐团 (<em>Saint-Martin-in-the-Fields</em>)</li>
<li>圆号独奏：艾伦·西维尔 (<em>Allen Sivyer</em>)</li>
</ul>
</li>
<li><strong>晚出门音乐：</strong>《芦笛舞曲》(<em>f. Danse des Mirlitons</em>)<br />
选自：《胡桃夹子》(<em>The Nutcracker</em>)<br />
作曲：柴科夫斯基 (<em>Tchaikovsky</em>)<br />
下载：<a href="http://good.gd/2098.htm" target="_blank">连接到Good.gd下载</a>
<ul>
<li>指挥：麦克拉斯 (<em>Mackerras</em>)</li>
<li>乐团：伦敦交响乐团 (<em>London Symphony Orchestra</em>)</li>
<li>发行公司：TELARC</li>
<li>CD编号：CD-80140</li>
</ul>
</li>
<li><strong>晚自修后音乐：</strong>《月与海的子守歌》 (<em>月と海の子守唄</em>)<br />
选自：Ever17<br />
下载：<a href="http://good.gd/2100.htm" target="_blank">链接到Good.gd下载</a>
</li>
<li><strong>熄灯音乐：</strong>《G弦上的咏叹调》(<em>Air On the G String</em>)<br />
选自：第三管弦组曲 (<em>Orchestral Suite No.3</em>)<br />
作曲：巴赫 (<em>Bach</em>) 此曲由 威廉密 (<em>August Wilhelmj</em>) 改编<br />
下载：<a href="http://good.gd/2095.htm" target="_blank">链接到Good.gd下载</a>
</ol>
<p>我们宿舍有一个人要，然后 Javran 就给我了一份，但没带回家。几首歌没找到以后再补充。</p>
<p>这里放的都是高音质抓取的版本压缩到MP3 128kbps，质量有保证，o(∩_∩)o&#8230;由于某些奇特的原因，似乎这些音乐在我的空间上会被机器人抓取，从而极大增加流量负担。所以就先放到Good.gd上~</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/school-new-music/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
<enclosure url="http://down.upsuper.org/This_Land.wma" length="2831855" type="audio/x-ms-wma" />
<enclosure url="http://down.upsuper.org/This_Land.mp3" length="2810066" type="audio/mpeg" />
<enclosure url="http://down.upsuper.org/Air_On_The_G_String.mp3" length="5035281" type="audio/mpeg" />
<enclosure url="http://down.upsuper.org/Dance_of_the_Mirlitons.mp3" length="2051888" type="audio/mpeg" />
<enclosure url="http://down.upsuper.org/school_1.mp3" length="2841007" type="audio/mpeg" />
<enclosure url="http://down.upsuper.org/school_2.mp3" length="3426985" type="audio/mpeg" />
<enclosure url="http://down.upsuper.org/school_3.mp3" length="1843338" type="audio/mpeg" />
<enclosure url="http://down.upsuper.org/school_4.mp3" length="2511654" type="audio/mpeg" />
<enclosure url="http://down.upsuper.org/school_5.mp3" length="2302676" type="audio/mpeg" />
<enclosure url="http://down.upsuper.org/school_6.mp3" length="6321349" type="audio/mpeg" />
<enclosure url="http://down.upsuper.org/Der_Mond_Das_Meer.mp3" length="2350888" type="audio/mpeg" />
<enclosure url="http://down.upsuper.org/Horn_Concerto_In_D.mp3" length="4529840" type="audio/mpeg" />
		</item>
		<item>
		<title>LRC歌词展开</title>
		<link>http://blog.upsuper.org/lrc-lyric-file-expand/</link>
		<comments>http://blog.upsuper.org/lrc-lyric-file-expand/#comments</comments>
		<pubDate>Fri, 08 Jul 2005 05:07:20 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[雕虫小技]]></category>
		<category><![CDATA[VB]]></category>
		<category><![CDATA[音乐]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=32</guid>
		<description><![CDATA[LRC大家都知道吧（不知道？就是那个带时间标签的文本歌词格式嘛~），很好用的东东~所以最近很多MP3Player也开始支持它了。我手上就有一个联想F520的MP3支持，不过有点小麻烦，这个MP3只支持一行一个时间标签，但是笔者手头上的LRC一行都有好些时间标签，像这样，MP3就会把后面的时间标签全部显示出来（晕~）
看来只能修改修改了~既然我们没办法修改MP3的固件，那就在LRC上动手脚吧~把他展开为每行一个时间标签不就得了~说干就干！

不过我懒得再作界面，所以直接从命令行参数中获取，此外这个纠错机制不是很完善（毕竟才一个过程），大家也可以帮忙修改~
代码如下：

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Sub Main()
    Dim sCommand() As String
    Dim bTmp       As Byte
    Dim sTmp       As String
    Dim cFile      As Collection
    Dim iNum    [...]]]></description>
			<content:encoded><![CDATA[<p>LRC大家都知道吧（不知道？就是那个带时间标签的文本歌词格式嘛~），很好用的东东~所以最近很多MP3Player也开始支持它了。我手上就有一个联想F520的MP3支持，不过有点小麻烦，这个MP3只支持一行一个时间标签，但是笔者手头上的LRC一行都有好些时间标签，像这样，MP3就会把后面的时间标签全部显示出来（晕~）</p>
<p>看来只能修改修改了~既然我们没办法修改MP3的固件，那就在LRC上动手脚吧~把他展开为每行一个时间标签不就得了~说干就干！</p>
<p><span id="more-32"></span></p>
<p>不过我懒得再作界面，所以直接从命令行参数中获取，此外这个纠错机制不是很完善（毕竟才一个过程），大家也可以帮忙修改~</p>
<p>代码如下：</p>

<div class="wp_codebox"><table><tr id="p3238"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
</pre></td><td class="code" id="p32code38"><pre class="vb" style="font-family:monospace;"><span style="color: #000080;">Sub</span> Main()
    <span style="color: #000080;">Dim</span> sCommand() <span style="color: #000080;">As</span> <span style="color: #000080;">String</span>
    <span style="color: #000080;">Dim</span> bTmp       <span style="color: #000080;">As</span> <span style="color: #000080;">Byte</span>
    <span style="color: #000080;">Dim</span> sTmp       <span style="color: #000080;">As</span> <span style="color: #000080;">String</span>
    <span style="color: #000080;">Dim</span> cFile      <span style="color: #000080;">As</span> <span style="color: #000080;">Collection</span>
    <span style="color: #000080;">Dim</span> iNum       <span style="color: #000080;">As</span> <span style="color: #000080;">Integer</span>
    <span style="color: #000080;">Dim</span> sTmp2      <span style="color: #000080;">As</span> <span style="color: #000080;">String</span>
    <span style="color: #000080;">Dim</span> i          <span style="color: #000080;">As</span> <span style="color: #000080;">Integer</span>
    <span style="color: #000080;">Dim</span> j          <span style="color: #000080;">As</span> <span style="color: #000080;">Integer</span>
    <span style="color: #000080;">Dim</span> sTmp3      <span style="color: #000080;">As</span> <span style="color: #000080;">String</span>
    <span style="color: #000080;">Dim</span> bIsAdd     <span style="color: #000080;">As</span> <span style="color: #000080;">Boolean</span>
    <span style="color: #000080;">Set</span> cFile = <span style="color: #000080;">New</span> <span style="color: #000080;">Collection</span>
    sCommand = Split(Command, <span style="color: #800000;">&quot;*&quot;</span>) <span style="color: #008000;">'用*作分隔符，很简单，文件名不能带*，用?也可以
</span>    <span style="color: #000080;">Open</span> sCommand(0) <span style="color: #000080;">For</span> <span style="color: #000080;">Input</span> <span style="color: #000080;">As</span> #1
    <span style="color: #000080;">Do</span> <span style="color: #000080;">Until</span> EOF(1)
        <span style="color: #000080;">Input</span> #1, sTmp
        iNum = 0
        <span style="color: #000080;">Do</span> <span style="color: #000080;">While</span> ((Mid(sTmp, iNum * 9 + 1, 1) = <span style="color: #800000;">&quot;[&quot;</span>) <span style="color: #000080;">And</span> (Mid(sTmp, (iNum + 1) * 9, 1) = <span style="color: #800000;">&quot;]&quot;</span>))
            iNum = iNum + 1
        <span style="color: #000080;">Loop</span>
        sTmp2 = Right(sTmp, Len(sTmp) - 9 * iNum)
        <span style="color: #000080;">For</span> i = 0 <span style="color: #000080;">To</span> iNum - 1
            sTmp3 = Mid(sTmp, i * 9 + 2, 7)
            <span style="color: #000080;">If</span> cFile.Count = 0 <span style="color: #000080;">Then</span>
                cFile.Add <span style="color: #800000;">&quot;[&quot;</span> &amp; sTmp3 &amp; <span style="color: #800000;">&quot;]&quot;</span> &amp; sTmp2
            <span style="color: #000080;">Else</span>
                bIsAdd = <span style="color: #000080;">False</span>
                <span style="color: #000080;">For</span> j = 1 <span style="color: #000080;">To</span> cFile.Count
                    <span style="color: #000080;">If</span> Mid(cFile(j), 2, 7) &gt; Mid(sTmp, i * 9 + 2, 7) <span style="color: #000080;">Then</span>
                        cFile.Add <span style="color: #800000;">&quot;[&quot;</span> &amp; sTmp3 &amp; <span style="color: #800000;">&quot;]&quot;</span> &amp; sTmp2, , j
                        bIsAdd = <span style="color: #000080;">True</span>
                        <span style="color: #000080;">Exit</span> <span style="color: #000080;">For</span>
                    <span style="color: #000080;">End</span> <span style="color: #000080;">If</span>
                <span style="color: #000080;">Next</span> j
                <span style="color: #000080;">If</span> <span style="color: #000080;">Not</span> bIsAdd <span style="color: #000080;">Then</span> cFile.Add <span style="color: #800000;">&quot;[&quot;</span> &amp; sTmp3 &amp; <span style="color: #800000;">&quot;]&quot;</span> &amp; sTmp2
            <span style="color: #000080;">End</span> <span style="color: #000080;">If</span>
        <span style="color: #000080;">Next</span> i
    <span style="color: #000080;">Loop</span>
    <span style="color: #000080;">Close</span> #1
    <span style="color: #000080;">Open</span> sCommand(1) <span style="color: #000080;">For</span> <span style="color: #000080;">Output</span> <span style="color: #000080;">As</span> #1
    <span style="color: #000080;">For</span> i = 1 <span style="color: #000080;">To</span> cFile.Count
        <span style="color: #000080;">Print</span> #1, cFile(i)
    <span style="color: #000080;">Next</span> i
    <span style="color: #000080;">Close</span> #1
<span style="color: #000080;">End</span> <span style="color: #000080;">Sub</span></pre></td></tr></table></div>

<p>大家应该还能看的懂吧~这个经过试验还是不错的~</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/lrc-lyric-file-expand/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
