見出し画像

2024-02-21 ローランサンのパレット

●LEAF 0618 ローランサンのパレット

アーティゾン美術館(東京・京橋)で「マリー・ローランサン ―時代をうつす眼」が開催されています。

マリー・ローランサン(1883-1956)は、20世紀前半に活躍した女性画家です。キュビスムの画家として紹介されることも多くありますが、「前衛的な芸術運動」や「流派(イズム)」を中心に語る美術史の中にうまく収まらない存在です。ローランサン自身は、自分に影響を与えた存在として、同時代の画家マティス、ドラン、ピカソ、ブラックの名前を挙げていますが、彼らの様式を模倣することなく、パステルカラーの独自の画風を生み出しました。彼女は同時代の状況を見つつ、時代の要請を理解して、自らの方向性を模索しました。

ローランサンの絵は独特のパステルカラーが特徴。堀口大學 (1892-1981) は、1915年、 外交官の父の赴任先であるマドリードで ローランサンと出会った。ローランサンから、自分の使っている色はこれだというメモを渡されたという。

コバルトブルー(bleu de cobalt)
群青(bleu d' outremer)
茜紅色(laque de garance)
エメラルドグリーン (vertémeraude)
象牙黒 (noir d' ivoire)
銀白(blanc d'argent)
鉛白 (blanc de zinc)

7色のうちに青が2種、 白が2種含まれており、色の種類は5つかな。

絵具を調合するパレットというのがあります。SONYのSMC-777を使って画像を生成する時に使える色は16色だった。どんなパレット(16色の種類)を作れるかが生成画像のポイントだったです。

今だと、画像からパレットを作成できるというオンラインサービスがあります。デザインの配色を考えるのに重宝する。ローランサンのパレットが生成できるか「Adobe Color」で試してみました。


音階や音列は音楽のパレットのようなものかもしれません。どんな音階や音列を組み合わせるかで曲のテイストが変わります。画像の色を元ネタに、色情報(RGB値)を音列と対応させて生成したアルバムがあります。元画像は鶴岡のライブカメラの画像で、音楽の生成実験に使ったのはこれをです64ピクセル(8px*8px)にした画像。

この画像の64個の色のRGB値に音列のパターンを割り当てます。
R・・・メロディー
G・・・サブメロディー
B・・・ベース
ドラムはRGB値とは関係のない一定のパターンを使っています。

生成プログラムはCOBOLで作成したシステム「e-oto2」を使いました。プログラムのテストを兼ねて実験したのが「One Synth Challenge」というシリーズ。パーカッションも含め全トラック全てを1種類のフリーシンセで演奏してみました。

この実験を経て、アルバムとして2015年に制作したのが「Techno Classical」です。

アルバム『Techno Classical』は、事務処理用のプログラム言語として今でも広く使われているCOBOLを使って作成しました。
COBOLによる作曲プログラムでは、16*8pxに変換した画像データのRGB値から3パート(melody,sub-melody,bass)のMMLを生成しています。RGB値をどのような音程やリズムに変換するかは曲毎にパラメータファイルで指定します。ドラムパートには、どの曲も同じパターンを使ってみました。
生成したMMLは、オープンソースのMIDIコンパイラ(cSakura)を使って演奏用のMIDIデータに変換しました。曲の演奏には、有名な国産のフリーシンセ(Synth1)とフリーのドラムマシン(Drum Pro)を使っています。
アルバムに収録した4つの曲は、全て同一の画像から生成したものなのでどれも同じ構造なのですが、各々の曲に付けられた寓意とも皮肉とも願望ともとれるもタイトルは、テクノという音楽に対する作者の複雑な心境を物語っているのかもしれません。

1. 未熟女
2. R31.415
3. 白と赤
4. ニッチマン unlimited


e-oto2のプログラムと実行画面。

[e-oto2.cob]
program-id. e-oto2.
environment division.
input-output section.
file-control.
select txt-file assign txtf organization line sequential.
select prm-file assign prmf organization line sequential.
select mml-file assign mmlf organization line sequential.

data division.
file section.
fd txt-file label records standard.
01 txt-rec pic x(128).
fd prm-file label records standard.
01 prm-rec pic x(512).
fd mml-file label records standard.
01 mml-rec pic x(128).
working-storage section.
01 i pic 9(4).
01 j pic 9(4).
01 k pic 9(4).
01 x pic 9(4).
01 y pic 9(4).
01 t pic 9(4).
01 r pic 9(6).
01 l pic 9(6).
01 h pic 9(6).
01 n pic x(40).
01 msrn pic 9999.
01 seed pic 9999.
01 txtf pic x(20).
01 prmf pic x(20).
01 mmlf pic x(20).
01 inst pic x(60).
01 cmd pic x(40).
01 edw pic x(10).
01 dlm pic x(10).
01 ef pic x value low-value.
01 filler.
  02 mhdr pic x(80).
  02 occurs 8.
    03 thdr pic x(80).
    03 lc pic 99.
    03 lg occurs 10 pic x(3).
    03 pc pic 99.
    03 pt occurs 17 pic x(80).
01 filler.
  02 occurs 1024.
    03 rgb occurs 8 pic 9(3) value 1.
01 ppm.
  02 c occurs 15 pic x(4).
01 filler.
  02 pml pic x(128).
  02 pmn pic x(320).
01 filler.
  02 filler occurs 3.
    03 cc occurs 17 pic 9(4).


procedure division.
display "絵音" perform prm-set
display "txt :" txtf display "prm :" prmf display "mml :" mmlf display "seed:" seed
open input txt-file open output mml-file
read txt-file into txt-rec
read txt-file into txt-rec
read txt-file into txt-rec
unstring txt-rec delimited ' ' into x y
if (x * y) >= 1024
  display '画像サイズが大きすぎます(max=1024)'
  close mml-file txt-file stop run
end-if
read txt-file into txt-rec

compute i = 0 move low-value to ef
perform until ef = high-value
  read txt-file into txt-rec
    end move high-value to ef
    not end perform mml-set
  end-read
end-perform
compute t = i
display 'Cell Number = ' t
display 'First Value = ' rgb(1,1) ' ' rgb(1,2) ' ' rgb(1,3)
display 'Last Value = ' rgb(t,1) ' ' rgb(t,2) ' ' rgb(t,3)

perform varying i from 1 by 1 until i > t
  perform varying j from 1 by 1 until j > 3
    add 1 to cc(j,rgb(i,j)) add 1 to cc(j,17)
  end-perform
end-perform
perform varying i from 1 by 1 until i > 17
  if i = 17
    display '==== ' cc(1,i) ' ' pt(1,i)(1:18) cc(2,i) ' ' pt(2,i)(1:18) cc(3,i) ' ' pt(3,i)(1:18)
  else
    display i ' - ' cc(1,i) ' ' pt(1,i)(1:18) cc(2,i) ' ' pt(2,i)(1:18) cc(3,i) ' ' pt(3,i)(1:18)
  end-if
end-perform

write mml-rec from mhdr display mhdr
perform varying j from 1 by 1 until j > 8
  if thdr(j) not = ' '
    write mml-rec from thdr(j) display thdr(j)
    perform varying i from 1 by 1 until i > t
      compute l = 1 compute h = lc(j) perform randomn
      move pt(j, rgb(i,j)) to n
      move ' ' to mml-rec
      string 'l' lg(j, r) n delimited size into mml-rec
      write mml-rec
    end-perform
  end-if
end-perform

close txt-file mml-file
string 'cSakura -p ' mmlf '> nul' into cmd call 'SYSTEM' using cmd
stop run.

prm-set.
perform
  display 1 upon argument-number accept txtf from argument-value
  perform help-msg
  if txtf = " " move "img.ppm" to txtf end-if
  display 2 upon argument-number accept prmf from argument-value
  if prmf = " " move "prm.txt" to prmf end-if
  display 3 upon argument-number accept mmlf from argument-value
  if mmlf = " " move "tmp.mml" to mmlf end-if
  display 4 upon argument-number accept seed from argument-value
  compute r = function random(seed)

  open input prm-file move low-value to ef
  perform until ef = high-value
    read prm-file into prm-rec
      end move high-value to ef
      not end perform trk-set
    end-read
  end-perform
  close prm-file
end-perform
exit.

trk-set.
perform
  evaluate prm-rec(1:1)
  when "*"
    continue
  when other
    evaluate prm-rec(1:2)
  when "//"
    move high-value to ef continue
  when "Te"
    move prm-rec to mhdr
  when "TR"
    unstring prm-rec delimited " " into edw
    compute i = function numval(edw)
    move prm-rec to thdr(i)
  when other
    unstring prm-rec delimited all ' ' into pml pmn move 0 to lc(i) pc(i)
    unstring pml delimited '/' into
      lg(i,01) lg(i,02) lg(i,03) lg(i,04) lg(i,05) lg(i,06) lg(i,07) lg(i,08) lg(i,09) lg(i,10)
      tallying lc(i)
    unstring pmn delimited '/' into
      pt(i,01) pt(i,02) pt(i,03) pt(i,04) pt(i,05) pt(i,06) pt(i,07) pt(i,08) pt(i,09) pt(i,10)
      pt(i,11) pt(i,12) pt(i,13) pt(i,14) pt(i,15) pt(i,16)
      tallying pc(i)
    end-evaluate
  end-evaluate
end-perform
exit.

mml-set.
perform
  move ' ' to ppm
  unstring txt-rec delimited ' ' into
    c(01) c(02) c(03) c(04) c(05) c(06) c(07) c(08) c(09) c(10)
    c(11) c(12) c(13) c(14) c(15)
  end-unstring
  perform varying k from 0 by 1 until k > 4
    if c(k * 3 + 1) not = ' '
      compute i = i + 1
      perform varying j from 1 by 1 until j > 3
        compute rgb(i,j) = (function numval(c(k * 3 + j)) / 16 + 1) * 1.25
        if rgb(i,j) > 16 compute rgb(i,j) = 16 end-if
      end-perform
    end-if
  end-perform
end-perform
exit.

help-msg.
perform
  move function lower-case(txtf) to txtf move ' ' to edw
  unstring txtf delimited 'help' or 'h ' or '? ' or ' ' into edw delimiter dlm
  if dlm not = ' '
    display 'e-oto2 img-file prm-file mml-file seed'
    display ' '
    display 'img-file : ppmテキスト形式(省略時=img.ppm) 1024px以内'
    display 'prm-file : 曲生成パラメータ(省略時=prm.txt)'
    display 'mml-file : 作成するMMLデータ(省略時=tmp.mml)'
    display 'seed : 乱数の種(省略時=0000) 000109999'
    stop run
  end-if
end-perform
exit.

randomn.
compute r = function rem(function random * 123456789 (h - l + 1)) + l. 

この記事が気に入ったらサポートをしてみませんか?