【非TH】【喵玉咏唱企划】心の旋律
本帖最后由 menshevik 于 2013-5-6 20:49 编辑千呼万唤始出来(衮
这次弄了些花样,具体请戳对应的链接:
通常版:
http://fc.5sing.com/9394242.html
为耳机用户而制的实验性无伴奏合唱:
http://fc.5sing.com/9394333.html
为耳机用户而制的实验性无伴奏合唱加上钢琴伴奏(尼玛咋这么啰嗦呢
http://fc.5sing.com/9394372.html
具体的介绍和参与人员请戳通常版链接并查看介绍……
ab站视频见此:
http://www.bilibili.tv/video/av550523/
http://www.acfun.tv/v/ac643299
在此十分感谢各位参与的歌姬歌基和群众大力支持!
——————————————————————————————————————————
第二个链接里提到了使用matlab进行球表面点的均匀分布的问题,就在这里详细介绍下吧……
主要思想是,要在一个球上均匀分布n个点,可以假想成该球是由n个面积相同的圆拼接而成,这n个圆的圆心所在即是欲求得点的位置;而这n个圆的面积之和等于球的表面积……显然这不可能发生但是可以无限逼近233
假设这些小圆各自相切(不可能但可以逼近),其圆心之间的距离就可以用圆的半径进行控制,则这个距离是必须小于半径*2=小圆的直径的(三角形的边长)……
可以用一个基于小圆直径的参数(Q)来控制各圆心的距离,该参数取值越大,则各圆心(点)与与其相邻的圆心的距离就越大,点在球面上的分布就越趋于均匀……
点是随机取的,所以这完全是打鸟枪和各种trial and error……
这种算法具有相当的局限性,仅完全适用于表面弯曲过渡均匀的立体,也就是球;如果遇到例如椭球之类看着不那么和谐的物体而且取点数目不够多的话,结果估计不太会令人满意……
有文献指出,有种替代方案是利用物理学上物体间作用力的概念,在这里使用质点间的万有引力应该足够;在一个系统中,若各质点满足一定规则分布且分布均匀,若质点间的相互作用力为影响系统应力的唯一因素,则系统应力有最小值……嘛这都是后话了233
具体代码如下:
clear;
clc;
numofpoint=21;%欲生成的点数
radius=1; %球体半径
Q=0.75; %质量因子,在上面所取的点数和半径情况下,Q>0.72就较难一次生成结果了……
maximumtrial=3000; %当取得一个点后,需要对其他已经定下来的点进行距离测量;如果不满足条件则该点作废,重新随机在圆上取一点,进行测量,决定存废;这个是执行上述循环的最大次数
maxresetcount=50; %若怎么取点都无法通过上述的距离测试,免得死循环,俺们还是推翻重来,从第一个点开始取吧!这里就是设定推翻重来的次数……
%上述即为需要预先人工调节的所有参数,要用的话可以不用管下面的代码了233
%%%%%%%%%%%%%%%%%%%%
precisionmin=0.999*(radius^2); %精度设定,这种完全够用了
precisionmax=1.001*(radius^2); %精度设定,这种完全够用了
mininumdistance=(sqrt(((4*pi*radius^2)/numofpoint)/pi)*2)*Q; %这就是算法的核心,很简单的原理= =
x(numofpoint)=0; %声明坐标矩阵,下同
y(numofpoint)=0;
z(numofpoint)=0;
%%%%%%%%%%%%%%%%%%
count=0;
reseton=maxresetcount;
resetcount=0;
trialanderror=0;
while reseton>=1
x=0;
y=0;
z=0;
x(numofpoint)=0;
y(numofpoint)=0;
z(numofpoint)=0;
while (x(1)^2+y(1)^2+z(1)^2<=precisionmin)||(x(1)^2+y(1)^2+z(1)^2>=precisionmax)
x(1)=rand*2*radius-radius;
y(1)=rand*2*radius-radius;
z(1)=rand*2*radius-radius;
count=count+1;
end
%%%%%%%%%disp('the 1st point is generated'); %随机生成第一个点;后来看了下相关资料,如果使用球坐标基准生成点的话不仅位置绝对准确而且只需生成一次随机数,提高运行效率……若需转换成直角坐标系对于电脑而言是十分简单的事……这里俺就懒得改了QvQ
count=0;
i=2;
j=1;
while i<numofpoint+1
while (x(i)^2+y(i)^2+z(i)^2<=precisionmin)||(x(i)^2+y(i)^2+z(i)^2>=precisionmax)
x(i)=rand*2*radius-radius;
y(i)=rand*2*radius-radius;
z(i)=rand*2*radius-radius;
count=count+1;
end
%%%%%%%%%%%%%%%disp('the'),disp(i),disp('th point is generated'); %随机生成第2-n个点
count=0;
for j=1:(i-1)
%%%%%%%%%%%%%%disp('the'),disp(j),disp('th point is being checked'); %检查循环开始
if (sqrt((x(j)-x(i))^2+(y(j)-y(i))^2+(z(j)-z(i))^2)<mininumdistance)
x(i)=0;
y(i)=0;
z(i)=0;
%%%%%%%%%%%%%disp('but this point did not pass the check');
trialanderror=trialanderror+1;
%%%%%%%%%%%%%disp('this is the'),disp(trialanderror),disp('th time we failed the check');
break;
end
%%%%%%%%%%%%%%%disp('and the'),disp(i),disp('th point passed the check');
end
j=1;
if trialanderror>=maximumtrial %整体推翻重来条件
reseton=reseton-1;
disp('this is the'),disp(maxresetcount-reseton),disp('th time we restart');
trialanderror=0;
break;
end
if (x(i)~=0)&&(y(i)~=0)&&(z(i)~=0) %如果通过了测试这点就这么定下来了
%%%%%%%%disp('the'),disp(i),disp('th point is confirmed and is available for use');
i=i+1;
trialanderror=0;
end
end
if i>=numofpoint+1 %生成了足够多的点后退出大循环
break;
end
end
disp(x);
disp(y);
disp(z);
如果有人想跑这个脚本,可以把前面写满%的disp语句正常化,查看下工作流程,但是会很大程度上影响性能……
如果取6个点跑,在Q足够大时可以看到近似于正八面体的顶点分布;这次使用的21个顶点在Q=0.8的情况下算了四十多道才算出了这次翻唱进行位置建模使用的坐标,然而我都嫌这个还是有些不太均匀233(实际上相当均匀了)
啊对了Q别取太大,更千万别取>=1的数,否则一辈子都算不出来= =
matlab……孟总你太可怕了
好听啊~坐等高手做成视频 顶,孟总和各位歌姬歌基们辛苦,能参与这样的企划好幸运。
不过孟总的算法没看懂orz。倒是物理上电子斥力算法很容易理解。很快就得了个结果。同样贴个代码好了。
—————————————以下代码—————————————————————————
function outdata=PointOnBall()
%利用动力学方法和引力公式求球面均匀分布点
close all;
NumPoint=21;
data=rand(3,NumPoint);
for i=1:NumPoint
data(:,i)=data(:,i)/norm(data(:,i));
end%归一化获得球面点
InfCom=1e-8;
step=0.3;%运动步长
for count=1:800
for i=1:NumPoint
Ptemp(:,i)=sub_motion(data,i,step);
end
data=Ptemp;
sForPlot(count)=data(1,1);
end
plot(sForPlot);%看看收敛与否
outdata=data;
%以下绘图部分
figure;
ci=1;
for t1=0:pi/10:2*pi
cj=1;
for t2=-pi:pi/10:pi
xx(ci,cj)=t1;
yy(ci,cj)=t2;
Ball1(ci,cj)=cos(t2)*cos(t1);
Ball2(ci,cj)=cos(t2)*sin(t1);
Ball3(ci,cj)=sin(t2);
cj=cj+1;
end
ci=ci+1;
end
mesh(Ball1,Ball2,Ball3);
hold on;
plot3(outdata(1,:),outdata(2,:),outdata(3,:),'or');
axis equal;
hold off
end
function Pt=sub_motion(data,i,step)
N=length(data);
F=;
InfCom=1e-8;
for j=1:N
if j~=i
vec=data(:,i)-data(:,j);
ft=vec/((vec'*vec)+InfCom);%斥力公式,因为计算万有斥力麻烦,简化为倒数型斥力
F=F+ft;
end
end
Ptemp=data(:,i)+F*step;%沿力方向直加
Pt=Ptemp/norm(Ptemp);
end
——————————————代码结束————————————————
咏唱区发这个是不是有歪楼倾向233
不明觉厉。。、。 很好聽!
個人很喜歡這種治癒的曲風w合唱起來超美www
另外感覺挺適合給雅安打氣的一首歌...
各位辛苦了,超GJ的歌! 楼上你们歪楼了...
屠杀声部 我错了...孟巨巨辛苦 感觉纯人声最赞了!大家都辛苦了!
本帖最后由 c020109703 于 2013-4-30 00:07 编辑
歌先赞个。
话说下面的那堆代码能去技术区另行开贴交流吗? 我就是看到有很喜欢的曲子企划就点进来看看,然后完全看不懂了…… 哦哦~好评!超喜欢这支~~
话说是一起录音的还是后期混音= =?分离度貌似有点不佳,男声也不清晰
页:
[1]
2