-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathOSCRTMMD.js
127 lines (105 loc) · 3.52 KB
/
OSCRTMMD.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*
a: zak45
d: 18/10/2023
v: 1.0.0
Script to create Container values from received JSON via OSC.
Used for Real Time Music Mood Detection.
Designed for WLEDAudioSync module.
// Mood
var disgust_pos = [-0.9, 0];
var angry_pos = [-0.5, 0.5];
var alert_pos = [0, 0.5];
var happy_pos = [0.5, 0.5];
var calm_pos = [0.4, -0.4];
var relaxed_pos = [0, -0.6];
var sad_pos = [-0.5, -0.5];
var neu_pos = [0.0, 0.0];
*/
var newOSCRTMMDContainer = '';
var moodColor = '';
function init ()
{
// script callback
local.register("/WLEDAudioSync/mood/data", "OSCRTMMDData");
local.register("/WLEDAudioSync/mood/color", "OSCRTMMDColor");
// Main container
newOSCRTMMDContainer = local.addContainer("WLEDAudioSync");
newOSCRTMMDContainer.addColorParameter("Music Mood Color", "Respective Color from detected music mood", [1,0,1]);
newOSCRTMMDContainer.addStringParameter("Mood", "Detected mood name", 'neutral');
// Mood Data container
var newRTMMDDataContainer = newOSCRTMMDContainer.addContainer("Mood Data");
newRTMMDDataContainer.addStringParameter("win_class",'win_class','');
newRTMMDDataContainer.addStringParameter("win_class_energy",'win_class_energy','');
newRTMMDDataContainer.addStringParameter("win_class_valence",'win_class_valence','');
newRTMMDDataContainer.addFloatParameter("soft_valence",'soft_valence',0);
newRTMMDDataContainer.addFloatParameter("soft_energy",'soft_energy',0);
}
// set Data
function OSCRTMMDData (address, args)
{
// script.log("Received message : "+ address + " with value of : " + args[0]);
var rtmmddJsonData = JSON.parse(args[0]);
local.wLEDAudioSync.moodData.win_class.set(rtmmddJsonData.win_class);
local.wLEDAudioSync.moodData.win_class_energy.set(rtmmddJsonData.win_class_energy);
local.wLEDAudioSync.moodData.win_class_valence.set(rtmmddJsonData.win_class_valence);
local.wLEDAudioSync.moodData.soft_valence.set(rtmmddJsonData.soft_valence);
local.wLEDAudioSync.moodData.soft_energy.set(rtmmddJsonData.soft_energy);
// retreive Mood
local.wLEDAudioSync.mood.set(detectMood(rtmmddJsonData.soft_valence, rtmmddJsonData.soft_energy));
}
// set Color
function OSCRTMMDColor (address, args)
{
// script.log("Received message : "+ address + " with value of : " + args[0]);
var rtmmdcJsonData = JSON.parse(args[0]);
local.wLEDAudioSync.musicMoodColor.set([rtmmdcJsonData.R / 255, rtmmdcJsonData.G / 255, rtmmdcJsonData.B / 255]);
}
// util
// returned value is not supposed represent real mood
// only a extraprolation from visual representation
function detectMood(x, y)
{
// white (neutral
if (x <= 0.2 && x >= -0.2 && y <= 0.2 && y >= -0.2) {
return "neutral";
// yellow (happy)
} else if (x >= 0 && y >= 0) {
if ( x >= 0.4 && y >= 0.4){
return "joy";
} else if ( y >= 0.6) {
return "extase";
} else {
return "serenity";
}
// blue (sad)
} else if (x <= 0 && y <= 0) {
if ( x <= -0.9 && y <= 0.2 && y >= -0.2) {
return "disgust";
} else if (x <= -0.4 && y <= -0.4){
return "sad";
} else {
return "pensinve";
}
// red (angry)
} else if (x <= 0 && y >= 0) {
if ( x <= -0.9 && y <= 0.2 && y >= -0.2) {
return "disgust";
} else if ((x <= -0.4 && y >= 0.4) || y >= 0.6){
return "rage";
} else {
return "angry";
}
// green (relax)
} else if (x >= 0 && y <= 0) {
if ( x <= 0.4 && y <= -0.4) {
return "relax";
} else {
return "calm";
}
} else {
return "Error : No mood defined ....";
}
}
function test ()
{
}