2010/07/23

JavaFX 勉強会

羽生田 恒永さん, 第 3 回 JavaFX 勉強会, 日本オラクル

今回で 3 回目の JavaFX.jpJavaFX 勉強会。今まで IAjapan の会議室をお借りしていたのですが、ちょっと狭い。で、今回はオラクルの青山センターをお借りしました。

今回はスピーカが 4 人。毎回、話していただける方を探すのは大変で、今回も苦労したのですが、結果的にはかなり豪華なスピーカー陣でした。

そのかいもあってか、すごい参加率。

通常、こういうイベントでは登録した人の 6、7 割ぐらいの人しか実際に参加しないのですが、今回は 9 割近い参加率でした。これはほんとにすごいことです。

ちょっと参加率を見誤ってしまい、立ち見の人まで。イスがなくてスイマセンでした。

 

羽生田さんはこの日初対面。Twitter で JavaFX の話をしていたので、スカウトしたのでした。

>草薙さんは、Java ME とか RT Java のエキスパート。ひょんなことから最近 JavaFX Mobile/TV をやっていると聞いたので、さっそくアプローチしてみました。

草薙さんはなぜか JavaFX Phone のスタイラスを指し棒の代わりに使っていてるのでした。そんな短い指し棒はじめてみましたよ ^ ^;;

岡崎さんはいつも何かしらおもしろいネタを持ってきてくれる頼もしい会長さんです。

羽生田 恒永さん, 第 3 回 JavaFX 勉強会, 日本オラクル 草薙 昭彦さん, 第 3 回 JavaFX 勉強会, 日本オラクル
岡崎 隆之さん, 第 3 回 JavaFX 勉強会, 日本オラクル

ということで、今日はさくらばは露払いで短めに JavaFX 1.3 の新機能をお話ししました。

でも、新機能をずらずら並べるのは、話がぶつ切れになってしまって、ストーリーが作りにくいです。今度はもう少し、紹介する機能を絞って、もう少し深く説明するようにしようかな。

居食屋 和民

懇親会は居食屋 和民

ほんとはもっと別のところにしようと思っていたのですが、金曜日といいうこともあって、全部断られてしまいました。最後に残ったのが、北の家族ぐらい。で、和民へ。

参加者が 18 名。3 人に 1 人ぐらいの割合で懇親会に参加。ほんとうれしい限りです。

 

写真はまた後で追加します。

居食屋 和民 青山店 東京都港区南青山2-27-27

1 月に講演 4 回

なぜかこういうのはかたまって依頼が来るんですよね。なんでだろう。

とりあえず、がんばる。

今日の一枚

Jason Mraz "Jason Mraz's Beautiful Mess - Live on Earth" (2009)

あいかわらずハートフルなサウンドを醸しだしてくれる Jason Mraz。彼の 2009 年のシカゴでのライブアルバム。

サウンドはやたら豪華になっちゃったけど、やっぱり中心にあるのは Jason Mraz のギター。ほんとギターうまいよね。

個人的には、もっとアコスティックギターを弾きまくってもらいたいなぁ。今でも、彼のライブアルバムでは Jason Mraz Live 2001 が一番だと思ってます。

このアルバムでは、ブラスがキラキラしてカッコいいです。We Sing, We Dance, We Steal Things でもブラスは使ってたけど、ここまで力強いサウンドではなかったので、かなり意外。

曲はやはり We Sing, We Dance, We Steal Things の曲が中心。でも、The Remedy はかかせないですね。アレンジはずいぶん変えてますが。

そして、この曲をやるのか、というのが All Night Long。Lionel Richie ですよ。この曲が一番ブラスが合っているのも皮肉な感じ。

そして、The Boy's Gone が最後の締めというのがいいですね。この曲は 1st の曲ですけど、ほんといい曲。

2010/07/09

Java でサムネイル作成 その 3

<その 1>

<その 2>

 

Java でサムネイルを作る方法についての最終回です。

前回、単純にバイキュービックなどの補間法でイメージを縮小しても、クオリティが低いということを書きました。

ところで、下のイメージを見比べてみてください。

イメージの比較

右のイメージに比べ、あきらかに左の方がジャギが少ないと思いませんか。

この 2 つのイメージは両方ともバイリニアで縮小しています。違いは縮小率。

左が 50%、右が 48% です。

50% の場合、縮小した時に対応するピクセルは単純に求めることができます。4 ピクセルを 1 ピクセルにすればいいだけですから。

このため、品質が高いまま縮小が可能になるのです。これは最近傍だとだめなのですが、バイキュービックでも大丈夫です。ただ、パフォーマンス的にはバイリニアの方が速いので。

さて、ここで、発想を変えてみます。

つまり、縮小を 1 回で済ませなくてもいいのではないかということです。

具体的には、最終的な縮小率に近づくまで、50% に縮小することを繰りかえすという手法。

もちろん、縮小を複数回行なうので、パフォーマンスは劣化します。ただ、前回の Image#getScaledImage メソッドよりはかなり速く縮小できるはずです。

たとえば、最終的な縮小率が 10% であれば、半分に縮小したイメージを、更に半分、もう一度半分にします。これで、縮小率は 0.125。後は 0.125 のイメージを 0.1 に縮小します。

これで縮小は 4 回行なうので、単純にバイリニアに比べると遅くなります。しかし、50 倍以上遅かった Image#getScaledImage メソッドに比べれば、雲泥の差のはずです。

では、実際に試してみましょう。

サンプルのソース ImageScale3.java

右下が今回の手法を使用した縮小イメージです。よく分るように、今回の手法で縮小したイメージの拡大イメージを示しておきます。

ImageScale1 の実行結果
最適化手法
最近傍

今までの手法の中でもっとも品質が高かった Image.SCALE_SMOOTH と比べても、まったく遜色がないことが分ります。

処理速度はどうでしょう。ある時点での結果は次のようになりました。

Nearest Neighbor: 0.210803ms
Bilinear: 0.97409ms
Bicubic: 2.872409ms
Default: 180.350298ms
Smooth: 240.238665ms
最適: 12.833274ms

今回の手法は約 13ms。確かにバイリニアやバイキュービックに比べるとパフォーマンスは落ちます。しかし、SCALE_SMOOTH と比べると、その違いは明らか。

実をいうと、この方法は櫻庭が考えたものではありません。イメージ処理の手法としては、よく知られたものなのです。

たとえば、この手法は Filthy Rich Clients にも紹介されています。今回のソースも Filthy Rich Client に掲載されていたものに手を加えたものです。

この縮小イメージを生成するメソッドを次に示します。

    private BufferedImage getOptimalScalingImage(BufferedImage inputImage,
                                                 double scaleFactor) {
        // 現在のイメージのサイズ
        int currentWidth = inputImage.getWidth();
        int currentHeight = inputImage.getHeight();
 
        // 最終的なイメージのサイズ
        int endWidth = (int)(currentWidth * scaleFactor);
        int endHeight = (int)(currentHeight * scaleFactor);
 
        // 現在のイメージ
        BufferedImage currentImage = inputImage;
 
        // 最終的なサイズと現在のイメージの差
        int delta = currentWidth - endWidth;
        // 次に縮小するサイズ
        int nextPow2 = currentWidth >> 1;
 
        while (currentWidth > 1) {
            // 最終的なイメージとサイズの差が、次に縮小するサイズよりも
            // 小さいかどうか調べる
            if (delta <= nextPow2) {
                // イメージのサイズの差が小さい場合
                if (currentWidth != endWidth) {
                    // 最終的な縮小率が 1/2n にならない場合
                    BufferedImage tmpImage
                        = new BufferedImage(endWidth,
                                            endHeight,
                                            BufferedImage.TYPE_INT_RGB);
                    Graphics2D g = (Graphics2D)tmpImage.getGraphics();
                    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
                                       RenderingHints.VALUE_INTERPOLATION_BILINEAR);
                    g.drawImage(currentImage, 
                                0, 0, 
                                tmpImage.getWidth(), 
                                tmpImage.getHeight(), null);
                    g.dispose();
 
                    currentImage = tmpImage;
                }
 
                return currentImage;
            } else {
                // イメージのサイズの差が大きい場合
                // 更に半分に縮小する
                BufferedImage tmpImage 
                    = new BufferedImage(currentWidth >> 1,
                                        currentHeight >> 1,
                                        BufferedImage.TYPE_INT_RGB);
                Graphics2D g = (Graphics2D)tmpImage.getGraphics();
                g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
                                   RenderingHints.VALUE_INTERPOLATION_BILINEAR);
                g.drawImage(currentImage,
                            0, 0,
                            tmpImage.getWidth(), 
                            tmpImage.getHeight(), null);
                g.dispose();
 
                // 変数の更新
                currentImage = tmpImage;
                currentWidth = currentImage.getWidth();
                currentHeight = currentImage.getHeight();
                delta = currentWidth - endWidth;
                nextPow2 = currentWidth >> 1;
            }
        }
 
        return currentImage;
    }

2 で割る代わりに、ここではシフトを使っています。

このメソッドはまだ最適化の余地を残しています。たとえば、縮小イメージを表す BufferedImage オブジェクトを毎回生成していますが、使い回すこともできるはずです。

また、サムネイルをクライアントで表示する場合、単なる BufferedImage オブジェクトを使うのではなく、コンパチブルイメージにすると更にパフォーマンスが向上します。

ただし、ヘッドレスのサーバでサムネイルを作成する場合には関係ないので、ここでは触れないことにします。興味がある方はぜひ Filthy Rich Client を読んでみてください。

ということで、今回のまとめ。

  • 縮小率 50 % でバイリニアを複数回行なう手法は、品質が高く、かつパフォーマンスもよい、バランスのいい手法である

 

参考文献

"Filty Rich Cliients" Chet Haase, Romain Guy, 訳 松田晃一、小沼千絵

JavaFX 勉強会

はてなにも書いたのですが、こちらにも。

日本 JavaFX ユーザーグループ (JavaFX.jp) では 7/23 に第 3 回勉強会を行ないます。

もし、JavaFX に興味のある方がいらっしゃいましたら、ぜひご参加ください。

勉強会の後は、懇親会あるので、そちらにもぜひ。

お申し込みは 参加登録サ イト からお願いします。

また、講演もしくはライトニングトークで喋っていただける方大募集です。ぜひ、気軽に手を上げてください。よろしくお願いします!!

開催要項

日時 2010 年 7 月 23 日 (金) 19:00 から 21:00
(その後懇親会あり)
場所 日本オラクル 青山センター 13F
東京都港区北青山 2-5-8
主催 日本 JavaFX ユーザグループ
参加費 無料
申し込み方法 参加登録サイト

今日の一枚

James Taylor "Other Covers" (2009)

前作の Covers が好評だったのか、それに続くカバーシリーズのミニアルバム。

このアルバムはいろんなジャンルからカバーしています。しかも、Covers よりは原曲が分ります ^ ^;;

それでも、やっぱり James Taylor の世界なんですけどね。Memphis Tennessee なんて、どこがロックなんだろうと思うぐらい。どうやっても、James Taylor の世界になってしまうのはすごいです。

でも、やっぱり最後の 2 曲がいいなぁ。In the Midnight Hour と Knock on Wood。

もともと原曲も好きなんですけど、James Taylor のカバーも捨てがたいです。この 2 曲はあまり原曲を崩さずにやっているのですが、それでも James Taylor の世界。

ほんと暖かい In the Midnight Hour。Knock on Wood も丸いですよ。

2010/07/02

Java でサムネイル作成 その 2

<その 1>

 

前回はイメージを扱うクラスと、イメージのロード方法について書きました。

今回は BufferedImage クラスのデータ形式について書こうと思ったのですが...

検証用のサンプルで確かめていたら、J2SE 1.5 と Java SE 6 では実行結果が違うのです。グラフィックアクセラレータの使い方がかなり変わってきているようです。J2SE 1.5 まではアクセラレートされなかったものも、Java SE 6 ではアクセラレートされるようになっています。

このように、Java のバージョンによって処理アルゴリズムが更新され、過去のイディオムが使えないということもあります。古いバージョンで言われてきたことが、最新のバージョンでは違うということが多々あるので、そこらへんはご注意ください。

 

で、今回はイメージの縮小について。

イメージを縮小するには、複数の手法があります。g を Graphics2D オブジェクト、image を Image オブジェクトだとします。

  1. g.drawImage(image, x, y, width, height, null);
  2. g.drawImage(image, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, null);
  3. g.translate(x, y);
    g.scale(sx, sy);
    g.drawImage(image, 0, 0, null);
  4. AffineTransform at = new AffineTransform();
    at.translate(x, y);
    at.scale(sx, sy);
    g.drawImage(image, at, null);
  5. Image scaledImage = image.getScaledInstance(w, h, hints);
    g.drawImage(scaledImage, x, y, null);

1 と 2 は Graphics#drawImage メソッドで直接拡大/縮小を指定する方法。3 と 4 は AffineTransfform クラスを使って移動と拡大/縮小する方法。3 では表面的には AffineTransform オブジェクトは出てきませんが、内部的に使ってます。

5がImage#getScaledInstance メソッドで拡大/縮小したイメージを作成する方法です。

ぶちゃっけていうと、1 から 4 までの方法はほとんんど差がありません。どれを使っても一緒です。

それよりも拡大/縮小の品質に関わるのは、拡大/縮小に使用するアルゴリズムです。Java 2D で使用できるアルゴリズムは次の 3 つです。

  • 最近傍補間 (ニアレストネイバー)
  • バイリニア補間
  • バイキュービック補間

一般的には下に行くほど補間の品質が高いことになっています。

これらのアルゴリズムの指定には RenderingHints クラスを使用します。

たとえば、バイキュービックを指定するのであれば次のようにします。

    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
                       RenderingHints.VALUE_INTERPOLATION_BICUBIC);

さて、Image#getScaledInstance メソッドにも hints という引数があります。ここにもレンダリングヒントを指定できるのですが、RenderingHints クラスではなく、Image クラスに定義されている定数を使用します。

  • SCALE_DEFAULT
  • SCALE_REPLICATE
  • SCALE_FAST
  • SCALE_SMOOTH
  • SCALE_AREA_ABERAGING

でも、getScaledInstance メソッドのソースを見てみると実際には 2 種類の方法を使っているようです。

    public Image getScaledInstance(int width, int height, int hints) {
        ImageFilter filter;
        if ((hints & (SCALE_SMOOTH | SCALE_AREA_AVERAGING)) != 0) {
            filter = new AreaAveragingScaleFilter(width, height);
        } else {
            filter = new ReplicateScaleFilter(width, height);
        }
        ImageProducer prod;
        prod = new FilteredImageSource(getSource(), filter);
        return Toolkit.getDefaultToolkit().createImage(prod);
    }

ではこれらの 5 種類のうちどれを使えばいいのでしょう? さっそくやってみましょう。

サンプルのソース ImageScale1.java

このサンプルを実行すると、上段に Graphics#drawImage メソッドで縮小した 3 つのイメージ、下段に Image#getScaledInstance メソッドで縮小したイメージが表示されます。

ImageScale1 の実行結果

まぁ、これでもいいんですけど、それぞれのイメージを 4 倍に拡大したものを以下に示しておきます。

最近傍
最近傍
バイリニア
バイリニア
バイキュービック
バイキュービック
SCALE_DEFAULT
SCALE_DEFAULT
SCALE_SMOOTH
SCALE_SMOOTH

これを見ると、SCALE_SMOOTH 以外の手法は斜めの線がギザギザになってしまっています。こういうのをギャザといいます。

確かによく見ると、再近傍 < バイリニア < バイキュービック の順で品質が上がっています。でも、バイキュービックであっても品質的にはちょっとですよね。

とすると、SCALE_SMOOTH を使えばいいのかというと、これがまたダメなんです。

何がダメかというと、パフォーマンス。

このサンプルプログラムは描画にどれくらい時間がかかっているかを表示しています。

注意しなくてはいけないのが、getScaledInstance メソッドは非同期でイメージを生成するので、getScaledInstance メソッドだけで時間を計ってしまうと、とても短い時間になってしまいます。

なので、最後の g.drawImage が終了するまでかかる時間を比較します。

ある時点での結果は次のようになりました。

Nearest Neighbor: 1.987399ms
Bilinear: 2.083085ms
Bicubic: 8.362403ms
Default: 50.887474ms
Smooth: 89.932671ms

ここでは、1024×680 のイメージを 1/10 に縮小しています。

この結果からは、最近傍が最も速く、下に行くほど処理時間がかかっていることが分ります。それにしても、最近傍と SCALE_SMOOTH は約 50 倍もの処理時間の違いがあります。

このサンプルはイメージが 1 枚ですし、イメージもそれほど大きくないので、この程度になっています。しかし、1000万画素のイメージを 20 枚だとすると約 450 分もかかってしまうことになります。

これではとてもじゃないけど使えないですね。

というわけで今日のまとめ。

  • クオリティが低いアルゴリズムは、パフォーマンスが高い
  • クオリティが高いアルゴリズムは、パフォーマンス低い
  • でも、バイキュービックでもクオリティは低すぎ

クオリティ的に受けいれられるのは、SCALE_SMOOTH だけです。しかし、処理速度が...

ということで、次回はお勧めの方法を紹介します。

 

7/5 <<追記>>

バイキュービックのクオリティが低いと書きましたが、それはあくまでもイメージを縮小するときの場合です。

もともと、最近傍、バイリニア、バイキュービックなどはイメージを拡大する時に使われる補間アルゴリズムです。したがって、その本領が発揮されるのはイメージを拡大する時。

たとえば、上記の拡大図は、エッジを維持したいため、最近傍補間を使用しています。

常にバイキュービックの品質が悪いわけではないのではないので、ご注意ください。

今日の一枚

Paul Simon "Graceland" (1986)

Invictus や District 9 やワールドカップで話題の南アフリカですが、櫻庭にとって南アフリカというとやっぱりこれ。

このアルバムは Paul Simon がアパルトヘイトがまだ行なわれている南アフリカに赴き、南アフリカのミュージシャンと一緒に録音したアルバムです。

批判もいろいろとありましたけど、それでも賞賛に値するアルバムだと櫻庭は思っています。しかも、音楽的にもすばらしい。

アフロミュージックの影響を受けつつも、核の部分はやっぱり Paul Simon のサウンド。

なぜかアルバムタイトルは Elvis Presley の家がある Graceland。なぜ、Graceland なのか、未だに分りません ^ ^;;

でも、タイトルナンバーの Graceland はとてもステキ。ベースがいいですね。合いの手のギターが風のように吹き渡る感じ。

もっともアフリカ的なサウンドなのが Homeless。このアカペラの男性コーラスの Ladysmith Black Mambazo がすばらしい。完全に Paul Simon を食ってます。

同じように Ladysmith Black Mambazo のコーラスの Diamonds on the Soles of Her Shoes もお気に入り。 Ladysmith Black Mambazo のコーラスは導入部分だけですけど。でも、いいんです。いいものは、いいんです。

2010/06/20

Java でサムネイル作成 その 1

Java でイメージ処理、特にサムネイルを作成する需要があるらしいのです。で、書き始めてみたのですが、結構分量になりそう。で、何回かに分けて書くことにします。

ぶっちゃけ結論だけ書いてもいいんですけど、それだと応用がきかないので基本的なところから。

Java のイメージ

Java でイメージを扱うにはいくつかの方法があります。

  • java.awt.Image クラス
  • java.awt.VolatileImage クラス
  • java.image.BufferedImage クラス

Imageクラスは Java でのイメージ処理の基本となるクラスです。ところが、このクラスのインスタンスは OS のイメージ処理に依存しています。

Windows であれば Windows のイメージ、Linux であれば Linux のイメージになるわけです。

もともと AWT は、処理を OS に投げているだけなので、イメージもそういう扱いになります (後から Lightweight Component の概念が出てきましたが、当初は Heavyweight しかなかったんです)。

そして、よりプラットフォームに依存したのが VolatileImage です。このクラスは J2SE 1.4 で導入されたクラスで、VRAM をそのままマッピングしたクラスと考えることができます。

つまり、Direct X とか OpenGL が扱う VRAM に直結したクラスです。なので、ゲームなどを作る時はこのクラスを使うことが多いです。

最後の BufferedImage クラスが Java だけで閉じているクラスです。このクラスは Java 2D と Swing が導入された時に一緒に入ったクラスです。

ということは、グラフィックシステムがないサーバで使うのであれば、BufferedImage クラスしかないことが分りますね。

しかし、単純に BufferedImage クラスを使えばいいというわけではありません。

BufferedImage クラスを使う場合、色空間をどうするかを考える必要があります。へたな色空間を使ってしまうと、ヒープは食うし、処理は遅いしで、いいことは全然ありません。

色空間については、次回書きます。もったいぶっているわけではないのですが、ちょっと長くなるので。

イメージのロード

次に考えなくてはイメージのロードをどうやるかということです。イメージのロードには次の方法が考えられます。

  • java.awt.Toolkit クラスの getImage メソッド
  • Image I/O

JAI を使う方法もありますが、JAI の入出力は Image I/O と同じなので省略します (書き方は違うけど、内部の処理が同じということ)。また、以前は com.sun.image.codec.jpeg.JPEGImageDecoder クラスというのもありましたが、com.sun で始まるクラスは使えないと思った方がいいです。

Toolkit クラスを使うと、Image オブジェクトをえることができます。一方の Image I/O は BufferedImage オブジェクトになります。

また、Toolkit クラスでのイメージのロードは非同期、Image I/O のロードは同期という違いもあります。

なお、サーバーではヘッドレスの場合も多いので、Toolkit クラスが使えない場合もあります。

イメージファイルにはサムネイルも一緒に含まれている場合があります。そのような場合、Image I/O でサムネイルだけロードできるので、高速に読み込むことができます。

コードで書くと、こんな感じ。

    public void loadThumbnail(String imagefile) {
        try {
            Iterator<ImageReader> readers
                = ImageIO.getImageReadersBySuffix("jpg");
            ImageReader reader = null;
            if (readers.hasNext()) {
                reader = readers.next();
            } else {
                System.err.println("No ImageReader");
                return;
            }
            
            ImageInputStream stream
                = ImageIO.createImageInputStream(new File(imagefile));
            reader.setInput(stream);
            
            if (reader.hasThumbnails(0)) {
                System.out.println(imagefile + " has thumbnail.");
                BufferedImage image = reader.readThumbnail(0, 0);
                
                System.out.println("Thumbnail width: " + image.getWidth()
                                   + " height: " + image.getHeight());
            } else {
                System.out.println(imagefile + " doesn't have thumbnail.");
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

ただし、この方法だとサムネイルを持っていないイメージファイルには使えないし、サムネイルのサイズは任意に決められないという欠点もあります。

でも、条件にあうようなイメージファイルであれば、とても高速。

ということで、今日のまとめ

  • イメージを扱うクラスは 3 種類あるので、どれが最適なのか考えて使おう
  • イメージのロードには Toolkit クラスと Image I/O がある
  • イメージファイルにサムネイルが含まれている場合は、Image I/O でサムネイルだけロードする

次回はイメージの縮小について書きます。

今日の一枚

Jack Johnson "En Concert" (2009)

2008 年のワールドツアーの選りすぐりだそうです。

ライブということで、演奏が粗いところとかありますが、いいんです。Jack Johnson という人は、ギターがむちゃくちゃうまいわけでもないし、すぐれたボーカリストというわけでもありません。でも、彼が作り出す世界感がすばらしいんです。

だから、その世界に共鳴して、いろいろアーティストが寄ってくるわけですよ。

でも、まさか Eddie Vedder といっしょにやるとは思いもよりませんでしたけど。たしかに Eddie Vedder のソロは、アコスティックな音だったりするので、いいのかもしれませんが。

また、Paul Simon の Mother and Child Reunion が入っていたのがビックリ。どうして、こんな古い歌を取りあげたんでしょう。

個人的には、後半の弾き語りがいいですね。やっぱり、弾き語りででてきた人なわけですから、バンドよりも弾き語り。しかも、アコギにこだわってほしいなぁ。

2010/05/30

Ispahan, Ispahan!

Fetish: Ispahan Festival, Pierre Hermé Paris, Shinjuku Isetan

Pierre Hermé Paris (ピエールエルメ パリ) の 5 月は Ispahan (イスパハン) づくし。

この blog には何度も登場している Ispahan ですが、ローズとフランボワーズとライチのお菓子です。

オリジナルはマカロンにローズクリーム、フランボワーズ、ライチを挟んだケーキですが、それ以外にもいろいろとバリエーションが。

Ispahan, Fetish: Ispahan Festival, Pierre Hermé Paris, Shinjuku Isetan
St. Honoré Feuille Ispahan, Fetish: Ispahan Festival, Pierre Hermé Paris, Shinjuku Isetan Cheesecake Feuille Ispahan, Fetish: Ispahan Festival, Pierre Hermé Paris, Shinjuku Isetan
Emotion Feuille Ispahan, Fetish: Ispahan Festival, Pierre Hermé Paris, Shinjuku Isetan Mille Feuille Ispahan, Fetish: Ispahan Festival, Pierre Hermé Paris, Shinjuku Isetan
Macaron Ispahan, Fetish: Ispahan Festival, Pierre Hermé Paris, Shinjuku Isetan Macaron Ispahan, Fetish: Ispahan Festival, Pierre Hermé Paris, Shinjuku Isetan
Emotion Feuille Ispahan, Fetish: Ispahan Festival, Pierre Hermé Paris, Shinjuku Isetan

そして、先月からはじまった月替わりのガレットも、今月は Ispahan。

どれも何度も食べている味だけど、やっぱりおいしいね。

Galette Ispahan, Pierre Hermé Paris, Shinjuku Isetan
Galette Ispahan, Pierre Hermé Paris, Shinjuku Isetan Galette Ispahan, Pierre Hermé Paris, Shinjuku Isetan
Galette Ispahan, Pierre Hermé Paris, Shinjuku Isetan

今日の一枚

Erik Mongrain "Equilibrium" (2008)

この人もすごいギター弾くんですよ。前作の Fates で Air Tap! という曲で使われている、ラップ タッピングという奏法がすごかったのです。

どういう奏法かというと、YouTube の Air Tap! のムービーを見てもらえれば分かるんですけど、ハワイアンスライドギターのようにギターを寝かせて、両方の手でタッピングする双方です。もうハーモニクスが出まくり。

で、このアルバムは彼の 2 枚目。残念ながら、ラップ タッピングはやってないみたいです。

それにしても、彼も Michael Hedges の音楽にとても影響を受けたことが分かります。両手でタッピングするスタイルもそうですけど、それだけでなく構成やアレンジが Michael Hedges を髣髴させるところがいっぱい。

Pandora's Box や Raindigger は Michael Hedges がやっているといわれれば信じてしまうのではないかというぐらい、彼のスタイルに似てます。

それにしても、Erik Mongorain のような後を追う人が多く輩出しているのを見ると、あらためて Michael Hedges が偉大であったことが分かります。

最後の Maelstrom はピックを持っているみたいですね。両手タッピングでピックを持つってどうやるんだろう? またすごい弾き方をしているのかもしれません。