digital signal processing_一天一点Processing|11网易云音乐动效并不难1——动感音阶

35cd6d7f8596d0d88d31169523191947.png

最近在学习声音可视化的内容,所以就试图用processing做了一下超爱的网易云音乐的动效,没想到还真的实现啦,就放上来大家一同学习学习~~。教程中借用了王菲演唱的《我和我的祖国》专辑封面作为素材,歌超好听,欢迎大家去收听呀。

e68ea375c2973ddfff73612fa989edd5.png

我们先从看起来最简单的动感音阶这个动效进行尝试吧,未来可能还会出后续动效的小教程,欢迎关注呀。

序: 圆形唱片

首先我们要在画布中央导入专辑图片,并将专辑图片变为圆形。用过PS的同学,在此时可能很快就浮现出一个词:蒙版。我们这次用的方式就是蒙版。

首先要准备一张蒙版图片。然后将唱片图片和蒙版图片放入工程文件中,再导入程序之中。

0173a8dfd4c0a9ad4b4725c777c49f88.png
蒙版
PImage album, masking;   //初始化两个图片变量,album和masking
int r = 200;  //唱片圆形半径

void setup() {
  size(800, 800); //设置画布
  background(0);  //设置背景颜色

  imageMode(CENTER);  //图片导入模式为中点
  album = loadImage("album.jpg");      //导入album.jpg图片
  masking = loadImage("masking.jpg");  //导入masking.jpg图片
  album.resize(2*r, 2*r);   //将图片长宽放缩为两倍半径
  masking.resize(2*r, 2*r);
  masking.filter(INVERT);   //将蒙版反相,黑色蒙住,白色漏出
  album.mask(masking);      //唱片为底图,加上蒙版
}

void draw() {
  translate(width/2, height/2);    //将坐标原点放在画布中心
  image(album, 0, 0);  //绘制圆形图片
}

e38caec0e6b8da0d84f497722417a361.png

现在我们需要将唱片旋转起来啦。原理是将坐标轴转动起来。设定一个theta变量,每次循环增加一点。

float theta = 0.0;  //唱片旋转角度

void draw() {
  translate(width/2, height/2);    //将坐标原点放在画布中心
  rotate(theta);
  image(album, 0, 0);
  theta += 0.02;
}

0ca2eddde287040c72a8fac5e49d2d1c.gif

渐变背景

旋转唱片已经实现了,我们可以再对比一下网易云音乐的效果,可以发现背景是透明渐变的。我们可以从唱片中提取颜色来实现渐变效果。

首先我们设置两个颜色变量。一个变量从唱片图片中提取颜色,另一个设置为白色,来制造渐变效果。

color c1, c2; //动效颜色
  c1 = album.get(0, 0);  //提取唱片中的颜色
  c2 = color(360, 1, 100, 1);  //白色透明

颜色从上到下为:唱片颜色 - 白 - 唱片颜色,所以我们将底图分为上下两部分。先绘制上半部分。

  for (int y = -height/2; y < 0; y++) {  //循环
    float n = map(y, -height/2, 0, 0, 1);  //0-1间取值,根据y得到映射值n
    color newc = lerpColor(c1, c2, n);  //渐变颜色提取,n取值为0-1
    stroke(newc);                       //设置线的颜色
    line(-width/2, y, width/2, y);      //画线
  }

c47784c888d085c1f440fb7ecc584c5d.png

绘制下半部分后,再得加一个透明白色正方形。

//设置渐变背景
void backGround() {
  for (int y = -height/2; y < 0; y++) {  //循环
    float n = map(y, -height/2, 0, 0, 1);  //0-1间取值,根据y得到映射值n
    color newc = lerpColor(c1, c2, n);  //渐变颜色提取,n取值为0-1
    stroke(newc);                       //设置线的颜色
    line(-width/2, y, width/2, y);      //画线
  }
  for (int y = height/2; y >= 0; y--) {
    float n = map(y, height/2, 0, 0, 1);
    color newc = lerpColor(c1, c2, n);
    stroke(newc);
    line(-width/2, y, width/2, y);
  }
  //设置透明白色正方形
  noStroke();
  fill(360, 40);
  rect(-width/2, -height/2, width, height);
}

4d9292a9e3f915ef6bc9227c467b3e84.png

音乐可视化动效:动感音阶

在绘制动效之前,我们需要导入Minim音频库。通过建立Minim对象,载入音频文件或者建立声音输入与输出。首先我们需要在“速写本 - 引用库文件 - 添加库文件”中搜索Minim点击Install。

点击“速写本 - 引用库文件 - 添加库文件 - 第三方贡献库 - Minim”我们可以得到以下几行代码。我们这次只需要最开始的一行代码。

import ddf.minim.*;           //这次只用得到这行代码
import ddf.minim.analysis.*;
import ddf.minim.effects.*;
import ddf.minim.signals.*;
import ddf.minim.spi.*;
import ddf.minim.ugens.*;

一般编写音频相关的代码,需要参考下面的范例。

import ddf.minim.*;

AudioPlayer player;  //建立音频播放器
Minim minim;   //定义音频对象

void setup() {
  minim = new Minim(this); 
  player = minim.loadFile("music.mp3", 1024);  //调取音频文件,指定缓存的采样频率为1024
  player.play();  //播放文件
}

void draw(){
}

//需要注意的是,在推出程序钱,必须关闭Minim获得的所有I/O类,然后关闭Minim范本。
void stop(){
  player.close(); //关闭播放器
  minim.stop();   //停止音频
  super.stop();
}

e68ea375c2973ddfff73612fa989edd5.png

我们可以通过上图看动态音效的效果,围绕圆形唱片根据音乐绘制线。这里也要用到循环。每画一条线就旋转一个角度继续画。我们旋转角度后每次都要将坐标轴重置为没有旋转的位置,所以要运用到pushMatrix();和popMatrix();

  translate(width/2, height/2);   //原始点到画布中央
  for (int i=0; i<player.left.size(); i+=15) {
    float rTheta = map(i, 0, player.left.size()-1, 0, 2*PI);  //动态音效绘制线旋转的角度
    pushMatrix();    //把原点数据和旋转数据放入矩阵堆栈中
    rotate(rTheta);  //旋转一个角度
    line(0, r, 0, r + player.left.get(i)*100);  //player.left.get(i)为-1 - 1,所以要乘以一个数放大
    popMatrix();     //释放堆栈
 }

07710bf5c70baa0a98c15c04377f3df9.png

这里我们可以看到线会往内部,会影响视觉效果,所以我们将player.left.get(i)加上绝对值,保证它能够大于0。

再将线条设置为提取的颜色就可以啦!!

c2b790ddd3ef369df2c336c2990b6f7f.png

其实绘制圆形图片应当有更简单高效的方法,但是奈何我试不出来/(ㄒoㄒ)/~~,希望有厉害的同学能够和我分享分享方法,十分感谢~~~。

最后附上所有的代码~~~

主代码

import ddf.minim.*;

AudioPlayer player;  //建立音频播放器
Minim minim;   //定义音频对象

PImage album, masking;
int r = 200;  //唱片圆形半径
float albumTheta = 0.0;  坐标轴旋转角度
color c1, c2; //动效颜色


void setup() {
  size(800, 800);   //设置画布
  colorMode(HSB, 360, 100, 100, 100);
  myAlbum();  //***导入圆形唱片图片

  minim = new Minim(this); 
  player = minim.loadFile("yunian.mp3", 1024);  //调取音频文件,指定缓存的采样频率为1024
  player.play(); //播放文件
}

void draw() {
  translate(width/2, height/2);    //将坐标原点放在画布中心
  background(360);   //设置背景颜色
  backGround();    //***设置渐变背景
  rotate(albumTheta);       //坐标轴旋转
  image(album, 0, 0);  //绘制圆形图片

  //绘制动态音效
  stroke(c1);        //线颜色
  strokeWeight(4);   //线粗
  for (int i=0; i<player.left.size(); i+=6) {
    float rTheta = map(i, 0, player.left.size()-1, 0, 2*PI);  //旋转角度
    pushMatrix();   //把原点数据和旋转数据放入矩阵堆栈中
    rotate(rTheta);
    line(0, r+10, 0, r + 10 + abs(player.left.get(i))*200);
    popMatrix();    //释放堆栈
  }

  albumTheta += 0.02;       //坐标轴旋转角度增加
}

void stop() {
  player.close(); //关闭播放器
  minim.stop();   //停止音频
  super.stop();
}

myAlbum();导入圆形专辑图片

//导入圆形唱片图片
void myAlbum() {
  imageMode(CENTER);  //图片导入模式为中点
  album = loadImage("album.jpg");      //导入album.jpg图片
  masking = loadImage("masking.jpg");  //导入masking.jpg图片
  album.resize(2*r, 2*r);   //将图片长宽放缩为两倍半径
  masking.resize(2*r, 2*r);

  c1 = album.get(0, 0);  //提取唱片中的颜色
  c2 = color(360, 1, 100, 1);  //白色透明

  masking.filter(INVERT);   //将蒙版反相,黑色蒙住,白色漏出
  album.mask(masking);      //唱片为底图,加上蒙版
}

backGround();设置渐变背景

//设置渐变背景
void backGround() {
  for (int y = -height/2; y < 0; y++) {  //循环
    float n = map(y, -height/2, 0, 0, 1);  //0-1间取值,根据y得到映射值n
    color newc = lerpColor(c1, c2, n);  //渐变颜色提取,n取值为0-1
    stroke(newc);                       //设置线的颜色
    line(-width/2, y, width/2, y);      //画线
  }
  for (int y = height/2; y >= 0; y--) {
    float n = map(y, height/2, 0, 0, 1);
    color newc = lerpColor(c1, c2, n);
    stroke(newc);
    line(-width/2, y, width/2, y);
  }
  noStroke();
  fill(360, 40);
  rect(-width/2, -height/2, width, height);
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 数字信号处理(DSP)是一种广泛应用于各个领域的信号处理技术。其基本原理涉及对数字信号进行采样、量化和离散化处理,以及使用算法和数学方法对信号进行分析、转换和增强。 DSP的基本原理主要包括以下几个方面。首先,采样是将连续时间信号转化为离散时间信号的过程。通过在一定时间间隔内测量信号的取样值,可以获得离散的取样序列。其次,量化是将连续幅度范围内的信号值转换为离散的幅度级别。通常使用模拟到数字转换器(ADC)将连续信号量化为数字信号。最后,离散化是将连续时间信号转化为离散时间信号的过程。使用离散化技术可以将连续时间信号转化为离散序列,如离散时间的傅里叶变换。 在DSP中,还有一些关键原理需要掌握。例如,滤波是通过处理输入信号,去除不需要的频率分量或噪声。滤波可以分为时域滤波和频域滤波。此外,频谱分析是通过将信号转换到频域,以便分析不同频率成分的技术。常见的频谱分析方法包括傅里叶变换和快速傅里叶变换(FFT)。 在DSP中,还有一些高级原理和算法,例如数字滤波器设计、时域和频域处理技术、谱估计技术以及信号重建等。这些原理和方法在音频处理、图像处理、通信系统、雷达系统等领域具有重要的应用。 《数字信号处理——原理》是一本深入介绍DSP基本原理和高级应用的著作,可以帮助读者全面了解数字信号处理技术的原理、方法和应用。这本书提供了丰富的实例和案例,对于学习和研究DSP的学生和专业人士来说都是一本得的参考书。 ### 回答2: 数字信号处理(Digital Signal Processing,缩写为DSP)是一种运用数学和算法处理数字信号的技术。数字信号是在时间上离散的信号,它们可以通过模拟信号的采样和量化得到。数字信号处理通过对数字信号进行滤波、变换、压缩、编码等操作,来提取和改变信号中的信息。 数字信号处理的原理主要涉及信号的采样、量化、编码和恢复。首先,信号必须以一定的采样频率进行采样,以在时间上进行离散化。其次,采样后的信号需要进行量化,即将连续的信号值转换为一些离散的数值,通常采用固定精度的量化器来实现。接着,量化后的信号需要进行编码,将其转换为二进制数以便在数字系统中进行传输和处理。最后,接收端需要对编码信号进行解码和恢复,以便还原原始信号。 在数字信号处理中,常见的操作包括滤波、变换和压缩。滤波是通过调整信号的频率特性来去除噪声、改善信号质量等。变换是将信号从一种域转换为另一种域,例如将时域信号转换为频域信号,从而方便进行频谱分析和处理。压缩是通过去除冗余信息和编码技术来减少信号的存储空间和传输带宽。 数字信号处理在很多领域都有广泛的应用,包括通信、音频处理、图像处理、雷达信号处理等。它的发展和应用推了信息技术的快速发展,使得我们可以更有地处理和传输大量的信号和数据。同时,数字信号处理也面临着算法设计、信号鲁棒性、实时性等挑战,需要不断地进行研究和改进。 ### 回答3: 数字信号处理(Digital Signal Processing,DSP)是一种将连续信号转换为数字形式,并利用计算机对数字信号进行处理的技术。DSP的基本原理如下: 1. 采样:连续信号需要经过采样,即按照一定时间间隔对信号进行取样。采样率越高,还原信号的准确度越高。 2. 傅里叶变换:采样后的信号通过傅里叶变换可以将时域信号转换为频域信号。傅里叶变换可以将信号分解为一系列频率成分,方便后续处理。 3. 滤波:通过滤波器,可以对信号进行去噪或者滤波操作。低通滤波器可以去除高频部分,高通滤波器可以去除低频部分,带通滤波器可以选择某个频率范围内的信号。 4. 编码:将数字信号进行编码,以便传输和处理。常见的编码方式有脉冲编码调制(PCM)、压缩编码(例如MP3)等。 5. 数字滤波:通过数字滤波器可以对数字信号进行进一步滤波,去除不需要的频率成分。 6. 快速算法:由于DSP需要进行大量的计算,快速算法可以提高计算速度和率。常见的快速算法有快速傅里叶变换(FFT)等。 7. 数学模型:DSP利用数学模型对信号进行建模,方便对信号进行分析和处理。 总的来说,数字信号处理通过将连续信号转换为数字形式,并利用数字滤波、编码、快速算法等技术进行信号处理,可以实现信号的增强、去噪、压缩和分析等功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值