MAX/MSP SDK学习09:重要示例1

本示例涉及到单个MSP对象同时使用Signal类型、Message类型的入口;代理入口的使用。

注意:MSP对象的入口默认为代理入口,因此Signal类型、Message类型的数据都可接收;

#include "ext.h"			
#include "ext_obex.h"		
#include "z_dsp.h"			typedef struct _butterFilterTest {t_pxobject		ob;			// the object itself (t_pxobject in MSP instead of t_object)long iirOrder;			// 滤波器阶数   nt_atom* iirState;		// 存储滤波器状态   nint fltStateParaNum;	// 滤波器状态参数个数   nt_atom* a;				// 滤波器参数a   (n+1)t_atom* b;				// 滤波器参数bint fltParaNum;			// 滤波器参数个数    (n+1)int sampleframes;    // 帧大小long lastVectorSize; // 用以判定signal vector size是否有变//void* outLet;/*** 用以测试 ***/t_atom* sigList;     // 存储滤波后的单帧信号t_atom* tmpList;     // 暂存到来的单帧信号/***************/
} t_butterFilterTest;void* butterFilterTest_new(t_symbol* s, long argc, t_atom* argv);
void butterFilterTest_free(t_butterFilterTest* x);
void butterFilterTest_assist(t_butterFilterTest* x, void* b, long m, long a, char* s);
void butterFilterTest_dsp64(t_butterFilterTest* x, t_object* dsp64, short* count, double samplerate, long maxvectorsize, long flags);
void butterFilterTest_perform64(t_butterFilterTest* x, t_object* dsp64, double** ins, long numins, double** outs, long numouts, long sampleframes, long flags, void* userparam);
void butterFilterTest_perform64_list(t_butterFilterTest* x, t_object* dsp64, double** ins, long numins, double** outs, long numouts, long sampleframes, long flags, void* userparam);
void butterFilterTest_feed(t_butterFilterTest* x, t_double* inSig, int sampleframes);void butterFilterTest_recvList(t_butterFilterTest* x, t_symbol* s, long argc, t_atom* argv);
void butterFilterTest_feed_test(t_butterFilterTest* x, long sampleframes);static t_class* butterFilterTest_class = NULL;void ext_main(void* r) {t_class* c = class_new("butterFilterTest~", (method)butterFilterTest_new, (method)butterFilterTest_free, (long)sizeof(t_butterFilterTest), 0L, A_GIMME, 0);class_addmethod(c, (method)butterFilterTest_dsp64, "dsp64", A_CANT, 0);class_addmethod(c, (method)butterFilterTest_assist, "assist", A_CANT, 0);class_addmethod(c, (method)butterFilterTest_recvList, "list", A_GIMME, 0);class_dspinit(c); // 初始化 & 加入通用处理方法class_register(CLASS_BOX, c);butterFilterTest_class = c;
}void* butterFilterTest_new(t_symbol* s, long argc, t_atom* argv) {t_butterFilterTest* x = (t_butterFilterTest*)object_alloc(butterFilterTest_class);dsp_setup((t_pxobject*)x, 3);	// MSP inlets: arg is # of inlets and is REQUIRED!  信号入口数为1,3则信号入口数为3// use 0 if you don't need inletsoutlet_new(x, "signal"); 		// signal outlet (note "signal" rather than NULL)   信号出口//x->outLet = listout(x);x->a = NULL;x->b = NULL;x->fltParaNum = 0;x->iirState = NULL;x->fltStateParaNum = 0;x->sigList = NULL;x->tmpList = NULL;x->lastVectorSize = 0;return (x);
}void butterFilterTest_free(t_butterFilterTest* x) {dsp_free((t_pxobject*)x);sysmem_freeptr(x->a);sysmem_freeptr(x->b);sysmem_freeptr(x->iirState);sysmem_freeptr(x->sigList);sysmem_freeptr(x->tmpList);
}void butterFilterTest_assist(t_butterFilterTest* x, void* b, long m, long a, char* s) {if (m == ASSIST_INLET) { //inletsprintf(s, "I am inlet %ld", a);} else {	// outletsprintf(s, "I am outlet %ld", a);}
}void butterFilterTest_recvList(t_butterFilterTest* x, t_symbol* s, long argc, t_atom* argv) {long inNum = proxy_getinlet((t_object*)x);post("inNum: %d. list recv.", inNum);x->iirOrder = argc - 1;				// 滤波器阶数x->fltStateParaNum = argc - 1;		// 滤波器状态参数个数if (x->a == NULL || x->fltParaNum != argc) {if (x->a != NULL) {sysmem_freeptr(x->a);sysmem_freeptr(x->iirState);}x->a = (t_atom*)sysmem_newptr(sizeof(t_atom) * argc);x->iirState = (t_atom*)sysmem_newptr(sizeof(t_atom) * x->fltStateParaNum);if (x->a == NULL || x->iirState == NULL) {return;}}if (x->b == NULL || x->fltParaNum != argc) {if (x->b != NULL) {sysmem_freeptr(x->b);}x->b = (t_atom*)sysmem_newptr(sizeof(t_atom) * argc);if (x->b == NULL) {return;}}x->fltParaNum = argc;				// 更新滤波器参数个数switch (inNum) {case 0:post("List size: %d", argc);for (int i = 0; i < argc; i++) {atom_setfloat(&(x->tmpList[i]), atom_getfloat(&(argv[i])));}break;case 1:post("List size: %d", argc);for (int i = 0; i < argc; i++) {atom_setfloat(&(x->a[i]), atom_getfloat(&(argv[i])));}post("AAAA");for (int i = 0; i < argc; i++) {post("%lf", atom_getfloat(&(x->a[i])));}break;case 2:post("List size: %d", argc);for (int i = 0; i < argc; i++) {atom_setfloat(&(x->b[i]), atom_getfloat(&(argv[i])));}post("AAAA");for (int i = 0; i < argc; i++) {post("%lf", atom_getfloat(&(x->a[i])));}post("BBB");for (int i = 0; i < argc; i++) {post("%lf", atom_getfloat(&(x->b[i])));}post("recv iirState:");for (int i = 0; i < x->fltStateParaNum; i++) {post("%lf", atom_getfloat(&(x->iirState[i])));}break;}
}// registers a function for the signal chain in Max
void butterFilterTest_dsp64(t_butterFilterTest* x, t_object* dsp64, short* count, double samplerate, long maxvectorsize, long flags) {post("my sample rate is: %f,vector size is: %ld", samplerate, maxvectorsize);   // 和Audio status中设置相同x->sampleframes = maxvectorsize;/* 滤波器状态初始化*/for (int i = 0; i < x->fltStateParaNum; i++) {atom_setfloat(&(x->iirState[i]), 0);}post("dsp64 iirstate:");for (int i = 0; i < x->fltStateParaNum; i++) {post("%lf", atom_getfloat(&(x->iirState[i])));}if (x->sigList == NULL || x->lastVectorSize != maxvectorsize) {if (x->sigList != NULL) {sysmem_freeptr(x->sigList);}x->sigList = (t_atom*)sysmem_newptr(sizeof(t_atom) * maxvectorsize);if (x->sigList == NULL) {return;}}if (x->tmpList == NULL || x->lastVectorSize != maxvectorsize) {if (x->tmpList != NULL) {sysmem_freeptr(x->tmpList);}x->tmpList = (t_atom*)sysmem_newptr(sizeof(t_atom) * maxvectorsize);if (x->tmpList == NULL) {return;}}x->lastVectorSize = maxvectorsize;post("%d", count[0]);post("%d", count[1]);if (count[0]) {post("Signal come.");object_method(dsp64, gensym("dsp_add64"), x, butterFilterTest_perform64, 0, NULL);} else {//post("List come.");//object_method(dsp64, gensym("dsp_add64"), x, butterFilterTest_perform64_list, 0, NULL);}if (count[1]) {}if (count[2]) {}
}/*******************************************************逐帧验证**********************************************************/
void butterFilterTest_perform64_list(t_butterFilterTest* x, t_object* dsp64, double** ins, long numins, double** outs, long numouts,long sampleframes, long flags, void* userparam) {butterFilterTest_feed_test(x, sampleframes);//outlet_anything(x->outLet, gensym("list"), x->sampleframes, x->sigList);//post("%lf, %lf", x->iirState[0], x->iirState[1]);
}void butterFilterTest_feed_test(t_butterFilterTest* x, long sampleframes) {//post("%lf, %lf", x->iirState[0], x->iirState[1]);for (int k = 0; k < x->fltParaNum; k++) { //归一化atom_setfloat(&(x->b[k]), atom_getfloat(&(x->b[k])) / atom_getfloat(&(x->a[0])));atom_setfloat(&(x->a[k]), atom_getfloat(&(x->a[k])) / atom_getfloat(&(x->a[0])));}//Sleep(2000);for (int i = 0; i < sampleframes; i++) {atom_setfloat(&(x->sigList[i]), (atom_getfloat(&(x->b[0])) * atom_getfloat(&(x->tmpList[i])) + atom_getfloat(&(x->iirState[0]))));//post("sampleframs:%d, x->sigList[%d]: %lf, x->tmpList[%d]: %lf, x->iirState[0]: %lf", sampleframes, i, atom_getfloat(&(x->sigList[i])), i, atom_getfloat(&(x->tmpList[i])), x->iirState[0]);for (int j = 1; j < x->fltParaNum - 1; j++) { // j = 1atom_setfloat(&(x->iirState[j - 1]), (atom_getfloat(&(x->iirState[j])) + atom_getfloat(&(x->b[j])) * atom_getfloat(&(x->tmpList[i])) - atom_getfloat(&(x->a[j])) * atom_getfloat(&(x->sigList[i]))));//x->iirState[j - 1] = x->iirState[j] + x->b[j] * atom_getfloat(&(x->tmpList[i])) - x->a[j] * atom_getfloat(&(x->sigList[i]));}atom_setfloat(&(x->iirState[x->fltParaNum - 2]), (atom_getfloat(&(x->b[x->fltParaNum - 1])) * atom_getfloat(&(x->tmpList[i])) - atom_getfloat(&(x->a[x->fltParaNum - 1])) * atom_getfloat(&(x->sigList[i]))));//x->iirState[x->fltParaNum - 2] = x->b[x->fltParaNum - 1] * atom_getfloat(&(x->tmpList[i])) - x->a[x->fltParaNum - 1] * atom_getfloat(&(x->sigList[i]));}
}
/*************************************************************************************************************************/void butterFilterTest_perform64(t_butterFilterTest* x, t_object* dsp64, double** ins, long numins, double** outs, long numouts,long sampleframes, long flags, void* userparam) {  // this is the 64-bit perform method audio vectorst_double* inL = ins[0];		// we get audio for each inlet of the object from the **ins argumentt_double* outL = outs[0];	// we get audio for each outlet of the object from the **outs argumentint n = sampleframes;       // vector sizebutterFilterTest_feed(x, inL, sampleframes);post("perform64 iirstate:");for (int i = 0; i < x->fltStateParaNum; i++) {post("%lf", atom_getfloat(&(x->iirState[i])));}while (n--) {*outL++ = *inL++;}
}void butterFilterTest_feed(t_butterFilterTest* x, t_double* inSig, int sampleframes) {for (int k = 0; k < x->fltParaNum; k++) { // 归一化atom_setfloat(&(x->b[k]), atom_getfloat(&(x->b[k])) / atom_getfloat(&(x->a[0])));atom_setfloat(&(x->a[k]), atom_getfloat(&(x->a[k])) / atom_getfloat(&(x->a[0])));}for (int i = 0; i < sampleframes; i++) {t_double tmp = inSig[i];inSig[i] = atom_getfloat(&(x->b[0])) * tmp + atom_getfloat(&(x->iirState[0]));for (int j = 1; j < x->fltParaNum - 1; j++) {atom_setfloat(&(x->iirState[j - 1]), atom_getfloat(&(x->iirState[j])) + atom_getfloat(&(x->b[j])) * tmp - atom_getfloat(&(x->a[j])) * inSig[i]);//x->iirState[j - 1] = atom_getfloat(&(x->iirState[j])) + atom_getfloat(&(x->b[j])) * tmp - atom_getfloat(&(x->a[j])) * inSig[i];}atom_setfloat(&(x->iirState[x->fltParaNum - 2]), atom_getfloat(&(x->b[x->fltParaNum - 1])) * tmp - atom_getfloat(&(x->a[x->fltParaNum - 1])) * inSig[i]);//x->iirState[x->fltParaNum - 2] = x->b[x->fltParaNum - 1] * tmp - x->a[x->fltParaNum - 1] * inSig[i];}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/218519.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【FPGA图像处理实战】- 图像行缓存设计实现方式一(FIFO)

图像处理中稍复杂点的算法,就需要行缓存,以实现3*3窗口、6*6窗口的数据计算。 本文将介绍使用FIFO来实现图像行缓存的设计,包括关键逻辑分析,源代码实现分享。 一、行缓存功能的设计框架 图像数据一般都是按照从左到右,从上到下,一行行数据的方式发送传输的。 这里以…

Java 重写(Override)与重载(Overload)的对比

Java中的重写(Override)和重载(Overload)是两种不同的方法重写/重载的概念。下面是重写和重载的对比及示例代码&#xff1a; 重写(Override) 重写是指在子类中重新定义父类中已有的方法&#xff0c;以便在子类中实现不同的行为。子类中的重写方法必须具有相同的方法名、参数列…

机器学习三个基本要素:优化算法

在确定了训练集 D、假设空间 ℱ 以及学习准则后&#xff0c;如何找到最优的模型&#x1d453;(x,θ∗) 就成了一个最优化&#xff08;Optimization&#xff09;问题。机器学习的训练过程其实就是最优化问题的求解过程。 参数与超参数 在机器学习中&#xff0c;优化又可以分为参…

mybatis查询结果resultMap映射vo源码分析

概述 mybatis是一个常用的持久层框架&#xff1b;通常搭配mysql使用&#xff1b; 在将查询结果映射成一个复杂vo的时候&#xff0c;通常会用到resultMap&#xff0c;在其中嵌套association和collection等操作&#xff1b;将一个复杂查询拆分成简单查询&#xff1b; 在vo中的变…

数据云:数据基础设施的一小步,数字经济的一大步

随着数字经济的崛起&#xff0c;数据正成为推动社会发展和经济增长的核心要素。在这个数字化时代&#xff0c;数据已经被誉为新的生产要素&#xff0c;是数字经济发展的基础性资源和战略性资源。为了更好地支持数据的汇聚、流通和应用&#xff0c;数据基础设施迎来了一次重要的…

WSL 配置 Docker 内存和 CPU 资源限制

我用的电脑一共有40G内存&#xff0c;最近发现电脑重启后&#xff0c;VmmemWSL 进程很快就会占用一多半的内存&#xff08;20G&#xff09;&#xff0c;电脑中有多个停止运行的容器&#xff0c;正常启动状态的只有一个 MySQL 服务&#xff0c;通过 docker stats 查看占用内存也…

PyCharm安装教程

1.1 为什么要安装python开发环境 上一篇文章我们安装了python&#xff0c;准确来说是python解释器&#xff0c;它没有自带的可视化开发工具&#xff0c;只能通过命令行窗口来执行python代码&#xff0c;这里我们就来下载一个用于python开发的可视化工具——PyCharm。 1.2 PyC…

boost1.55 安装使用教程 windows

第一步 &#xff1a;首先在boost官网上下载库压缩包 添加链接描述 选择自己需要的版本进行下载 解压后执行booststrap.bat 用来生成创建b2.exe 和bjam.exe 拓展&#xff1a;.\b2 --help 了解一下有哪些参数可以配置 默认b2.exe编译后&#xff0c;链接到项目如果出现如下错误…

人工智能基本常识:让深度学习技术更加人性化

近年来&#xff0c;人工智能技术日臻成熟。现在&#xff0c;许多产品和服务都依靠人工智能技术实现自动化和智能化&#xff0c;因此它与我们的日常生活息息相关。无论是为我们带来各种便利的家用设备&#xff0c;还是我们一直在使用的产品制造方式&#xff0c;人工智能的影响无…

低代码开发与传统软件开发:未来趋势与竞争格局

近年来&#xff0c;低代码开发平台的快速发展引起了各行各业的广泛关注。低代码开发平台简化了软件开发的复杂性&#xff0c;提供了更快速、更灵活的开发方式。于是&#xff0c;许多人开始产生一个疑问&#xff1a;未来低代码开发是否会取代传统软件开发&#xff1f;今天这篇文…

ThinkPHP6使用Validate验证表单字段唯一

ThinkPHP6使用Validate验证表单字段唯一 1.创建用户验证文件&#xff0c;如User 1.1 单应用创建验证文件 php think make:validate User 1.2 多应用创建验证文件&#xff0c;admin为应用名&#xff0c; php think make:validate adminUser 创建成功后&#xff0c;应用内会…

java8与java9新特性对比

Java 8和Java 9是Java语言的两个重要版本&#xff0c;它们分别引入了许多新的特性和改进。下面是Java 8和Java 9的一些主要特性对比&#xff1a; Lambda表达式和函数式接口 Java 8引入了Lambda表达式和函数式接口&#xff0c;使得在Java中能够更方便地编写函数式风格的代码。L…

nodejs微信小程序+python+PHP沧州地区空气质量数据分析系统-计算机毕业设计推荐 django

本系统不仅主要实现了注册登录&#xff0c;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;城市区域管理&#xff0c;空气状况管理&#xff0c;空气质量管理&#xff0c;系统管理&#xff0c;数据爬取&#xff0c;大屏分析等功能&#xff0c;通过这些功能基本可…

CompressAI benchmark经典/传统图像编码器的使用

文章目录 使用简介安装依赖编译安装BPG 使用简介 CompressAI的github仓库中Usage-Evaluation给出了传统编解码器的使用帮助&#xff0c;但是并未给出详细的使用方法。本文旨在进行总结使用方法。下图是传统编解码器相关代码的存放地点&#xff0c;其中codecs为各种编解码器类的…

Java版企业电子招标采购系统源码—鸿鹄电子招投标系统-企业战略布局下的采购寻源

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及审…

Impala4.x源码阅读笔记(二)——Impala如何高效读取Iceberg表

前言 本文为笔者个人阅读Apache Impala源码时的笔记&#xff0c;仅代表我个人对代码的理解&#xff0c;个人水平有限&#xff0c;文章可能存在理解错误、遗漏或者过时之处。如果有任何错误或者有更好的见解&#xff0c;欢迎指正。 Iceberg表是一种用于存储大规模结构化数据的…

Shiro框架权限控制

首先去通过配置类的用户认证&#xff0c;在用户认证完成后&#xff0c;进行用户授权&#xff0c;用户通过授权之后再跳转其他的界面时&#xff0c;会进行一个验证&#xff0c;当前账号是否有权限。 前端权限控制显示的原理 在前端中&#xff0c;通常使用用户的角色或权限信息来…

L1-040:最佳情侣身高差

题目描述 专家通过多组情侣研究数据发现&#xff0c;最佳的情侣身高差遵循着一个公式&#xff1a;&#xff08;女方的身高&#xff09;1.09 &#xff08;男方的身高&#xff09;。如果符合&#xff0c;你俩的身高差不管是牵手、拥抱、接吻&#xff0c;都是最和谐的差度。 下面就…

如何建立一套完善的销售管理体系?

如何建立一套完善的销售管理体系&#xff1f; 该提问下已有许多专业的回答&#xff0c;从多个角度为题主出谋划策&#xff1a;销售主管如何提升个人能力、销售团队如何管理、PDCA管理方法论、销售闭环……似乎都与硬性的个人能力挂钩&#xff0c;销售能力、管理能力等等。 或…

使用Java实现桶排序算法

文章目录 桶排序算法 今天来看看桶排序算法&#xff1a; 桶排序算法 &#xff08;1&#xff09;基本思想&#xff1a;把数组 arr 划分为 n 个大小相同子区间&#xff08;桶&#xff09;&#xff0c;每个子区间各自排序&#xff0c;最后合并 。计数排序是桶排序的一种特殊情况…