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

相关文章

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

Java Stream 并行流简介、使用与注意事项小结

《JavaStream并行流简介、使用与注意事项小结》Java8并行流基于StreamAPI,利用多核CPU提升计算密集型任务效率,但需注意线程安全、顺序不确定及线程池管理,可通过自定义线程池与C... 目录1. 并行流简介​特点:​2. 并行流的简单使用​示例:并行流的基本使用​3. 配合自定义线程池​示

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

MySQL中REPLACE函数与语句举例详解

《MySQL中REPLACE函数与语句举例详解》在MySQL中REPLACE函数是一个用于处理字符串的强大工具,它的主要功能是替换字符串中的某些子字符串,:本文主要介绍MySQL中REPLACE函... 目录一、REPLACE()函数语法:参数说明:功能说明:示例:二、REPLACE INTO语句语法:参数