Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Repo info
Activity
  • Jun 11 03:19

    brunchboy on master

    Update to link to netlify hoste… (compare)

  • Jun 11 03:01

    brunchboy on master

    Update doc readme to reflect us… (compare)

  • Jun 10 21:40

    brunchboy on master

    Fix typo in function name. (compare)

  • Jun 10 21:18

    brunchboy on master

    Remove insecure HTTP link, than… Try simplifying API doc path, u… (compare)

  • Jun 10 20:48

    brunchboy on master

    Working on netlify doc build. (compare)

  • Jun 10 20:27

    brunchboy on master

    Update Clojure version. Update Codox version. Try setting up Netlify build fo… (compare)

  • May 27 18:14
    brunchboy edited #70
  • May 27 18:12
    brunchboy edited #70
  • May 27 18:12
    brunchboy labeled #70
  • May 27 18:12
    brunchboy opened #70
  • May 22 05:21
    brunchboy closed #69
  • May 22 05:21

    brunchboy on master

    Update jquery.mincolors color p… Start wedding reception show. (compare)

  • May 22 01:44
    brunchboy opened #69
  • May 22 01:42
    brunchboy closed #23
  • May 22 01:41
    brunchboy closed #65
  • Apr 29 21:08

    brunchboy on master

    Fix more broken images due to w… (compare)

  • Apr 29 21:03

    brunchboy on master

    Fix more broken images due to w… (compare)

  • Apr 29 20:56

    brunchboy on master

    Try without line break? (Older … (compare)

  • Apr 29 20:53

    brunchboy on master

    Fix image macro with comma in a… (compare)

  • Apr 29 07:07

    brunchboy on master

    Make guide base URL independent… (compare)

Moritz Bust
@Busti
Tell me what you think...
Moritz Bust
@Busti
The idea was to implement the UI in Javascript, possibly using svg's for displaying the graphics.
So this might be interesting to you as well @awwright
James Elliott
@brunchboy
Sorry it took me a while to respond, things are very busy with an office move at my day job, but this does look like a great concept, very similar to the ideas which led me to write Afterglow. Have you ever worked with Processing or Max/MSP? They might offer you a nice environment for hosting your visual programming, without having to do all the hard work of creating that from scratch. I even built a plugin that lets people host Afterglow in Max/MSP, https://cycling74.com/tools/afterglow-max-control-light-shows-max/
I look forward to seeing where you take this! Would you like pull requests to help with typos when I have a little time? (They did not cause problems with understanding the meaning of your ideas, though!)
And I definitely plan to add an audio analysis input to Afterglow someday. I have investigated a few DSP libraries, but have been so busy with the Pioneer integration that I have not had spare time (in my spare time project) to pursue that in any depth.
Austin Wright
@awwright
@brunchboy One of my other favorite parts of the DBServer protocol is some of the fields for strings are proceeded by a "length" uint field -- even though the string type already includes the length into its encoding
Also, for generic DJ players besides Pioneer's stuff, even vinyl, I've wanted to integrate an audio ID algorithm so I can compute which track is playing and where in the track it is
which is pretty tricky, most audio ID algorithms don't match time stretch or anything that changes the pitch
One of my friends is working his dissertation on some sort of protocol that can recursively describe music, lighting or other sequences of data on a time domain (I hope I'm not getting that summary too wrong). And then it can predict into the future where it might go, so you can sync tracks with negative latency (i.e. into the future, generate lighting effects for what's anticipated 200ms out)
Austin Wright
@awwright
@brunchboy Also idk if you saw the Wireshark protocol definition I wrote, but that should be very helpful
I don't know how to do it for TCP protocols though, the UI overall doesn't seem to allow for it
James Elliott
@brunchboy
Your friend’s dissertation sounds amazing! It will be cool to see what comes of that. And yes, I saw the places where there is a number field containing the length of the (artist name, track title, album name), followed by the string field which starts with a length indicator and also is null terminated. Straight from the department of redundancy department! :wink: And yes, I did see your Wireshark script, but haven’t tried playing with it yet as I have been focused only on the TCP dbserver protocol so far. I have so much to implement based on what you shared, I am not getting enough sleep!
Austin Wright
@awwright
@brunchboy The USB/SD status doesn't just alternate between 4 and 6, it's actually showing the status of the lamp (on or off). Notice how related buttons on the CDJ and DJM blink synchronously.
Moritz Bust
@Busti
@brunchboy I wanted to develop such a graphics framework for another Project anyways and a Project like this is a good way to develop it while being able to easily test it, which would be way harder in the other project I want to use visual programming in.
I had closer looks at other frameworks before, but the problem that always emerged was that they are frameworks and that I need a library at most.
There also is noflojs (https://noflojs.org/) for example, but it is way to complicated already. It compiles to javascript and basically is a programming language as is.
I gotta try your MAX/MSP Plugin though, it looks really interesting.
The key feature of the thing I want to develop is probably that it visualizes the data while it is running in the editor itself.
Moritz Bust
@Busti
Regarding Real time beat recognition...
I contacted the developer of BPMDJ (http://bpmdj.yellowcouch.org/) and he stated that he would be interested in creating / providing a sophisticated java BPM Recognition library, since he only would have to make slight changes to his code for it to work in real time.
Austin Wright
@awwright
@Busti Very interesting
James Elliott
@brunchboy
Yeah, @awwright, I speculated in the protocol analysis document that the 4/6 alternation may be at the same time as the flashing of the status light, but I haven’t brought my laptop into the same room as the CDJs to try to prove that, as it hasn’t been all that important for the kind of things I want to do with the protocol, and my big monitors are in a different room than my DJ setup. :grimacing:
I just added a bunch of detail about the dbserver packets to section 5 (and didn’t get nearly enough sleep last night). This weekend I am eager to start implementing this stuff in the beat-link library, so I can start generating real time code in beat-link-trigger (and saving cached metadata for whole playlists and memory sticks, so it can be used even when shows are running with a full set of four CDJs), and hopefully even figure out how to actually draw the waveforms.
@Busti that is great news, I would definitely love to have access to a library like that.
James Elliott
@brunchboy
Yes, my waveforms are definitely in a different format than you describe, @awwright, and I suspect that is because they were saved as color waveforms. Here is what the 900 bytes of the waveform from one of my tracks look like when drawn using the algorithm you described, sitting above how rekordbox draws it: waveforms
That is the waveform summary, which for you is 300 bytes, right? So we need to figure out how to interpret the extra color information. Here are the actual bytes of the waveform blob:
blob: 02 05 02 05 02 05 02 05 02 05 02 05 02 04 02 04 02 05 02 05 02 04 03 04 04 05 02 05 04 04 05 04 03 04 02 04 04 04 02 04 03 04 02 04 03 04 03 04 03 04 04 04 04 04 02 04 04 04 03 04 02 05 03 05 02 04 04 04 03 04 04 04 05 04 04 04 04 04 06 04 06 04 09 04 06 04 06 04 09 04 06 04 05 04 05 04 09 04 0d 04 08 04 09 04 08 00 0c 00 0d 03 16 03 12 03 15 03 18 03 18 03 16 03 11 03 17 03 16 03 13 03 15 03 16 03 10 03 18 03 18 03 18 02 18 02 13 01 13 01 18 03 19 03 10 03 16 03 13 03 15 03 18 02 18 02 16 03 13 03 17 03 18 03 16 03 14 03 18 03 19 03 19 03 19 03 19 03 19 03 0d 05 0d 05 17 03 17 03 18 03 18 03 0f 05 02 05 16 03 17 03 18 03 13 03 14 03 11 03 16 03 18 03 19 03 19 03 15 05 16 05 17 03 18 03 09 05 0a 05 11 03 16 03 19 02 17 02 19 03 19 03 19 03 19 03 18 03 11 03 14 03 10 03 16 03 18 03 19 03 19 03 12 05 17 05 0c 05 0f 05 17 03 14 03 11 03 16 03 19 00 18 00 0c 05 05 05 16 03 16 03 17 03 17 03 13 03 12 03 0d 05 0c 05 19 03 19 03 12 05 17 05 0c 05 0f 05 17 03 13 03 12 03 16 03 19 03 16 03 19 03 19 03 17 03 16 03 08 03 17 03 13 03 11 03 16 03 18 03 17 03 17 03 18 03 19 03 0f 05 0c 05 17 03 16 03 11 03 14 03 19 00 18 00 19 02 15 02 16 03 18 03 19 02 16 02 18 02 19 02 13 02 18 02 16 03 18 03 18 03 18 03 18 03 17 03 19 03 18 03 19 03 17 03 17 03 17 03 0f 05 0c 05 18 03 15 03 17 03 17 03 0d 05 0f 05 17 03 17 03 19 03 17 03 17 03 17 03 0b 05 0f 05 19 03 19 03 19 00 19 00 19 03 19 03 0c 05 0f 05 17 03 15 03 17 03 17 03 0d 05 0f 05 19 03 18 03 19 03 17 03 18 03 18 03 18 03 11 03 19 02 19 02 19 00 19 00 19 03 19 03 08 05 09 05 0b 05 0a 05 0c 05 09 05 0b 05 09 05 15 05 0b 05 14 05 0f 05 0b 05 09 05 0e 05 0e 05 13 04 0e 04 12 04 14 04 0e 05 12 05 17 03 16 03 17 00 11 00 16 01 13 01 17 00 18 00 14 00 16 00 16 03 16 03 17 00 14 00 15 03 17 03 13 00 16 00 16 04 12 04 12 03 17 03 11 03 16 03 16 03 15 03 18 02 18 02 16 03 14 03 18 03 19 03 11 03 16 03 18 03 18 03 13 02 16 02 16 01 13 01 18 02 18 02 14 03 16 03 18 03 19 03 16 03 14 03 18 02 18 02 14 03 16 03 18 03 18 03 18 02 19 02 19 00 19 00 19 03 18 03 19 03 19 03 18 02 19 02 12 05 03 05 17 02 17 02 14 03 15 03 18 03 18 03 0f 05 0d 05 19 03 19 03 16 03 11 03 19 03 19 03 12 03 18 03 17 03 17 03 16 00 17 00 18 03 16 03 17 00 18 00 14 03 12 03 17 03 17 03 0c 05 0f 05 19 03 19 03 10 01 16 01 19 02 19 02 12 00 18 00 17 03 16 03 0f 04 0c 04 0e 05 0b 05 12 05 15 05 15 03 17 03 18 03 15 03 17 03 18 03 14 03 16 03 16 05 05 05 02 05 02 05 02 02 02 04 02 02 04 04 04 07 08 06 0b 0d 0e 0f 0d 0f 0e 0e 0f 0f 0f 0e 0d 0a 0d 0e 08 0d 0f 0e 0d 0e 0a 0f 0a 0d 0a 0c 0d 0f 0d 0a 0f 0a 0f 0f 0f 0f 0f 0f 0b 0d 0a 0e 0e 0f 0c 0a 0f 0e 0f 0f 02 06 07 08 09 0e 0d 0e 0c 0d 0c 0e 0c 0e 0e 0e 0e 0d 0f 0f 0f 0f 0d 0c 0e 0e 0c 0e 0a 0e 0f 0a 02 0d 0c 09 [waveform bytes]
James Elliott
@brunchboy
And finally, here is what the same waveform summary looks like on the CDJ display, so evidently it does know how to interpret it, even though (as an original nexus player) it refuses to show the colors: waveform on CDJ
James Elliott
@brunchboy
But strangely, I just tried with a track on an SD card that was still in the blue format, and that came back with 900 bytes of preview waveform, and the same kind of distortions, so it may be a difference in the firmware version of our players or something?
James Elliott
@brunchboy
Well, I got it figured out, but I can’t explain why @awwright’s seeing such very different results. For my CDJs, the waveform preview is 400 pixels wide, and the first 800 bytes returned by the CDJ are alternating height and whiteness bytes. I don’t know what the remaining 100 bytes are, perhaps color information, I will investigate that later. But when I ignore all but the high bit of the whiteness information (which is what the preview does on my players), the result I get matches the above photo: Fixed waveform display
Austin Wright
@awwright
@brunchboy I suspect there's a different command to retrieve an RGB waveform, is that something that might be the case?
James Elliott
@brunchboy
That might be, but since I don’t have any nexus 2 players, I won’t be able to sniff it out. We will have to wait until someone can report that. :smile: Are you getting two-byte-per-column, 400-pixel waveform summaries like I have described here, or are you getting the one-byte-per-column, 300-pixel versions you described? If so, what model of players and what firmware are you using? I am using the same request that was in dbstruct.js and seeing the results you see here. I am making huge progress in rewriting the beat-link library to use all this new knowledge, though! The code is getting shorter, more clear, much more understandable and robust, and can already do far more than it could before!
Austin Wright
@awwright
Hmm I'll have to take a look. I do recall the 400px summary being a slightly different format
James Elliott
@brunchboy
Yeah, anything you can share about the various preview and waveform formats and how to get them would be interesting. I need to figure out cue grids soon too.
Austin Wright
@awwright
All the stuff for decoding the hotcue/cuepoint and beatgrid stuff should be coded somewhere
Unlike the waveform where I think I coded that somewhere else
James Elliott
@brunchboy
Yeah, I got the beat grid down, I just haven’t tried the cue grid yet. I saw some stuff there, and I am hoping I will be able to figure out the difference between hot cues A, B, C, and ordinary memory point cues.
I’ve been on a bit of a detour to implement a nice metadata cache file system, for use in production environments where all four players are in use. That has come along very well.
Your code has been a huge treasure trove. It’s been very bad for my sleep schedule, though! I am going to go back in to work pretty tired tomorrow. ;^)
Austin Wright
@awwright
Heheh
I'm in Arizona, it's sunset right now
And yeah, for my lighting program I've got a button I hit to say "Create scene from loaded track" and it downloads/syncs all the waveform data
James Elliott
@brunchboy
Neat! I am spending so much time building these libraries and tools for other people to use I haven’t even had a chance to think about playing with this stuff in afterglow yet.
August
@Augusto__Solis_twitter
Hi guys, First you're doing a tremendous job. also i have a nexus 2 to play arround sometimes, I know almost nothing about code but this proyect blow my mind.
James Elliott
@brunchboy
Thanks, August! It is blowing my mind too, at the moment. I am not getting enough sleep, but soon there will be some really cool features for people to try out.
James Elliott
@brunchboy
All right, I have cue lists added to the packet analysis document and Beat Link library now. @awwright, you might be interested to take a look because I figured out how loops are represented and stored too. And were you able to find anything out about the different sizes and formats of waveform previews? I imagine they might use different requests and responses.
James Elliott
@brunchboy
And things are coming together! Here’s the Swing component Beat Link now offers for drawing track waveform previews, with minute marks, playback position, and cue markers: annotated waveform
James Elliott
@brunchboy
And the new player status interface in Beat Link Trigger is nearly done. It uses a ton of this new information! Player Status
Joen Tolgraven
@tolgraven
Hey, I want to thank you for this amazing software framework, proper legend. The fact that it's making me (ever so slowly) learn clojure is an awesome bonus, though it's sad (but not unexpected) that it keeps... basically everyone, I guess, from getting into it.
Joen Tolgraven
@tolgraven
Anyways, question. I'm (mainly) using it rather unorthodoxly, rendering ledstrips I've setup to receive artnet over wifi. Quickly realizing that doesn't scale too well, since even 600 or so pixels plus some regular fixtures means ~50% CPU usage on a water-cooled, overclocked 8-core i7. What steps, if any, might be available for me to make the rendering loop more efficient?
Looking forward to contribute properly to the project once my clojure is less shit! :smile:
James Elliott
@brunchboy
Hello Joen! I’m traveling at the moment so will respond more meaningfully later, but I am delighted to hear you are exploring the project. I have a few ideas, but I am not surprised the current code bogs down after a few hundred lights. Thanks for writing, and more to come!
Joen Tolgraven
@tolgraven
Aight! I’m gearing up something fierce haha, bought like 1500w worth of RGBW led fixtures off aliexpress, including a monster 400w moving head. Crazy what you get for a grand and change these days :O I use Live for music and already fairly into Max so planning on trying to get an entire ecosystem built ontop of your shit basically. Been thinking how like, oh I need to add buttons to solo and mute effects and on-push macros and ways to compose chases and and and, but then realising why reinvent the wheel, when can use Live to capture/modulate/sequence both afterglow state changes and resultant raw dmx output. What sort of stuff do you use the afterglow-max binding for?
James Elliott
@brunchboy
I love that you’re exploring this stuff! I built afterglow-max as a way to try to let people who are max patchers but who don’t know Clojure experiment with the software. I don’t think anyone actually ended up using that, though. A few people have built shows using afterglow itself, but it has such a steep learning curve that nobody has gone very deep yet.
I’ve been surprisingly busy (and caught an annoying virus) since traveling, so I’ve not been able to share the thoughts I was hoping to. I do think that to get good performance with 500+ pixels will require designing a slightly less flexible Show and Effect variant, so that less code is run on every frame, but which perhaps allows it to be compiled into OpenGL code that can be spread across a GPU. You could use the existing show and effect code for more complex lights, like moving heads, where you actually want to be able to do trigonometry and other fancy math on an arbitrary basis, and have the pixels handled more simply (and with brute speed) by the GPU-based show and effects, and tie the cues to each other.
Joen Tolgraven
@tolgraven
True! What I'm working on atm is a much more robust firmware on the ESP that doesn't just push straight pixel updates but has traditional DMX channels as well, like strobe, dimmer etc, and also keeps track of it's own state somewhat so can do basic sorta halogen emulation, or at least exposing the A and R in ADSR. And dithering.