ckb-next  beta-v0.2.8 at branch testing
ckb-next driver for corsair devices
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
main.c
Go to the documentation of this file.
1 #include <math.h>
2 #include <stdint.h>
3 #include <stdlib.h>
4 
5 #include <pulse/simple.h>
6 
7 #include "../ckb/ckb-anim.h"
8 
9 #include "kiss_fftr.h"
10 
11 void ckb_info(){
12  // Plugin info
13  CKB_NAME("Music Visualization");
14  CKB_VERSION("0.2");
15  CKB_COPYRIGHT("2015", "RULER501");
16  CKB_LICENSE("LGPLv3");
17  CKB_GUID("{097D69F0-70B2-48B8-AFE2-25CA1DB0D92C}");
18  CKB_DESCRIPTION("A collection of music visualization effects");
19 
20  // Effect parameters
21  CKB_PARAM_AGRADIENT("color", "Fade color:", "", "ffffffff");
22  CKB_PARAM_BOOL("power", "Use Power instead of Magnitude?", 0);
23 
24  // Timing/input parameters
29 
30  // Presets
31  CKB_PRESET_START("Default");
32  CKB_PRESET_PARAM("power", "0");
33  CKB_PRESET_PARAM("trigger", "0");
34  CKB_PRESET_PARAM("kptrigger", "1");
36 }
37 
38 double powers[2048] = { 0.f };
42 pa_simple *pas = NULL;
43 int power = 0;
44 
45 void ckb_init(ckb_runctx* context){
46  static const pa_sample_spec ss ={
47  .format = PA_SAMPLE_S16LE,
48  .rate = 44100,
49  .channels = 1
50  };
51  pas = pa_simple_new(NULL, "CKB Music Viz", PA_STREAM_RECORD, NULL, "CKB Music Viz", &ss, NULL, NULL, NULL);
52  inbuf = malloc(2048*sizeof(kiss_fft_cpx));
53  outbuf = malloc(2048*sizeof(kiss_fft_cpx));
54 }
55 
56 void ckb_parameter(ckb_runctx* context, const char* name, const char* value){
57  CKB_PARSE_AGRADIENT("color", &animcolor){}
58  CKB_PARSE_BOOL("power", &power);
59 }
60 
61 void anim_add(ckb_key* press, float x, float y){
62  return;
63 }
64 
65 void anim_remove(float x, float y){
66  return;
67 }
68 
69 void ckb_keypress(ckb_runctx* context, ckb_key* key, int x, int y, int state){
70  return;
71 }
72 
73 void ckb_start(ckb_runctx* context, int state){
74  return;
75 }
76 
77 void ckb_time(ckb_runctx* context, double delta){
78  return;
79 }
80 
81 int max(int a, int b){
82  return a > b ? a : b;
83 }
84 
85 int min(int a, int b){
86  return a < b ? a : b;
87 }
88 
89 int gcounter = 0;
90 
91 void getFreqDec(){
92  int16_t data[2048];
93  pa_simple_read(pas, data, sizeof(data), NULL);
94  for(int j=0; j<2048; j++){
95  inbuf[j].r = data[j];
96  inbuf[j].i = 0;
97  }
98  kiss_fft_cfg config = kiss_fft_alloc(2048, 0, NULL, NULL);
99  kiss_fft(config, inbuf, outbuf);
100 
101  for(unsigned int j=0; j < 2048; j++)
102  if(power)
103  powers[j] = outbuf[j].r*outbuf[j].r + outbuf[j].i*outbuf[j].i;
104  else
105  powers[j] = sqrt(outbuf[j].r*outbuf[j].r + outbuf[j].i*outbuf[j].i);
106  kiss_fft_free(config);
108 }
109 
110 int ckb_frame(ckb_runctx* context){
111  CKB_KEYCLEAR(context);
112  ckb_key* keys = context->keys;
113  ckb_key* maxkey = keys+context->keycount-1;
114  getFreqDec();
115  unsigned int frames = context->width*context->height - 1;
116  int height = context->height;
117  for(ckb_key* key = keys; key < maxkey; key++){
118  int posl = height*key->x + key->y - 1;
119  posl = max(posl, 0);
120  int posr = height*key->x + key->y + 1;
121  posr = max(posr, 0);
122  int lowi = floorf(pow(2,posl*11.f/frames));
123  int highi = ceilf(pow(2,posr*11.f/frames));
124  highi= min(highi, (int)sizeof(powers)/sizeof(double)-1);
125  lowi = max(lowi, 0);
126  double total = 0;
127  unsigned int height = context->height;
128  for(unsigned int i = lowi; i <= highi; i++)
129  total += powers[i];
130  total /= highi - lowi + 1;
131  float a, r, g, b;
132  ckb_grad_color(&a, &r, &g, &b, &animcolor, total/(power ? 150994944.f : 12288.f));
133  ckb_alpha_blend(key, a, r, g, b);
134  }
135  return 0;
136 }
int power
Definition: main.c:43
#define CKB_PRESET_END
Definition: ckb-anim.h:87
#define FALSE
Definition: ckb-anim.h:49
void ckb_keypress(ckb_runctx *context, ckb_key *key, int x, int y, int state)
Definition: main.c:75
void ckb_parameter(ckb_runctx *context, const char *name, const char *value)
Definition: main.c:68
#define CKB_VERSION(version)
Definition: ckb-anim.h:64
#define CKB_TIMEMODE(mode)
Definition: ckb-anim.h:97
float y
Definition: main.c:66
#define TRUE
Definition: ckb-anim.h:46
#define CKB_GUID(guid)
Definition: ckb-anim.h:60
pa_simple * pas
Definition: main.c:42
int gcounter
Definition: main.c:89
#define CKB_NAME(name)
Definition: ckb-anim.h:62
#define CKB_KP_NONE
Definition: ckb-anim.h:90
float x
Definition: main.c:66
ckb_gradient animcolor
Definition: main.c:52
#define CKB_PARSE_AGRADIENT(param_name, gradient_ptr)
Definition: ckb-anim.h:121
#define CKB_TIME_ABSOLUTE
Definition: ckb-anim.h:96
float i
Definition: kiss_fft.h:53
#define CKB_LICENSE(license)
Definition: ckb-anim.h:68
#define CKB_COPYRIGHT(year, author)
Definition: ckb-anim.h:66
Definition: keymap.h:49
unsigned height
Definition: ckb-anim.h:143
#define CKB_DESCRIPTION(description)
Definition: ckb-anim.h:70
int ckb_frame(ckb_runctx *context)
Definition: main.c:137
unsigned keycount
Definition: ckb-anim.h:141
#define CKB_PRESET_START(name)
Definition: ckb-anim.h:85
void ckb_time(ckb_runctx *context, double delta)
Definition: main.c:126
kiss_fft_cpx * outbuf
Definition: main.c:40
#define CKB_KPMODE(mode)
Definition: ckb-anim.h:93
void getFreqDec()
Definition: main.c:91
void kiss_fft_cleanup(void)
Definition: kiss_fft.c:391
#define CKB_PARAM_AGRADIENT(name, prefix, postfix, default)
Definition: ckb-anim.h:80
#define CKB_LIVEPARAMS(enable)
Definition: ckb-anim.h:104
kiss_fft_cfg kiss_fft_alloc(int nfft, int inverse_fft, void *mem, size_t *lenmem)
Definition: kiss_fft.c:339
void anim_remove(int index)
Definition: main.c:71
float r
Definition: kiss_fft.h:52
void ckb_info()
Definition: main.c:5
int max(int a, int b)
Definition: main.c:81
#define CKB_PARSE_BOOL(param_name, value_ptr)
Definition: ckb-anim.h:117
void kiss_fft(kiss_fft_cfg cfg, const kiss_fft_cpx *fin, kiss_fft_cpx *fout)
Definition: kiss_fft.c:385
void ckb_init(ckb_runctx *context)
Definition: main.c:57
double powers[2048]
Definition: main.c:38
#define CKB_REPEAT(enable)
Definition: ckb-anim.h:99
void anim_add(int index)
Definition: main.c:65
int min(int a, int b)
Definition: main.c:85
#define kiss_fft_free
Definition: kiss_fft.h:102
#define CKB_KEYCLEAR(context)
Definition: ckb-anim.h:148
void ckb_start(ckb_runctx *context, int state)
Definition: main.c:114
#define CKB_PRESET_PARAM(name, value)
Definition: ckb-anim.h:86
ckb_key * keys
Definition: ckb-anim.h:140
kiss_fft_cpx * inbuf
Definition: main.c:39
#define CKB_PARAM_BOOL(name, text, default)
Definition: ckb-anim.h:76
void ckb_alpha_blend(ckb_key *key, float a, float r, float g, float b)
Definition: ckb-anim.h:283
unsigned width
Definition: ckb-anim.h:143
void ckb_grad_color(float *a, float *r, float *g, float *b, const ckb_gradient *grad, float pos)
Definition: ckb-anim.h:254