mp3: ベートーベン ピアノソナタ 28番
ベートーベン ピアノソナタ 第28番
Beethoven Piano Sonata No 28
Ivory IIのItalian Grandで入力してみた。ハーフペダルが使えるのは、いいんだけど、ペダルを踏み込んだ時、ホール全体のリバーブも一緒に強化されてしまう感じで、どうもダンパーペダルのシミュレーションは、いまいちな感じ。127まで踏まない方がいいのかなぁ。慣れるまで、もう少し時間かかりそう。
Ivory IIがやってきた。
Italian Grandもまとめて、2.0にアップグレードしてみた。
これまでは、8GBのSDHC3枚を、ファイルレベルのジャンクションを使って、無理矢理1つのディレクトリに見せかけた、なんちゃってSSDだったけど、今回は、普通のSATAの128GB SSDに換装。ギリギリ4台分の全てのピアノの音源が入りきった。
さすがに、速い速い。前は起動に1分以上かかっていたけど、ものの数秒で上がるし、音色の変更も1-2秒で終わる。せっかくなので、色んな音色を使って演奏させてみた。
せっかくなんで、ダンパーペダルは、ハーフペダリングしている。1.xでは、1か0かの2値しかなかったが、2.xからは、0から127まで指定できる。127まで踏み込むと、かなり強めに効くようだ。
German Dは、メロウな感じで、これはこれで、曲を選ぶといいかもしれない。Italian Grandは、1.xの時のは、破綻することが多かったけど、今回は好感触。もっと試してみないと何ともいえないけど。Yamaha Studio 7ftは、D4の音が狂っているね〜。メール出しておくか。Bosendorferは相変らず安定している、が、Italian Grandの質が上がってきたんで、どっちを使うか迷うことになりそう。
P.S. 早速回答があって、2.0.1を当ててねってことなので、パッチを当てて解決。こうして聞くと、YAMAHAもいい感じだな。
戻り値の型パラメータにワイルドカードを使う意味はあるのか?
矢野さんのところで、戻り値の型パラメータにワイルドカードを使う意味はあるのか? というエントリがあったので、ちょっと考えてみた。
例えば、元々、こんな組み合わせがあって、
interface FooBase {
// ...
}
class BarBase {
public List<FooBase> getFooTable() {
return null;
}
}
その後、拡張して、こんな風にすると、
interface Foo extends FooBase {
// ...
}
class Bar extends BarBase {
@Override public List<Foo> getFooTable() {
return null;
}
}
コンパイルエラーになる。List<FooBase>とList<Foo>には互換性が無いから。
Test.java:18: メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません
@Override public List<Foo> getFooTable() {
^
エラー 2 個
でも、ワイルドカードを使っておけば、互換性があるのでokになる。
class BarBase {
public List<? extends FooBase> getFooTable() {
return null;
}
}
class Bar extends BarBase {
@Override public List<? extends Foo> getFooTable() {
return null;
}
}
Java5から、継承クラスでメソッドをオーバーライドする時の戻り値の型は、互換性のある型であればokになったんで、親で型パラメータをワイルドカードにしておけば、子側では、もっとspecificな型パラメータにできる。ダウンキャストするなり、ビジターパターンを使うなりして、子側の型に辿り着ければ、要素をキャスト無しで扱えるので、これはこれで便利かもしれない。これからは継承を前提としたベースクラスで、コレクションを返す時は、型パラメータにワイルドカードを使うようにしよう。
POIで、名前定義の入ったカラムから値を取得。
検索で見つかる方法は、古いPOIでの方法ばかりで、今のPOI APIに対応したものが無くて難儀する。
とりあえず、1つのセル(範囲ではない)に名前定義が付いている場合に、そのセルを取得するコードは、以下で良いようだ。
Name name = workbook.getName("名前定義の名前");
CellReference cellRef = new CellReference(name.getRefersToFormula());
Row row = sheet.getRow(cellRef.getRow());
Cell cell = sheet.getCell(cellRef.getCol());
ただ、名前定義って範囲にも付けられるはずなんだけど、その場合どうなるのかは、必要にせまられていないので、未調査。





















