見出し画像

max/msp gen~によるスプライン関数


max/msp gen~でのスプライン関数の実装です。
節点が8つのスプライン関数です。
in1にphasorでxの値を入力するとyの値を出力します。
節点はxがin2~in10 yがin11~in19までです。
端点のCの値はin20,in21で入力します。


以下がgen~のcodeboxの中身です。

Data A(20),B(20),C(20),D(20),h(20),x(20),y(20),u(20);
Data p(20,20);
i=0;j=0;k=0;m=0;n=0;kz=0;z=0;lp=0;g=0;q=0;xw=0;s=0;f=0;
n=8;

poke(x,in2,0);poke(x,in3,1);poke(x,in4,2);poke(x,in5,3);
poke(x,in6,4);poke(x,in7,5);poke(x,in8,6);poke(x,in9,7);poke(x,in10,8);
poke(y,in11,0);poke(y,in12,1);poke(y,in13,2);poke(y,in14,3);
poke(y,in15,4);poke(y,in16,5);poke(y,in17,6);poke(y,in18,7);poke(y,in19,8);

poke(C,in20,1);poke(C,in21,9);

for(i=1;i<=n;i+=1){
 poke(D,peek(y,i-1),i);
 poke(h,peek(x,i)-peek(x,i-1),i );
 poke(u,((peek(y,i)-peek(y,i-1))/peek(h,i)),i);
}

for(i=1;i<=n+1;i+=1){
	for(j=1;j<=10;j+=1){
     poke(p,0,i,j);
 }	
}

poke(p,1,1,1);
poke(p,1,9,9);
poke(p,peek(C,1),1,10);
poke(p,peek(C,9),9,10);
for(j=2;j<=n;j+=1){
  poke(p,peek(h,j),j,j-1);
  poke(p,2*(peek(h,j-1)+peek(h,j)),j,j);
  poke(p,peek(h,j-1),j,j+1);
  poke(p,3*(peek(h,j)*peek(u,j-1)+peek(h,j-1)*peek(u,j)),j,10);	
}

for(i=1;i<=n+1;i+=1){
  q=peek(p,i,i);
  for(j=1;j<=n+2;j+=1){
    poke(p,(peek(p,i,j)/q),i,j);
  }
  for(k=1;k<=n+1;k+=1){
    g=peek(p,k,i);
    if(k != i){
        for(j=1;j<=n+2;j+=1){
               poke(p,peek(p,k,j)-g*peek(p,i,j),k,j);
             } 
     }
  }   
}

for(j=1;j<=n;j+=1){
 poke(C,peek(p,j,10),j);
}

for(j=1;j<=n-1;j+=1){
 poke(B,(3*peek(u,j)-2*peek(C,j)-peek(C,j+1))/peek(h,j),j);
}
poke(B,-(3*peek(u,7)-peek(C,7)-2*peek(C,8))/peek(h,7),8);

for(j=1;j<=n-1;j+=1){
 poke(A,(peek(B,j+1)-peek(B,j))/(3*peek(h,j)),j);
}
poke(A,(peek(u,8)-peek(h,8)*peek(B,8)-peek(C,8))/(peek(h,8)-peek(h,8)),8);

if(0<=in1&&in1<1){
 out1=peek(A,1)*in1*in1*in1+peek(B,1)*in1*in1+peek(C,1)*in1+peek(D,1);
}else if(1<=in1&&in1<2){
 out1=peek(A,2)*(in1-1)*(in1-1)*(in1-1)+peek(B,2)*(in1-1)*(in1-1)+peek(C,2)*(in1-1)+peek(D,2);
}else if(2<=in1&&in1<3){
 out1=peek(A,3)*(in1-2)*(in1-2)*(in1-2)+peek(B,3)*(in1-2)*(in1-2)+peek(C,3)*(in1-2)+peek(D,3);
}else if(3<=in1&&in1<4){
 out1=peek(A,4)*(in1-3)*(in1-3)*(in1-3)+peek(B,4)*(in1-3)*(in1-3)+peek(C,4)*(in1-3)+peek(D,4);
}else if(4<=in1&&in1<5){
 out1=peek(A,5)*(in1-4)*(in1-4)*(in1-4)+peek(B,5)*(in1-4)*(in1-4)+peek(C,5)*(in1-4)+peek(D,5);
}else if(5<=in1&&in1<6){
 out1=peek(A,6)*(in1-5)*(in1-5)*(in1-5)+peek(B,6)*(in1-5)*(in1-5)+peek(C,6)*(in1-5)+peek(D,6);
}else if(6<=in1&&in1<7){
 out1=peek(A,7)*(in1-6)*(in1-6)*(in1-6)+peek(B,7)*(in1-6)*(in1-6)+peek(C,7)*(in1-6)+peek(D,7);
}else if(7<=in1&&in1<=8){
 out1=peek(A,8)*(in1-7)*(in1-7)*(in1-7)+peek(B,8)*(in1-7)*(in1-7)+peek(C,8)*(in1-7)+peek(D,8);
}

こんな感じです。

画像1


8個の節点を動かして波形を作ることが出来ます。

スプライン関数2






よろしければサポートお願いします!