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

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Python创建Excel的4种方式小结

《Python创建Excel的4种方式小结》这篇文章主要为大家详细介绍了Python中创建Excel的4种常见方式,文中的示例代码简洁易懂,具有一定的参考价值,感兴趣的小伙伴可以学习一下... 目录库的安装代码1——pandas代码2——openpyxl代码3——xlsxwriterwww.cppcns.c

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程

《在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程》本文介绍了在Java中使用ModelMapper库简化Shapefile属性转JavaBean的过程,对比... 目录前言一、原始的处理办法1、使用Set方法来转换2、使用构造方法转换二、基于ModelMapper