アルバム「RnA」制作ノート

DDBJ (DNA Data Bank of Japan) (Homo sapiens) mRNAJ 基配列を素材にした作品。 アクセッション番号が、 D20111,D20121,D20131,D20141 のデー タを使い、全部で4つの作品にしてみました。 シンセ音源 (Archemy) を使って録音して あります。

[生成アルゴリズム ]

曲毎に定義した音階と長さの配列を作り、塩基配列から3文字づつ取り出した文字コード の合計値をキーに音符の音程と長さを写し取っていきます。

[プログラム ] (RScript)

mus_c_gnm=function( part=c( 1,2) ,tempo=120,ts="4,4",scle="c d e f g a b",octv=5,lgth="2
4",q=100,qf=0,fluc=0,inst=1,script="R Music Generator",pan=0,vrnd=20,msr=NA,sp="
",sdef="0,0,0,0,0,0,0",rev=0,cho=0){
script=iconv(gsub("¥n", "",script),"UTF-8","SHIFT_JIS")
data=as.numeric(charToRaw(script))
datw=c()
for(j in seq(1,length(data),by=3)){
datw=c(datw,data[j]+data[j+1]+data[j+2])
}
data=datw
for(i in 1:length(part)){
if(is.na(pan[i])==T)pan[i]=pan[1]
if(is.na(inst[i])==T)inst[i]=inst[1]
if(is.na(octv[i])==T)octv[i]=octv[1]
if(is.na(scle[i])==T)scle[i]=scle[1]
if(is.na(lgth[i])==T)lgth[i]=lgth[1]
if(is.na(q[i])==T)q[i]=q[1]
if(is.na(qf[i])==T)qf[i]=qf[1]
if(is.na(sp[i])==T)sp[i]=sp[1]
if(is.na(fluc[i])==T)fluc[i]=fluc[1]
if(is.na(vrnd[i])==T)vrnd[i]=vrnd[1]
if(is.na(rev[i])==T)rev[i]=rev[1]
if(is.na(cho[i])==T)cho[i]=cho[1]
}
nnum=length(data)
tone=matrix(nrow=length(part),ncol=512)
leng=matrix(nrow=length(part),ncol=512)
for(i in 1:length(part)){
set.seed(sum(data))
for(j in 1:512){
tone[i,j]=sample(strsplit(scle[i]," ")[[1]],1)
leng[i,j]=sample(strsplit(lgth[i]," ")[[1]],1)
}
}
not=matrix(nrow=length(part),ncol=nnum)
len=matrix(nrow=length(part),ncol=nnum)
mml=c()
for(i in 1:length(part)){
not[i,]=tone[i,data]
len[i,]=leng[i,data]
mml[i]=paste("o",octv[i],"¥n",sep="")
for(j in 1:nnum){
if (data[j]==32 & sp[i]!=""){note=sp[i]} else {note=not[i,j]}
mml[i]=paste(mml[i],"l",len[i,j],"q",q[i]+qf[i]*RandomSelect(c(-1,1)),note," ",sep="")
}
}
seed=paste("System.RandomSeed=",sum(data),sep="")
kflg=paste("KeyFlag=(",sdef,")",sep="")
titl=paste("TrackName={",'"',script, '"',"}",sep="")
tmpo=paste("TimeSignature=",ts," Tempo=",tempo,sep="")
trk=c()
for(i in 1:length(part)){
trk[ i] =paste( "TR=",part[ i] ," P=",64+pan[ i] ," @",inst[ i] ," v.Random=",vrnd[ i] ,"
t.Random=",fluc[i]," REV=",rev[i]," CHO=",cho[i]," ",mml[i],sep="")
}
if( is.na( msr) ==T) { ptime=""} else{ ptime=paste( "PlayFrom( -1:3:0) PlayTo( ",msr+1,":1:0)
",sep="")}
md=data.frame(code=data)
for(i in 1:length(part)){
md[paste("note_",i,sep="")]=not[i,]; md[paste("lgth_",i,sep="")]=len[i,];
}
return(list(seed,kflg,titl,tmpo,paste(trk,collapse="¥n"),ptime,md))
}
play=function(score){
write( paste( score[ 1:ifelse( is.data.frame( score[ [ length( score) ] ] ) ==T,length( score) -1,length
(score))],sep="¥n"),file="tmp.mml")
shell("csakura -p tmp.mml> nul")
}

[生成用データ ]

# D20111
score=mus_c_gnm(
part=c(1,2,3),
tempo=60,
ts="4,4",
scle=c("d e f g a b c","d e f g a b c","d e f g a b c"),
octv=c(6,5,4),
lgth=c("1 2 4","1 4 2","2 1 1"),
q=c(98,98,98),
qf=c(0,0,0),
fluc=c(20,20,20),
inst=c(1,1,1),
pan=c(-32,+32,0),
vrnd=c(60,60,60),
rev=c(80,80,80),
cho=c(2,2,2),
sp=c("","",""),
sdef="",
script="
gatcaagccaccacgtgccctacgatggcctaacaggagtgcccattggcagattacacatgtaaatatgacctcagacaaaaaggaaccagaggcccaa
gggcaataataaggtggaatttncaggtcagcccaggaattggcagaggaagtaggtgtctgataaccctttgtggagaatgagattccccccacctgtgtg
agaaaaataaacagctctggagtcttgtncctgactccagaggaacgagagcattccaggaaagagagattccctggaaaattgaaaatgtgaatcctagg
gggaaattggggattgtntctttccctgttgaaaatgtttngntgggaataaatatcttcaggaaccataaa
"
)
play(score)

# D20121
score=mus_c_gnm(
part=c(1,2,3),
tempo=30,
ts="4,4",
scle=c("c d e g 'ga'","d e f g 'ea'","d e f g a b c"),
octv=c(6,5,4),
lgth=c("1 2 4","1 4 2","2 4 1"),
q=c(98,98,98),
qf=c(0,0,0),
fluc=c(0,0,0),
inst=c(1,1,1),
pan=c(-32,+32,0),
vrnd=c(60,60,60),
rev=c(80,80,80),
cho=c(2,2,2),
sp=c("","",""),
sdef="",
script="
gatccaggccaaggcactggctgtnagtggcagagtttggctgtaacctttgcccctaacacgaggaactcgtttnaagggggcagcgtagattgtntnattt
gccacctggatgaaggcagacatcaacatgggtcagcacgttnagttacgggagtgggaaattacatgaggcctggncctctnctttcccaagctgtgcgtt
ctggaccagctactganttattaatctcacttagcgaaagtnacggatgagcagtaagtaagtaagtntggggntttaaacttgaggggttccctcctgactag
cctntnttacagganttgtggnaatattaantgcaaatttacaactgcaaa
"
)
play(score)

# D20131
score=mus_c_gnm(
part=c(1,2,3),
tempo=48,
ts="4,4",
scle=c("d e f g a","a g f e d","c e g b"),
octv=c(6,5,4),
lgth=c("1 2 4","1 4 2","2 4 1"),
q=c(98,98,98),
qf=c(0,0,0),
fluc=c(20,20,20),
inst=c(1,1,1),
pan=c(-32,+32,0),
vrnd=c(60,60,60),
rev=c(80,80,80),
cho=c(2,2,2),
sp=c("","",""),
sdef="",
script="
cggaaattcatggttggctacgaaatgcttgctcaggctcagagggacctcacccctgagcaggctgcagagagactaagggcacttcctgaggtncntta
ccacctggggcagnaggacagggagacagcaaccatcgnctgaccacgccgaccacagggccttgaatccttttttgttttcaacagtcttgctgaattaag
cagaaagggccttgaatcctggcctggaatttgggcagatatagcattaataaaactgtgcatctcaaa
"
)
play(score)

# D20141
score=mus_c_gnm(
part=c(1,2,3),
tempo=30,
ts="4,4",
scle=c("'def' 'ace' 'ega' r 'dfg'","'c+d+' 'df+g' 'fgf' r 'gab'","'<a>ceg' '<a>dea' 'efab' 'egbc' 'cegb'"),
octv=c(5,6,5),
lgth=c("1 2 4","1 4 2","4 2 1 1"),
q=c(98,98,98),
qf=c(0,0,0),
fluc=c(20,20,20),
inst=c(1,1,1),
pan=c(-32,+32,0),
vrnd=c(60,60,60),
rev=c(80,80,80),
cho=c(2,2,2),
sp=c("","",""),
sdef="-1,-1,0,0,0,-1,-1",
script="
gatccaccctcctccacctccgaaagtgctgggattataggcatgagccaccgtgctcggccagaggcttcttttaagtgtgacttccaagataaacactttttc
atatattgtntaccttggtgattatgacagaaatcttgccatcctgttaataggaatgatattcctttgtaatgctgtgtcagctttctgaagtgttcacatgtgatactc
ctaagccacacttnctatattcggaagttaatacaaatggtttttaatccttaatatgggccttttttgttctaaggaaaattncatttcaatatagggaaaggnccta
actatttcttttggaaa
"
)
play(score)

[アートワーク ]

トラック1に使ったデータ (D20111) の塩基配列を画像処理して作成しました。


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