遊び tokidoki 仕事

数学と音楽と教育と遊び

| おしごと - きょういく - がくせい - ゼミ - イベント | すうがく - おんがく - 数理音楽 - DTM - かがく - scratch
| Art - photo - おきにー - Tips - ものもう - あれこれ | About - Top

数理音楽の風景(1)-不協和度曲線

2012年度卒業生から始めた当ゼミでの数理音楽なる分野,
その風景を数回シリーズでまとめてみよう.

準周期系の研究において連分数にまつわる力学系を扱うことが多かったことと,
はるか以前から音楽の仕組みに数理的仕組みが見え隠れしていると感じていたので,
ずっと取り扱いたいとは思っていたことだった.
そもそも音階の作り自体,繰り込み的な要素が多分にあるし,
その辺の感覚は連分数力学系そのものに由来する.
愛知教育大学学術情報リポジトリ

さて,その数理音楽のゼミでの取り扱い開始は2012年度7代目の卒業研究から.
ドレミファそーする?―音律の数理と音階の構成―
不協和度曲線から始まって,連分数展開による音階構成の仕組みまで触れた卒論.
とあるページでもこの卒論が紹介されているのをしばらく前に発見した.
sites.google.com
この卒論,元になった藤沢+クックの論文*1
和音性の計算法と曲線の絵描き方 ―不協和度・緊張度・モダリティ―
の真似事から始まって,
不飽和度曲線で起こっている解析的な現象をちょっと数学的にきちんと書いてみた,
というものだった.
ただ,不協和度曲線の協和点でグラフが尖ってるといった特長があればいいものを,
そうもなっていなかったために,何らかの方法で協和点を解析的に特徴付けねば,
とでっち上げたのが第二種不協和度曲線だった.
tokidoki.hatenablog.jp

不協和度曲線の数理モデルのアイディアはこうだ.
まず,周波数の異なるsin波を同時に2つ鳴らし,
心理的な快不快の度合いを複数の被験者に採点してもらう.
その結果丁度半音階程度ずれたときが最も不快で,
そこを離れるに従い不快感は減っていったので,
この採点結果を適当な関数でモデル化する.それは例えば
f:id:okiraku894:20170129104409p:plain
であり,純音のドに対する別の純音の不協和度が以下.
f:id:okiraku894:20170128144954p:plain

しかし実際の楽器による楽音は複数の倍音が鳴っているため,
複合音の不協和度は純音の不協和度曲線をシフトして重ね合わせたものになるだろう,
つまり協和・不協和感覚に線形性が成り立っているだろう,という仮定を課すのである.
f:id:okiraku894:20170129105131p:plain

その結果,以下のような複合音に対する不協和度曲線が得られる.
例えば楽音のドに対する別の楽音の不協和度は↓
f:id:okiraku894:20170128144955p:plain
そして経験的に人々(正確には西洋音楽圏の人々*2)が協和すると感じる場所で
不協和度が下がっている,という尤もらしい説明ができる,というわけだ.
なお当たり前のことなのだが,この協和点の集合はFarey列にlog2したものに他ならない.

特に完全五度である3/2倍音は常にオクターブに次いで最も協和度が高い.
そのことによってピタゴラスは現在ピタゴラス音律と呼ばれる,
音階づくりのルールを定めたのだった.
そしてそこから連分数力学系が絡む素敵な世界が広がるのだが,その話は次回以降へ.

音律と音階の科学―ドレミ…はどのようにして生まれたか (ブルーバックス)

音律と音階の科学―ドレミ…はどのようにして生まれたか (ブルーバックス)

*1:更にその大元にはPlomp と Leveltによる音楽心理実験があるのだ. R. Plomp and J. M. Levelt "Tonal Consonance and Critical Bandwidth" Journal of the Acoustical Society of America, 1965.

*2:実際,ハーモニーという概念を持たない民族圏の人々は例えば半音差で二音鳴らした場合と完全五度で鳴らした場合とで快不快感に特段の違いは起こらなかった,という実験結果がある.単旋律文化圏であった他ならぬ明治以前の日本人もそうだったのではなかろうか.

4独のCayley graphを描いてみた by Scratch

数独をテーマにしているゼミ生がいる.
当初は数独の難易度を測定する尺度を作れないか,
などといったことを夢見ていたが,
当人がそもそも数独を趣味にしていないようなので
そういった食指は動かなかったようだ.

じゃぁ何する,ってことになって,
そもそも数独は何通りあるのかをテーマにしようとなった.
もちろん参考書は↓

「数独」を数学する -世界中を魅了するパズルの奥深い世界-

「数独」を数学する -世界中を魅了するパズルの奥深い世界-

けれど,数の並べ替えだけで9!=362880あり,
更に盤の9色色分けの方法を考えると...と,ちょっと想像しただけでも手作業は無理.
しかし当人にプログラミング力があるわけでもなく,
そうすると人力でできるよう問題を簡単にするわけで,
数独likeなものとして4×4盤の4独を考えよう,となった.
実は4独盤は288通りだということが分かっていて,
4独盤集合を不変にする変換群(4独群と呼ぶことにしようか)
の位数も128と知られている.
(実際下に載せるBASICでしらみつぶしに調べたら128個だったし.)

これなら何とか形になるかも,と変換群の生成元をまずは固定して,
4独盤集合内の4独群の軌道を調べる,といったことを始めた.
で当人,手作業で盤を書いては試し書いては試しを繰り返していて,
何だかとても知的作業のように思えない.
いや,こうして泥臭い経験をする中から見えてくるものがあるわけだけど,
そして実際当人にも何か感覚的に見えてくるものがあったとのことだけど,
それにしても卒論提出間近にやる作業には思えない.

で,学生の卒論に託けて,4独群のシミュレーターをScratchで作ってみた.
4独変換群は3つの生成元で生成されることまでは卒論で示してあるので,
その3つの作用が動的に見えるようにしたものだ.

[4DOKU Group Simulator]
↓大変重いので,Turbo mode(Shiftキー押しながら緑の旗をクリック)で実行を.

そして,当然のことながら4DOKU Groupの「形」を見たいと思い,
幸い3つの元で生成されているからそのCayley Graphを3Dで表示してみた.
[Cayley Graph of 4DOKU Group]
↓大変重いので,Turbo mode(Shiftキー押しながら緑の旗をクリック)で実行を.

しかし,下地となるCayley graphの接続状況などすべてScratchで行うのはちょいと厳しい.
ってことで,10進BASICでそのあたりはゴニョゴニョっと.
f:id:okiraku894:20161228135159p:plain

REM
REM [4doku group calculator]
REM ver. 2016/12/23
REM

DIM bd$(1 TO 4,1 TO 128),pm$(1 TO 23),typ$(1 TO 12),cg(1 TO 3,1 TO 128)
DATA "1243","1324","1342","1423","1432","2134","2143","2314","2341","2413","2431"
DATA "3124","3142","3214","3241","3412","3421","4123","4132","4213","4231","4312","4321"
FOR k=1 TO 23
   READ pm$(k)
NEXT k
DATA "1234341221434321","1234342121434312","1234342143122143","1243341221344321"
DATA "1243342123144132","1243341243212134","1234341223414123","1234341241232341"
DATA "1234341243212143","1243342121344312","1243342141322314","1243342143122134"
FOR k=1 TO 12
   READ typ$(k)
NEXT k

!LET bd$(1,1)="1234341221434321" !初期盤
LET bd$(1,1)="123456789abcdefg" !初期盤
LET bd$(2,1)="" !単位元

LET top=1
LET btm=1
LET idx=btm
PRINT USING "### [################] <#####################":idx,bd$(1,1),bd$(2,1)
DO
   PRINT "----";top;" to ";btm;"----"
   FOR k=top TO btm
      LET a0$=bd$(1,k)
      LET g$=bd$(2,k)
      !σ
      IF g$(1:1)<>"s" THEN
         LET a$=sigma$(a0$)
         LET ss=search(a$,idx)
         IF ss=0 THEN
            LET idx=idx+1
            LET bd$(1,idx)=a$
            LET bd$(2,idx)="s"&g$
            PRINT USING "### [################] <#####################":idx,a$,bd$(2,idx)
            LET bd$(3,k)=bd$(3,k)&"s"&STR$(idx)&","
         ELSE
            LET bd$(3,k)=bd$(3,k)&"s"&STR$(SS)&","
         END IF
      END IFIF g$(1:1)<>"m" THEN
         LET a$=mu$(a0$) 
         LET ss=search(a$,idx)
         IF ss=0 THEN
            LET idx=idx+1
            LET bd$(1,idx)=a$
            LET bd$(2,idx)="m"&g$
            PRINT USING "### [################] <#####################":idx,a$,bd$(2,idx)
            LET bd$(3,k)=bd$(3,k)&"m"&STR$(idx)&","
         ELSE
            LET bd$(3,k)=bd$(3,k)&"m"&STR$(SS)&","
         END IF
      END IFIF g$(1:1)<>"t" THEN
         LET a$=tau$(a0$)
         LET ss=search(a$,idx)
         IF ss=0 THEN
            LET idx=idx+1
            LET bd$(1,idx)=a$
            LET bd$(2,idx)="t"&g$
            PRINT USING "### [################] <#####################":idx,a$,bd$(2,idx)
            LET bd$(3,k)=bd$(3,k)&"t"&STR$(idx)&","
         ELSE
            LET bd$(3,k)=bd$(3,k)&"t"&STR$(SS)&","
         END IF
      END IF
       
   NEXT k
   LET top=btm+1
   LET btm=idx
LOOP UNTIL top>btm

PRINT
PRINT

! Cayleyグラフの為の接続状況一覧-----------------
FOR k=1 TO btm
   PRINT USING "### [################] <########## <"&REPEAT$("#",40):k,bd$(1,k),bd$(2,k),bd$(3,k)
   LET g$=bd$(2,k)
   LET ln=1
   DO
      SELECT CASE g$(1:1)
      CASE "s"
         LET cg(1,k)=cg(1,k)+ln
      CASE "m"
         LET cg(2,k)=cg(2,k)+ln
      CASE "t"
         LET cg(3,k)=cg(3,k)+ln
      CASE ELSE
      END SELECT
      LET g$(1:1)=""
      LET ln=ln*1.2
   LOOP UNTIL g$=""
NEXT k

PRINT
PRINT

! 各gの12typeへの作用の様子----------------------
FOR k=1 TO btm
   LET g$=bd$(2,k)
   PRINT USING "[### <"&REPEAT$("#",10)&"] ":k,g$;
   LET cr$=""
   LET ct=0
   FOR t=1 TO 12
      LET res$=typ$(t)
      FOR l=1 TO LEN(g$)
         SELECT CASE g$(l:l)
         CASE "s"
            LET res$=sigma$(res$)
         CASE "m"
            LET res$=mu$(res$)
         CASE "t"
            LET res$=tau$(res$)
         CASE else
         END SELECT
      NEXT l
      LET res$=std$(res$)
      LET cr$=cr$&USING$("##",t)
      IF res$=typ$(t) THEN
         LET cr$=cr$&"=O,"
         LET ct=ct+1
      ELSE
         LET cr$=cr$&"=X,"
      END IF
   NEXT t
   LET bd$(4,k)=STR$(ct)
   PRINT USING ">## ":bd$(4,k);
   PRINT "(";cr$;")"
NEXT k

PRINT

! |X^g|=k となる g の表示--------------------------
FOR t=1 TO 12
   LET cr$=""
   LET ct=0
   FOR k=1 TO btm
      IF bd$(4,k)=STR$(t) THEN
         LET ct=ct+1
         LET cr$=cr$&bd$(2,k)&","
      END IF
   NEXT k
   IF ct>0 THEN
      PRINT "{g|X^g|=";t;"}=";ct;"{";cr$;"}"
   END IF
NEXT t

!FOR k=1 TO btm
!   PRINT bd$(2,k)
!NEXT k
!FOR k=1 TO btm
!   PRINT bd$(3,k)
!NEXT k

! Cayleyグラフ描画---------------------------------
! [4]←→[6] [8]↑[5]↓ [a][z]z方向
! [s] zoom in [x] zoom out
LET wmax=8
SET COLOR MIX(0) 0,0,0
SET COLOR MIX(1) 1,1,1
SET TEXT COLOR 8
SET WINDOW -wmax,wmax,-wmax,wmax
LET dt=0.01
LET QX=-0.6
LET QY=-3
LET QZ=1.8
LET OX=3.5
LET OY=7
LET sw=1
DO
   mouse poll mx,my,left,right
   LET ky$=""
   CHARACTER INPUT nowait:ky$
   SELECT CASE ky$
   CASE "8"
      LET dx=MIN(0.1,dx+dt)
   CASE "5"
      LET dx=MAX(-0.1,dx-dt)
   CASE "4"
      LET dy=MAX(-0.1,dy-dt)
   CASE "6"
      LET dy=MIN(0.1,dy+dt)
   CASE "a"
      LET dz=MIN(0.1,dz+dt)
   CASE "z"
      LET dz=MAX(-0.1,dz-dt)
   CASE "s"
      LET wmax=wmax/1.01
   CASE "x"
      LET wmax=wmax*1.01
   CASE " "
      LET sw=1-sw
   CASE ELSE
   END SELECT
   SET WINDOW -wmax,wmax,-wmax,wmax
   LET QX=QX+dx
   LET QY=QY+dy
   LET QZ=QZ+dz
   LET dx=dx*0.95
   LET dy=dy*0.95
   LET dz=dz*0.95
   IF left=1 THEN
      LET OX=mx
      LET OY=my
   END IF
   SET DRAW mode hidden
   CLEAR
   FOR k=1 TO 128
      LET ed$=bd$(3,k)
      LET X0=rotX(cg(1,k),cg(2,k),cg(3,k))
      LET Y0=rotY(cg(1,k),cg(2,k),cg(3,k))
      SET LINE COLOR 1
      DRAW circle WITH SCALE(wmax/200)*SHIFT(X0,Y0)
      IF sw=1 THEN
         PLOT TEXT ,AT X0+wmax/100,Y0 ,USING"<##########":bd$(2,k)
      END if
      DO UNTIL ed$=""
         LET l=POS(ed$,",")
         LET idx=VAL(ed$(2:l-1))
         IF idx>k THEN
            SELECT CASE ed$(1:1)
            CASE "s"
               LET cl=4
            CASE "m"
               LET cl=2
            CASE "t"
               LET cl=3
            END SELECT
            SET LINE COLOR cl
            LET X1=rotX(cg(1,idx),cg(2,idx),cg(3,idx))
            LET Y1=rotY(cg(1,idx),cg(2,idx),cg(3,idx))
            PLOT LINES: X0,Y0;X1,Y1
         END IF
         LET ed$(1:l)=""
      LOOP
   NEXT k
   SET DRAW mode explicit
LOOP UNTIL left*right=1

REM -----------------------------------------------
REM 呼び出し関数
REM -----------------------------------------------

! 一致する盤を探す
FUNCTION search(S$,midx)
   LET kk=1
   LET search=0
   DO
      IF bd$(1,kk)=S$ THEN
         LET search=kk
         LET kk=midx
      END IF
      LET kk=kk+1
   LOOP UNTIL kk>midx   
END FUNCTION

! 作用σ
FUNCTION sigma$(i$)
   LET a$=i$         
   LET b$=a$(5:8)
   LET a$(5:8)=""
   LET sigma$=b$&a$
END FUNCTION

! 作用μ
FUNCTION mu$(i$)
   LET a$=i$         
   LET b$=a$(9:16)
   LET a$(9:16)=""
   LET mu$=b$&a$
END FUNCTION

! 作用τ
FUNCTION tau$(i$)
   LET a$=i$(1:1)&i$(5:5)&i$(9:9)&i$(13:13)
   LET a$=a$&i$(2:2)&i$(6:6)&i$(10:10)&i$(14:14)
   LET a$=a$&i$(3:3)&i$(7:7)&i$(11:11)&i$(15:15)
   LET tau$=a$&i$(4:4)&i$(8:8)&i$(12:12)&i$(16:16)
END FUNCTION

! 盤の標準化
FUNCTION std$(i$)
   LET s$="1234"
   LET v=VAL(i$(1:1))
   LET s$(v:v)=STR$(1)
   LET v=VAL(i$(2:2))
   LET s$(v:v)=STR$(2)
   LET v=VAL(i$(5:5))
   LET s$(v:v)=STR$(3)
   LET v=VAL(i$(6:6))
   LET s$(v:v)=STR$(4)
   LET st$=""
   FOR kk=1 TO 16
      LET v=VAL(i$(kk:kk))
      LET st$=st$&s$(v:v)
   NEXT kk
   LET std$=st$
END FUNCTION

FUNCTION rotX(X,Y,Z)
   LET rotX=(X*COS(QZ)+Y*SIN(QZ))*COS(QY)+((X*SIN(QZ)-Y*COS(QZ))*SIN(QX)+Z*COS(QX))*SIN(QY)+OX
END FUNCTION

FUNCTION rotY(X,Y,Z)
   LET rotY=(-X*SIN(QZ)+Y*COS(QZ))*COS(QX)+Z*SIN(QX)+OY
END FUNCTION

END

Scratch で置換計算機

じゃ~ん.
f:id:okiraku894:20161211163515j:plain
やっぱり今年もこういう季節だね.
とはいえ,今年,そして来年度は会議やら会議やら,それから会議やらで
卒論にあまりかまってられない事態ではあるが.
おかげで,今年は赤を入れるタイミングが大幅に遅れている.
それでもそろそろ形になってくれないかなぁ~.

ってことで,困ったときのプログラミングでお茶を濁す作戦.
今年も幾つか卒論用に作ってきたところだ.
その一つ,置換計算機を紹介しよう.
f:id:okiraku894:20161219004006p:plain

[使い方]
左にならぶ紫玉クリックで巡回置換表現での置換をセット.
例えば 123,45,67 と入力すれば置換 (1 2 3)(4 5)(6 7) をセットしたことになる.
置換表示に使える文字は123456789abc...xyzの35文字だ.
それぞれの紫玉には上から順にA,B,C,...と置換に名前がついており,
15個の置換まで登録できる.

CALCボタンを押すと計算して欲しい置換の積が,ABCBBAといった具合に入力できる.
ただし,積の解釈は右から左.A=(1 2 3),B=(2 3 4)ならAB=(1 2)(3 4)だ.
計算の結果は ,1,23,465, などと出るが,その意味は(2 3)(4 6 5)だ.

なお,max スライドバーは置換に現れる文字種の最大数を指定している
(計算を速めるため).したがってスライドバーの最大は35だ.


免許更新講習と高大連携2016

この時期,毎年まとめてのお仕事,本日は免許更新,明日は高大連携.

で,いずれも「位取り記数法」から出発する数々の話題.
素朴な数の四則演算の世界は一般の人だって参加しやすいので,
この10年お気に入りでずっと活用している.

で,それに利用するグッズ↓今年もなんちゃって計算機は健在.
f:id:okiraku894:20160809103849j:plain
黒三角の模様のシートはGenaille–Lucas rulersという計算棒.
「ネイピアの骨」における繰り上がりの部分を工夫したシロモノ.
そういえば,これ1年前に紹介していた.
tokidoki.hatenablog.jp

さてこれが終わると,3年ぶり,あいちトリエンナーレ!
現代アートに包まれる2ヶ月.
発売と同時に取得したフリーパスで県内の会場を散策の日々,の予定.
あいちトリエンナーレ2016

あいちトリエンナーレ2016オフィシャルガイドブック (ぴあMOOK)

あいちトリエンナーレ2016オフィシャルガイドブック (ぴあMOOK)

オープンキャンパス2016-本番!

連日報告している,オープンキャンパス,その当日.
tokidoki.hatenablog.jp
tokidoki.hatenablog.jp

数学の学生がやるのは初日の一番最初の時間.
開始15分前はまだ誰も来ず.果たしてお客さんは来るのだろうか?

という心配を他所に,10分前に突然人があふれ出す.廊下に立ち見が出るほど.
f:id:okiraku894:20160723100033j:plain:w500
f:id:okiraku894:20160723101459j:plain:w500

って状態で,いざ開始.あれ,緊張してる?
f:id:okiraku894:20160723100051j:plain:w500

今年はネタが二つ.一つ目は平面図形の重心のちょっとした求め方.
点対称な図形なら分かりやすいのだけどね.
f:id:okiraku894:20160723100510j:plain:w500

さて,ハートはどう求めますか,ってなると,みな混乱.
紙とはさみを渡して生徒らに試行錯誤してもらう.
f:id:okiraku894:20160723101216j:plain:w500

ところがある方法を使えば簡単に重心が求められる.
愛知県の重心だって求められるよ,さて,どうやるのかな?
f:id:okiraku894:20160723101748j:plain:w500
ってことで,画鋲と錘付きの紐を配って再びディスカッション.
f:id:okiraku894:20160723101952j:plain:w500

さて,種明かし.愛知県に画鋲をぶっ刺して,ぶら~んとさせます.
f:id:okiraku894:20160723102432j:plain:w500

で,錘を使ってゴニョゴニョっとを2回やると,じゃ~ん,重心が求まります.
f:id:okiraku894:20160723102757j:plain:w500

こうして一つ目の話題おしまい.
次は簡単な代数を利用した「生き残りゲーム」
はい,参加してくれる人!
f:id:okiraku894:20160723103010j:plain:w500

って募ったらすぐに手が挙がって,お陰様でスムーズに進む.
皆さん前に集まって,何やら作戦会議.
f:id:okiraku894:20160723103150j:plain:w500

そして完成したのがこのシュールな画.
f:id:okiraku894:20160723103453j:plain:w500

後ろから順に自分の帽子の色を当ててもらうのだが,
当然ヤマ勘だから外れる人も出る.そして高校生,ナイス表情.
f:id:okiraku894:20160723103659j:plain:w500

と,突然始まる,予想外の二人芝居.
右の少年の無茶ぶりにも(き,聞いてないよ)とはならず,咄嗟に対応する左の少年.
f:id:okiraku894:20160723103900j:plain:w500

このゲーム,一番後ろ以外は確実に色を当てられる方法がある.
その様子をまずは種明かしせずスタッフが実演してみせる.
f:id:okiraku894:20160723104105j:plain:w500

種明かし後,再び高校生にやってもらったところ,見事成功.
f:id:okiraku894:20160723105802j:plain:w500

「みんな,分かってくれたかな?分かってくれた人!」「ハイ!」
f:id:okiraku894:20160723110007j:plain:w500

ってかんじで,模擬授業を終わります.パチパチパチ!
f:id:okiraku894:20160723110057j:plain:w500

笑いあり,考える時間あり,ディスカッションもあり,で高校生らも楽しんでくれた模様.


さて,ひと仕事終えたら,やっぱピザパだね!
f:id:okiraku894:20160723123326j:plain:w500,left
f:id:okiraku894:20160723123507j:plain:w500,right
f:id:okiraku894:20160723123538j:plain:w500,left


準備ができたので,かんぱ~い,お疲れ!
f:id:okiraku894:20160723123644j:plain

いただきますっ,から~の,
f:id:okiraku894:20160723123658j:plain:w500,right


かかれっ!
f:id:okiraku894:20160723123704j:plain:w500,left


パクッ,そしてウマし.
f:id:okiraku894:20160723123710j:plain:w500,right
f:id:okiraku894:20160723123735j:plain:w500,left


今回初めて二年生中心で短期間に準備したのだけど,
久しぶりに教育大学の学生らしく快活で,またよく教育に配慮した模擬授業になったと思う.
テスト期間中,忙しいにもかかわらず,あらためてご協力に感謝!