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


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


    编写IsMatchABC自定义Object,要求:

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

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

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

    1. #include "ext.h" // standard Max include, always required
    2. #include "ext_obex.h" // required for new style Max object
    3. typedef struct _IsMatchABC {
    4. t_object ob; // the object itself (must be first)
    5. // 可把t_symbol看成字符串类型
    6. t_symbol* messagePrintSymbol; // 若消息选择器匹配,则打印messagePrintSymbol
    7. t_symbol* messageSendSymbol; // 若消息选择器匹配,则从出口发送messageSendSymbol
    8. t_atom messageSendInt; // 若消息选择器匹配,则从出口发送messageSendInt
    9. // t_atom类型可存储整型、浮点型、t_symbol类型、指针
    10. void* outLet;
    11. } t_IsMatchABC;
    12. // function prototypes
    13. // 必备函数
    14. void* IsMatchABC_new(t_symbol* s, long argc, t_atom* argv);
    15. void IsMatchABC_free(t_IsMatchABC* x);
    16. void IsMatchABC_assist(t_IsMatchABC* x, void* b, long m, long a, char* s);
    17. // 自定义函数
    18. void IsMatchABC_testMessageSelector(t_IsMatchABC* x);
    19. void handleInt(t_IsMatchABC* x);
    20. void handleIn1(t_IsMatchABC* x, long n);
    21. // global class pointer variable
    22. void* IsMatchABC_class;
    23. void ext_main(void* r) {
    24. t_class* c;
    25. // "IsMatchABC" 建议和项目名一样,否则在max/msp中创建自定义组件会出问题
    26. c = class_new("IsMatchABC", (method)IsMatchABC_new, (method)IsMatchABC_free, (long)sizeof(t_IsMatchABC),
    27. 0L /* leave NULL!! */, A_GIMME, 0);
    28. /* you CAN'T call this from the patcher */
    29. class_addmethod(c, (method)IsMatchABC_assist, "assist", A_CANT, 0);
    30. // 收到"ABC"消息,则调用IsMatchABC_testMessageSelector方法
    31. class_addmethod(c, (method)IsMatchABC_testMessageSelector, "ABC", 0);
    32. class_addmethod(c, (method)handleInt, "int", A_LONG, 0);
    33. class_addmethod(c, (method)handleIn1, "in1", A_LONG, 0);
    34. class_register(CLASS_BOX, c); /* CLASS_NOBOX */
    35. IsMatchABC_class = c;
    36. post("I am the IsMatchABC object");
    37. }
    38. void IsMatchABC_assist(t_IsMatchABC* x, void* b, long m, long a, char* s) {
    39. if (m == ASSIST_INLET) { // inlet
    40. sprintf(s, "I am inlet %ld", a);
    41. } else { // outlet
    42. sprintf(s, "I am outlet %ld", a);
    43. }
    44. }
    45. void IsMatchABC_free(t_IsMatchABC* x) {
    46. ;
    47. }
    48. /* argc指在创建组件时,直接跟在组件后面的参数个数;argv存储参数具体值 */
    49. void* IsMatchABC_new(t_symbol* s, long argc, t_atom* argv) {
    50. t_IsMatchABC* x = NULL;
    51. long i;
    52. if ((x = (t_IsMatchABC*)object_alloc(IsMatchABC_class))) {
    53. intin(x, 1); // 创建入口1(入口0默认存在)
    54. x->outLet = outlet_new(x, NULL); // 创建通用出口
    55. // t_symbol型数据得使用gensym函数进行赋值,返回t_symbol型指针
    56. x->messagePrintSymbol = gensym("Message match!!!(Print)");
    57. x->messageSendSymbol = gensym("Message match!!!(Send)");
    58. atom_setlong(&(x->messageSendInt), 888);
    59. }
    60. return (x);
    61. }
    62. // 入口0收到"ABC"消息,则调用IsMatchABC_testMessageSelector方法
    63. void IsMatchABC_testMessageSelector(t_IsMatchABC* x) {
    64. post("%s", x->messagePrintSymbol->s_name);
    65. outlet_anything(x->outLet, gensym(x->messageSendSymbol->s_name), 0, 0);
    66. }
    67. // 入口0收到int型消息,则发送"888"
    68. void handleInt(t_IsMatchABC* x) {
    69. outlet_anything(x->outLet, gensym("int"), 1, &(x->messageSendInt));
    70. }
    71. // 入口1收到int型消息,则发送收到的int数值
    72. void handleIn1(t_IsMatchABC* x, long n) {
    73. t_atom t_int;
    74. atom_setlong(&t_int, n);
    75. outlet_anything(x->outLet, gensym("int"), 1, &t_int);
    76. }

    运行结果:


    补充:outlet_anything的使用。

    1. // outlet_anything发送bang消息
    2. outlet_anything(myOutlet, gensym("bang"), 0, NIL);
    3. // outlet_anything发送整型数据
    4. t_atom myNumber;
    5. atom_setlong(&myNumber, 432);
    6. outlet_anything(myOutlet, gensym("int"), 1, &myNumber);
  • 相关阅读:
    【深入解析spring cloud gateway】07 自定义异常返回报文
    实用又好用,4款高质量办公软件,助你工作效率,节节攀升
    秋招Java后端开发冲刺——非关系型数据库篇(Elasticsearch)
    HorizontalScrollView滚到当前tab,并且居中显示
    Python安装selenium时报错:ERROR: No matching distribution found for selenium 附解决方法
    zynq开发中的设备树
    XLA之HloModule“合并”
    Java中方法的注意事项
    go | 切片的长度和容量
    Linux 编译链接那些事儿(02)C++链接库std::__cxx11::basic_string和std::__1::basic_string链接问题总结
  • 原文地址:https://blog.csdn.net/qq_38967414/article/details/134530250