MAX/MSP SDK学习03:Atoms and Messages的使用

news2024/10/6 10:32:16

今天终于把Message消息选择器看得有点头绪了,主要是这个官方英文文档理解起来有点抽象。


编写IsMatchABC自定义Object,要求:

①若左入口(入口0)收到 "int" 型消息,则从出口发送数值 "888";

②若左入口(入口0)收到 "ABC" 消息,则从出口发送 "Message match!!!(Send)";

③若右入口(入口1)收到 "int" 型消息,则打印该int数值;

#include "ext.h"			// standard Max include, always required
#include "ext_obex.h"		// required for new style Max object

typedef struct _IsMatchABC {
	t_object ob;			  // the object itself (must be first)
    // 可把t_symbol看成字符串类型
	t_symbol* messagePrintSymbol;  // 若消息选择器匹配,则打印messagePrintSymbol
	t_symbol* messageSendSymbol;   // 若消息选择器匹配,则从出口发送messageSendSymbol
	t_atom messageSendInt;         // 若消息选择器匹配,则从出口发送messageSendInt
	// t_atom类型可存储整型、浮点型、t_symbol类型、指针
	void* outLet;
} t_IsMatchABC;

// function prototypes
// 必备函数
void* IsMatchABC_new(t_symbol* s, long argc, t_atom* argv);
void IsMatchABC_free(t_IsMatchABC* x);
void IsMatchABC_assist(t_IsMatchABC* x, void* b, long m, long a, char* s);
// 自定义函数
void IsMatchABC_testMessageSelector(t_IsMatchABC* x);
void handleInt(t_IsMatchABC* x);
void handleIn1(t_IsMatchABC* x, long n);

// global class pointer variable
void* IsMatchABC_class;

void ext_main(void* r) {
	t_class* c;

	// "IsMatchABC" 建议和项目名一样,否则在max/msp中创建自定义组件会出问题
	c = class_new("IsMatchABC", (method)IsMatchABC_new, (method)IsMatchABC_free, (long)sizeof(t_IsMatchABC),
		0L /* leave NULL!! */, A_GIMME, 0);

	/* you CAN'T call this from the patcher */
	class_addmethod(c, (method)IsMatchABC_assist, "assist", A_CANT, 0);
    // 收到"ABC"消息,则调用IsMatchABC_testMessageSelector方法
	class_addmethod(c, (method)IsMatchABC_testMessageSelector, "ABC", 0); 
	class_addmethod(c, (method)handleInt, "int", A_LONG, 0);
	class_addmethod(c, (method)handleIn1, "in1", A_LONG, 0);

	class_register(CLASS_BOX, c); /* CLASS_NOBOX */
	IsMatchABC_class = c;

	post("I am the IsMatchABC object");
}

void IsMatchABC_assist(t_IsMatchABC* x, void* b, long m, long a, char* s) {
	if (m == ASSIST_INLET) { // inlet
		sprintf(s, "I am inlet %ld", a);
	} else {	// outlet
		sprintf(s, "I am outlet %ld", a);
	}
}

void IsMatchABC_free(t_IsMatchABC* x) {
	;
}

/* argc指在创建组件时,直接跟在组件后面的参数个数;argv存储参数具体值 */
void* IsMatchABC_new(t_symbol* s, long argc, t_atom* argv) { 
	t_IsMatchABC* x = NULL;
	long i;

	if ((x = (t_IsMatchABC*)object_alloc(IsMatchABC_class))) { 
		intin(x, 1);   // 创建入口1(入口0默认存在)
		x->outLet = outlet_new(x, NULL);   // 创建通用出口
        
        // t_symbol型数据得使用gensym函数进行赋值,返回t_symbol型指针
		x->messagePrintSymbol = gensym("Message match!!!(Print)");  
		x->messageSendSymbol = gensym("Message match!!!(Send)");

		atom_setlong(&(x->messageSendInt), 888);
	}
	return (x);
}

// 入口0收到"ABC"消息,则调用IsMatchABC_testMessageSelector方法
void IsMatchABC_testMessageSelector(t_IsMatchABC* x) {
	post("%s", x->messagePrintSymbol->s_name);
	outlet_anything(x->outLet, gensym(x->messageSendSymbol->s_name), 0, 0);
}

// 入口0收到int型消息,则发送"666"
void handleInt(t_IsMatchABC* x) {
	outlet_anything(x->outLet, gensym("int"), 1, &(x->messageSendInt));
}

// 入口1收到int型消息,则发送收到的int数值
void handleIn1(t_IsMatchABC* x, long n) {
	t_atom t_int;
	atom_setlong(&t_int, n);
	outlet_anything(x->outLet, gensym("int"), 1, &t_int);
}

运行结果:

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

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

相关文章

做外贸要学会分析客户情况

最近在某产品的专业群里询问一款产品,看谁可以做,然后很快就有一个自称是工厂的人加上了我。因为自己本身并不懂这个产品,很多他们发的问题自己都答不上来。我就如实告诉他自己是个新手,可以把你们现在能做的,或者已经…

数据结构之栈的讲解

💕" 春宵一刻值千金,花有清香月有阴。 "💕 作者:Mylvzi 文章主要内容:leetcode刷题之哈希表的应用(1) 1.栈的概念 栈是一种只允许在一端(栈顶)进行数据操作的数据结构,具…

一篇文章让你彻底了解Java算法「十大经典排序算法」

✍️作者简介:码农小北(专注于Android、Web、TCP/IP等技术方向) 🐳博客主页: 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN 🔔如果文章对您有一定的帮助请👉关注✨、点赞&…

Delayed 延时任务

延时任务与定时任务的区别 延时任务,可以理解为定时任务的一种,但是他们是有区别的。 延时任务:将程序代码延时执行,执行完毕,即为结束。 定时任务:周期性执行任务。代码执行完毕后,并不意味着…

2023年中国AI基础设施行业发展趋势分析:AI基础设施将保持高速增长[图]

从产品形态来看,AI基础设施可划分为AI基础硬件和基础软件两大类。而在AI生态系统中,通用型和定制型AI基础设施的相互依赖性促进了广泛的AI技术应用,也为各行业的持续发展提供了关键支持。 AI基础设施分类 资料来源:共研产业咨询&…

windows11系统如何设置锁屏壁纸

1. 在开始页面里面找到设置 2. 在设置里面找到个性化 3. 按照红色圈出部分操作 个性化锁屏界面 选择 图片 浏览照片 选择一张你觉得好看的图片作为锁屏壁纸 注:如果需要在锁屏后的登录页面显示壁纸 请勾选第三个红圈部分

Java基本数据类型与引用类型的区别

基本数据类型存放在栈中,引用数据类型其具体内容存放在堆中栈中存放的是其具体内容所在内存的地址。通过变量地址可以找到变量的具体内容,就像通过房间号可以找到房间一样。 public class Main{public static void main(String[] args){//基本数据类型in…

Active Directory 和域名系统(DNS)的相互关系

什么是域名系统(DNS) 域名系统(DNS),从一般意义上讲是一种将主机名或域名解析为相应IP地址的手段。 在 AD 的中,DNS 服务维护 DNS 域和子域的工作命名空间,这些域和子域主要有助于查找过程&am…

最新绿豆APP源码苹果CMS影视插件版本/原生JAVA源码+反编译开源+免授权

源码简介: 最新绿豆APP源码苹果CMS影视插件版本,它是原生JAVA源码反编译开源免授权,绿豆影视对接苹果CMS,它可以支持多功能自定义DIY页面布局。 1、新版绿豆视频APP视频6.1插件版反编译指南及教程 2、后端插件开源,可…

archery修改为不能自提自审核上线SQL

目录 背景修改代码效果参考 背景 我和同事都可以提交上线SQL,但是不能自己提交的SQL自己去审核通过。目前的情况是可以自提自审。 修改代码 找到/opt/archery/sql/utils/workflow_audit.py文件 ...省略...# 判断用户当前是否是可审核staticmethoddef can_revie…

windows如何查看自己的ip地址

windows如何查看自己的ip地址 1.打开控制面板 2.进入网络和internet 3.进入网络共享中心 4.点击以太网进入网络详情页,或邮件已连接的网络,点击属性 5.查看ipv4地址就是当前机器ip

prometheus基本介绍 prometheus和zabbix的区别 grafana可视化工具

一、 promethues概念prometheus介绍promethues的特点prometheus的工作原理prometheus的架构 二、promethues和zabbix的区别三、prometheus安装部署prometheus下载安装prometheus启动浏览器访问查看暴露指标将Prometheus配置为systemd管理 配置node_exporter监控项node_promethe…

深入探讨软件测试技术:方法、工具与最佳实践

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 引言 软件测试是软件开发生命周期中至关重要的…

微信小程序会议OA-登录获取手机号流程登录-小程序导入微信小程序SDK(从微信小程序和会议OA登录获取手机号到登录小程序导入微信小程序SDK)

目录 获取用户昵称头像和昵称 wx.getUserProfile bindgetuserinfo 登录过程 登录-小程序 wx.checkSession wx.login wx.request 后台 准备数据表 反向生成工具生成 准备封装前端传过来的数据 小程序服器配置 导入微信小程序SDK application.yml WxProperties …

对OpenAI CEO奥特曼突然被解雇事件的一些分析

今天也来凑个热闹,说说OpenAI的事。本来不想写的,但是看到自媒体又开始胡说八道,所以根据我自己得到的消息和理解说一说我的看法,这篇文章要是有个小姐姐解说录成视频,那肯定火了,但是我现在没资源&#xf…

OpenAI政变背后是科学家创始人的悲歌

OpenAI政变背后是科学家创始人的悲歌 去年11月突然推出ChatGPT震惊世界的OpenAI,在整整一年后以闪电解职CEO再次震惊世界。 有不少人以为这拿的是乔布斯的剧本,错了,这其实是天才科学家奋力一击的故事。 OpenAI的灵魂人物不是CEO Sam Al…

Vue3入门(与Vue2进行对比)

1. Vue2 选项式 API vs Vue3 组合式API 特点: 代码量变少分散式维护变成集中式维护 2. Vue3的优势 使用create-vue搭建Vue3项目 1. 认识create-vue create-vue是Vue官方新的脚手架工具,底层切换到了 vite (下一代前端工具链)&…

2023APMCM亚太杯/小美赛数学建模竞赛优秀论文模板分享

一、模板介绍 二、注意事项 将论文划分小节时,应避免在小节中出现大段的文字叙述,这样的叙述会妨碍评委在浏览论文时掌握论文的要点。重要的句子,包括首次定义的概念,用黑体书写。 重要的数学公式应另起新行单独列出。建模所用的…

使用activiti部署提示不是 ‘NCName‘ 的有效值

排查发现是整个流程图的,流程名称没有填写 修改之后就可以了

Redis篇---第十二篇

系列文章目录 文章目录 系列文章目录前言一、Memcache与Redis的区别都有哪些?二、单线程的redis为什么这么快三、redis的数据类型,以及每种数据类型的使用场景前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇…