MAX/MSP SDK学习01:Object的基本构成、创建销毁行为函数的定义、属性的赋值、以及相关注意事项

本文主要是介绍MAX/MSP SDK学习01:Object的基本构成、创建销毁行为函数的定义、属性的赋值、以及相关注意事项,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Object的基本构成、创建&销毁&行为函数的定义、属性的赋值、以及相关注意事项。

#include "ext.h"			// standard Max include, always required
#include "ext_obex.h"		// required for new style Max object// object struct,定义属性
typedef struct _simplemaxDiffTypes {t_object	ob;			// the object itself (must be first)/* 自定义属性 */long value_long;double value_float;
} t_simplemaxDiffTypes;// 必备函数
void* simplemaxDiffTypes_new(t_symbol* s, long argc, t_atom* argv);
void simplemaxDiffTypes_free(t_simplemaxDiffTypes* x);
void simplemaxDiffTypes_assist(t_simplemaxDiffTypes* x, void* b, long m, long a, char* s);
// 自定义函数
void simplemaxDiffTypes_int(t_simplemaxDiffTypes* x, long l);
void simplemaxDiffTypes_double(t_simplemaxDiffTypes* x, double f);
void simplemaxDiffTypes_bang(t_simplemaxDiffTypes* x);// global class pointer variable
void* simplemaxDiffTypes_class;void ext_main(void* r) {t_class* c;// "simplemaxDiffTypes" 建议和项目名一样,否则在max/msp中创建自定义组件会出问题。c = class_new("simplemaxDiffTypes", (method)simplemaxDiffTypes_new, (method)simplemaxDiffTypes_free,(long)sizeof(t_simplemaxDiffTypes), 0L /* leave NULL!! */, A_GIMME, 0);/* you CAN'T call this from the patcher */class_addmethod(c, (method)simplemaxDiffTypes_assist, "assist", A_CANT, 0);// 自定义方法class_addmethod(c, (method)simplemaxDiffTypes_int, "int", A_LONG, 0); // 接收入口传入的long型数据,引号中必须写intclass_addmethod(c, (method)simplemaxDiffTypes_double, "float", A_FLOAT, 0); // 接收入口传入的double型数据class_addmethod(c, (method)simplemaxDiffTypes_bang, "bang", 0);  // 接收入口传入的bang消息class_register(CLASS_BOX, c); /* CLASS_NOBOX */simplemaxDiffTypes_class = c;post("I am the simplemaxDiffTypes object");
}void simplemaxDiffTypes_assist(t_simplemaxDiffTypes* 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 simplemaxDiffTypes_free(t_simplemaxDiffTypes* x) {;
}// 要操作Object中的属性,第一个形参通常为Object的指针
void simplemaxDiffTypes_int(t_simplemaxDiffTypes* x, long l) { // 接收入口传入的long型数据,为value_long赋值x->value_long = l;
}void simplemaxDiffTypes_double(t_simplemaxDiffTypes* x, double f) { // 注意,形参类型绝不能写错. 比如这里不能用float接受object中定义的double,否则无法传参.x->value_float = f;
}void simplemaxDiffTypes_bang(t_simplemaxDiffTypes* x) {post("value_long: %d, value_float: %lf", x->value_long, x->value_float);
}/* argc指在创建组件时,直接跟在组件后面的参数个数;argv存储参数具体值*/
void* simplemaxDiffTypes_new(t_symbol* s, long argc, t_atom* argv) {  // 分配内存创建object,初始化属性,创建入口和出口(默认一个入口,无出口)t_simplemaxDiffTypes* x = NULL;long i;if ((x = (t_simplemaxDiffTypes*)object_alloc(simplemaxDiffTypes_class))) {  // 使用全局指针创建新实例object_post((t_object*)x, "a new %s object was instantiated: %p", s->s_name, x);object_post((t_object*)x, "it has %ld arguments", argc);// 属性赋初值x->value_long = 1;x->value_float = 2.2;for (i = 0; i < argc; i++) { // 打印出创建object时跟在Object名后的参数的详细信息if ((argv + i)->a_type == A_LONG) {object_post((t_object*)x, "arg %ld: long (%ld)", i, atom_getlong(argv + i));} else if ((argv + i)->a_type == A_FLOAT) {object_post((t_object*)x, "arg %ld: float (%f)", i, atom_getfloat(argv + i));} else if ((argv + i)->a_type == A_SYM) {object_post((t_object*)x, "arg %ld: symbol (%s)", i, atom_getsym(argv + i)->s_name);} else {object_error((t_object*)x, "forbidden argument");}}}return (x);
}

运行结果:

1. 创建Object时,打印出创建object时跟在Object名后的参数的详细信息。

2. 传参测试:

这篇关于MAX/MSP SDK学习01:Object的基本构成、创建销毁行为函数的定义、属性的赋值、以及相关注意事项的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、

spring中的@MapperScan注解属性解析

《spring中的@MapperScan注解属性解析》@MapperScan是Spring集成MyBatis时自动扫描Mapper接口的注解,简化配置并支持多数据源,通过属性控制扫描路径和过滤条件,利... 目录一、核心功能与作用二、注解属性解析三、底层实现原理四、使用场景与最佳实践五、注意事项与常见问题六

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.