音楽とプログラムと

基本的に散文。音楽とか、プログラムとか。

clojureのroutingライブラリでbidiがわからなかったのでreititを使ったら楽だった。

clojureでWebアプリを作る方法をしらべるとDuctがよく出てくるのだが、

github.com

元となっているRingを手で動かして理解したかったので、Ductは使わずに簡単なAPIを書きながらチョコチョコやってた。

こちらの記事には大変お世話になった。おかげでhandlerとmiddlewareを完全に理解した。

tech.toyokumo.co.jp

さて、routingのライブラリでbidiで紹介されていたのでそれを使ってゴニョゴニョやっていたのだが、なぜか思うようにいかないルーティングがあり、githubのドキュメントや、書いてあるtestをみたりしていたのだが、ちょっと痒いところに(知りたいところ)手がとどかない。

reititというのがブログの中やqiitaの記事でお見かけし、またググってみると以下の記事 でもなかなかお勧めされてたのでDocumentを読んでみた。

purelyfunctional.tv

Documentがわかりやすく、丁寧な感じで、またmiddlewareの適用のさせ方もなかなか素敵な感じがした。

cljdoc.org

ring-routerというものを使えばうまくいきそう。

早速使ってみるとなかなかいい感じ。 前まで 以下のような感じでmiddlewareを適用させてた。 書き方が悪い?か他の書き方もあるかもしれないが、以下だと、どのリクエストできても全てのmiddlewareを通過してしまう。 handlerごとに別のものを適用させたいときどうするのかな?と思いつつ今のところはそのままでよかったので後回しにしていた。

今まで。以下のような感じ
(def app
     (->
       (make-handler route) ;; routeは別で定義する。bidi使用
       (logger/wrap-with-logger)
       (wrap-json-response)
       (wrap-default-charset "utf-8")
       (wrap-oauth2
         (provider/profile
           {:service-provider :gmail
            :environment      environment}))
       (wrap-cookies)
       (wrap-verify-token)
       (wrap-store-session-token)
       (wrap-session)
       (wrap-keyword-params)
       (wrap-params)
       (r.m.cors/wrap-cors :access-control-allow-origin [#"https://.*localhost:8280" #"https://account.google.com" #"https://www.googleapis.com"]
                           :access-control-allow-headers #{:accept :content-type :authorization}
                           :access-control-allow-methods #{:get :put :post :delete :options :head})))

reititを使うと以下のようになる。

reitit使用

(def default-wrappers
     [[r.m.cors/wrap-cors :access-control-allow-origin [#"https://.*localhost:8280" #"https://account.google.com" #"https://www.googleapis.com"]
       :access-control-allow-headers #{:accept :content-type :authorization}
       :access-control-allow-methods #{:get :put :post :delete :options :head}]
      [wrap-params]
      [wrap-session]
      [wrap-store-session-token]
      [wrap-verify-token]
      [wrap-cookies]
      [wrap-oauth2 (provider/profile
                     {:service-provider :gmail
                      :environment      environment})]
      [wrap-default-charset "utf-8"]
      [wrap-json-response]
      [logger/wrap-with-logger]]

(def app
     (ring/ring-handler
       router
       (constantly {:status 404 :body ""})
       {:middleware default-wrappers})) 
;; この書き方では default-wrappersは全てのルーティングに適用される。

上記では すべてのリクエスト pathに対してdefault-wappersが適用されるが 以下のようにhandlerごとにmiddlewareも適用できるみたいだ。

(def reitit-router
     (ring/router
       ["/" {:middleware [[wrap-json-response]]
               :get route-handler}
          ["login" {:post login-handler
                         :middleware [[wrap-login]] }))

素敵だ。

clojureはライブラリを適用させていく感じがプラモデルを作るようで面白いんだが、Documentがわかりにくいというか、素っ気ない物も多いので(その場合 grep.app で github内の使用方法をみたり、testコードをみたり、slackで検索したりする。)Documentがいい感じなだけで使う意欲がもっとわく。(re-frameもDocumentがいい)

しばらくこれを使って遊んでみよう。

re-frameでas-element内でsubscribeが効かない

auth0のSPAのreactのサンプルを見ながら re-frameでやってみてる。

auth0のサンプルではReact Hooksを使っていたので Reagentでそのまま書くとうまく動かず、どうやら ReagentはJavaScriptでのClass 構文と同様のものになるらしく as-elementというのを使うようだ。 https://github.com/reagent-project/reagent/blob/master/doc/ReactFeatures.md

(:require 
  [reagent.core :as r]
  ["@auth0/auth0-react" :refer (Auth0Provider useAuth0)])

(defn view []
    (let [
        useAuth0 (js->clj (useAuth0))
        {:strs [user
                isAuthenticated
                loginWithRedirect
                getIdTokenClaims
                isLoading
                logout]} useAuth0
        logoutWithRedirect #(logout {:returnTo "redirect/path"})
        {:strs [name email picture sub]} (js->clj user)]
  (r/as-element
    [:div @(subscribe [::some-sub])]
    (if-not isAuthenticated
      [button {:color    "blue"
               :on-click #(loginWithRedirect)} "Login"]
      [button {:on-click #(logoutWithRedirect)} "Log out"])))

これでauth0の提供する関数が使えるようになった。 render関数には [:> view]と書いて渡す。

しかしながら subscribeが効かない! @auth0/auth0-reactを使わず、バニラJavaScript用のを使うか、 renderするときに、as-elementじゃないものを同時に指定して解決するかどうするか。。

何かを創るときに通過する考えは似てる。

 

 Paul Grahamの翻訳記事をみた。

翻訳者に感謝します。

practical-scheme.net 

 

 

これを読んで思い出した想いがあったのでかく。

Paul Grahamの記事とはあまり関係ない。

 

よく言われていることだし、多分同じ感想を持つ人も多いと思うけれど創作するという行為にかんしてはソフトウェアも音楽も近いと思う。

 

ソフトウェアは作品であり、音楽の曲も作品である。

そしてどちらも世の中にでるまではいい物でも悪い物でもない。

人を感動させたり、幸せにする作品はあたりまえながら、知られているもの、つまり世の中にでているものである。

 

昔作曲家になりたかった。

僕は20歳ごろ、和声法や対位法などを先生について学びつつ、ポピュラー理論とタイトルがあるものを読みさっていた。

作曲するたびに「もっといい曲をかかなければ」「こんなんじゃだめだ」など思い納得いくような曲がなかなかできなかった。

時が立ち、それなりに自分ではいい曲がかけたり、知り合いや周りの人や家族に聞かせてなかなかいい評価を受けた。

だけどそれだけだった。

なぜ世の中に出そうと思わなかった、もしくは演奏しようと思わなかったのか。

自分の中の基準で世の中に出す基準ではなかったからである。

ではなぜそこまでいたらなかったのか。

そこはやり切る力がなかったから。いつまでも納得ができず、一つの作品をなっとくいくまで作り切るのがしんどかった。

世の中で売れている曲、名曲といわれているものは、音楽的に(学んだ理論や過去のクラシカルな名曲の観点からは)素晴らしいものばかりではないが、確実にそれらは名曲だった。

 

何が名曲にさせるのか。

いろいろあるけど、まずは世の中に出すことだ。知られること。

知られないと名曲になることは永遠にない。

 

ソフトウェアの界隈ではよく「アウトプット」が大事と言われるが、ここでのアプトプットは学んだことのアウトプットを指すことを言ってることが多いように感じる。

音楽の世界のアウトプットは(アウトプットとは言わないが)演奏者なら演奏すること、作曲者なら曲を世の中に聞いてもらうようにすることである。

 

和声を学んでその学んだことをアウトプットするのもいいけれど、多分音楽家は何せ音楽としてのアウトプットありきだと思う。

ソフトウェアも知識や技術のアプトプットではなく、作品、ソフトのアウトプットが人を感動させ、幸せにすると思う。

 

楽家ではない人が和声法のブログで幸せになることはない。

ソフトウェアエンジニアではない人が技術ブログで幸せになることはない。

 

人を幸せにするのは作品であり、また誰かを何者かにするには作品を世の中に出すこと。

音楽を学び始めたのきっかけは自分でも作曲したい、演奏したい、からだったはず。

 

そしてプログラムを学び始めたきっかけも(ただ楽しかったのもあるけど)世の中に役に立つものを作りたい、という思いだった。

 

今音楽はお休みしているが、世の中に出す、ためのアプリを開発してる。

そんな時、Paul Grahamの翻訳記事をみたので昔感じていたことを思い出した。

僕が ジャズギターを ある程度?弾けるようになった流れ

趣味でジャズギターをやっています。

べつに語れるほどうまくはないのですが、たまにセッションにいきますし、

アドリブっていうのが、いまはどういうものか語れるくらいにはなったので、

初心者の方が参考になるかなーと思って書いてみます。

 

ジャズギターってマイナーなイメージでしたがいまはコミュニティも盛んでそうでもないのかなって感じています。ブログなどでいろんな情報を発表している方が多いので(多くはないかな)人口は増えてるのでは?

 

僕は19歳くらいのときにジャズ、という言葉に憧れて、ききだし、当時フォークギターを弾いていたのでその流れでジャズギターにも憧れて練習を始めたのですがまったくものにならず、弾けずに一度あきらめたのでした。

 

当時やっていたことといえば、

・ジャズギター系の本を買って真似してみる。

・おふとんジャズというサイトを見て真似してみる。

・理論系の本をかって勉強してみる

・指板上のどこに何の音があるかわかるようにする

 

などやっていました。

フレーズだけはそりゃ練習すれば引けますが、いざアドリブとなるととってつけたようになりまったく歌がなくお手上げでした。アドリブとは僕にとっては

「めちゃめちゃ練習した人のみたどりつける境地」みたいなものでした。

実際練習はたくさん必要ですが、そんな仙人みたいな境地にならなくてもアドリブは

ひけます。

さてどうやって弾けるようになったのでしょうか。

 

ギターをやめて数年後、テレビである女子高生サックスプレイヤーを見ました。

寺久保エレナさんです。

衝撃をうけました。自分より全然若い人がこんなすごいフレーズをバリバリ吹いてる。

 

僕は文字通り押入れにしまってあったアコースティックギターをとりだしたのでした。

「もう一度挑戦してみよう」

そうこころに決めたのでした。

 

以前の二の舞にならないようにまず

「習おう」

というところからスタートしました。

僕の住んでいるところは地方都市で、初めはなかなか先生がみつからず、またその先生も「ほんとうにジャズを弾ける先生なんてこのへんにいるのだろうか」という

上から目線でした(笑)

今となってはジャズを弾くこと(レベルはさておき)がそこまで高度なことではないのはわかるのですが、まだ20歳前後の記憶があったので疑いがつよかったです。

 

ようやく見つけた先生のところへ通いだしました。

初レッスンはブルース進行をもとに「とりあえず ひいてみて」みたいな

ものだったと思います。

僕は音をたよりにとりあえず弾いていましたが、当然ジャズっぽくありません。

先生が言われたことは

 

「まずコードトーンを弾く練習をしてください」ということでした。

 

ぼくはこの言葉をきっかけにアドリブの世界に飛び込みました。

 

具体的にはどうするかと言うと、まあそのままの意味ですが、

例えばCm7 というコードがあれば曲に合わせ(枯葉を練習していました)

C 、E♭、G 、B♭を4部音符で弾くだけです。

このとき大切なのは必ずオンリズムで弾くことでした。音楽に合わせる、メトローム

合わせるなど。

僕はこの時点でギターのフレット上に何の音があるというのはある程度わかっていたので1週間程度で枯葉の曲に合わせて、とりあえずコードトーンを弾く、ということが

できるようになりました。

今思えば、指板の音を把握していたり、譜面を読めたりできたのもよかったと思います。

 

ギタリストは譜面に弱いとよく言われますが、TABを読むことになれてしまっているのです。ジャズはTABはよろしくないです。何の音を弾いてるかを把握している必要があるためです。またのちにフレーズ分析など、自分のスタイルをつくっていくのにも音を把握する能力は必須だとおもいます。

 

話それますが、指板の音をどうやって把握できるようになるのでしょうか?

人それぞれやり方があると思いますが、僕のやったやりかたは

まず

Cのおとだけ把握する

1弦の8フレット、2限の1フレット、3限の5フレットなど。

そのあとGの音だけとか。

音程のこともまったくわからない人であれば、キーボードを持つのもいいと思います。

鍵盤楽器は音が非常に見やすいので、音程や理論的なことを把握するのに非常に役に立ちます。

譜面はどうするかというと、まずギターの前に

5線譜上でとにかく書きまくるのをお勧めします。

ドの位置を覚えたら、歌いながら(大切)レの音をかく、飛ばしてソの音を書くなど。

そうすることで譜面がまずなにが書いてあるかがわかるようになります。

そのあとギターを持ち少しずつ、リンクさせていけばいいと思います。

 

さて戻りますが、

コードトーンを追うことでまずジャズの扉?を開くことになるのですが、当然それだけではまったく思い描いたアドリブではありません。

 

次に重要な概念が 

 

解決

 

です。

 

章節が変わる時、次のコードの3度の音になるようにフレーズをもっていくのです。

いきなり長いフレーズからでは難しいのでたとえば

G7 -> CM7に行く時であれば 

ファ ー> ミ だけ弾く。

これをやはり曲に合わせて弾く。

ほかのコードもできるようになれば下から上へ解決、上から下へ、

またいで解決 レ ファ ー> ミ など

すこしづつ音を増やしていきました。

またいろんなポジションでもできるように練習しました。

これでジャズ っぽく少しなっていました。

 

が、まだまだこれくらいではジャズっぽいとは到底言えません。

ぼくは色々情報収集したあげく

フレーズ集なるものを買いました。

「シングル・ラインの演奏を極める ジャズギター ライン&フレーズ」ATN出版

です。(かいてて思い出しましたが、挫折時代に300フレーズとかなんか延々とフレーズが載ってあるのがありましたが、あんなにあっても何が大切なのかなにすればいいのかわからないので、仙人的になれる人以外はまずこの本がオススメです。)

 

この本はオススメです!

簡単な必要な理論的なことやフレーズことはじめから

いろいろなセンスあるフレーズがのってありました。

僕はこれでドミナントフレーズ中心に練習し、アドリブのなかにとりこんでいきました。

するとだんだんとジャズっぽくなっていくではありませんか。

僕はそのフレーズ集のなかの気に入ったフレーズを繰り返し練習しだんだんと自然にでてくるようにしていきました。

 

その後コピーをするようになりました。

これも挫折時代にもしていたのですが、やはり当時はコピーするだけでその後どうすればいいかわからず身につかずにいました。プロを目指すようなかたはコピーをしまくって音感だけで実践にできるとおもうのですが、僕はそこまでできる人間じゃなかったのでどうすればいいかいろいろ考えたのですが、これも人それぞれだとおもいますが、

 

分析作業が大切です!

これはある程度簡単な理論は知っておく必要があります。

理論はよく不要だとか必要だとかありますが、僕の立場としては

理論は自分の中で音を分析するために必要なものだと思っています。

長さを把握するのに定規があるとないとでは応用が全然ちがいますよね?

なにか立体的なものをつくるのに定規なしでも作れると思いますが、あればより

正確に優れたものが作れると思います。

ぼくは音楽理論を定規のようなものだと思っています。

さて

僕の分析のやりかた、応用のさせ方ですが、

コピーして採譜をする(楽譜にかきだす)

その音がどの音からはじまっているか、を把握する

例えば

Cのコードの 3度からはじまっているな

Cのコード上でDのコードトーン?リディアンスケールかな?

GでBのコードトーンか、オルタードスケールからとれるコードを弾いてるな

 

とかです。

そうすれば、何かの曲を弾く時に応用が利くようになります。

 

そうすることでだんだん自分のスタイルみたいなものができてくると思います。

セッションに行くと、みなさんすごく上手いのですが、フレーズから普段聞いているもの、影響をうけたものが違うのを感じれるのでおもしろいです。

 

簡単ですが上記のような流れでだんだんとアドリブというのがわかってきた気がします。もりろんもっと色々なことをやってきたのですが、また時間があれば。

 

あと挫折時代にはジャズギタリストはパットメセニーとかジムホールとか、ウェスとかくらいしかしりませんでしたが、再開したときに再度ジャズ系の情報を集め始めると

カートローゼンウィンケル、ラーゲルンド、マイクモレノなど新しい世代のギタリストがいて音楽を聴くと先進的ですばらしく、それもギターに再度はまったきっかけの一つなのでした。