{"action":"created","comment":{"url":"https://api.github.com/repos/mixxxdj/mixxx/pulls/comments/72908868","id":72908868,"diff_hunk":"@@ -0,0 +1,718 @@\n+/************************  GPL v2 licence  *****************************\n+ * Reloop Beatmix controller script\n+ * Author: Sébastien Blaisot <sebastien@blaisot.org>\n+ *\n+ **********************************************************************\n+ * User References\n+ * ---------------\n+ * Wiki/manual : http://www.mixxx.org/wiki/doku.php/reloop_beatmix_4\n+ * support forum : http://mixxx.org/forums/viewtopic.php?f=7&t=8428\n+ *\n+ * Revision history\n+ * ----------------\n+ * 2016-07-31 - Initial revision for Mixxx 2.1.0\n+ ***********************************************************************\n+ *                           GPL v2 licence\n+ *                           --------------\n+ * Reloop Beatmix controller script script 1.0 for Mixxx 2.1.0\n+ * Copyright (C) 2015 Sébastien Blaisot\n+ *\n+ * This program is free software; you can redistribute it and/or\n+ * modify it under the terms of the GNU General Public License\n+ * as published by the Free Software Foundation; either version 2\n+ * of the License, or (at your option) any later version.\n+ *\n+ * This program is distributed in the hope that it will be useful,\n+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+ * GNU General Public License for more details.\n+ *\n+ * You should have received a copy of the GNU General Public License\n+ * along with this program; if not, write to the Free Software\n+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n+ ***********************************************************************/\n+////////////////////////////////////////////////////////////////////////\n+// JSHint configuration                                               //\n+////////////////////////////////////////////////////////////////////////\n+/* global engine                                                      */\n+/* global script                                                      */\n+/* global print                                                       */\n+/* global midi                                                        */\n+////////////////////////////////////////////////////////////////////////\n+// Global variables and declarations.\n+// ========================================================\n+var ReloopBeatmix24 = {};\n+\n+var RateRangeArray = [0.08, 0.10, 0.12, 0.16];\n+\n+// Timers\n+var jogWheelTimers = [];\n+var loadButtonTimers = [];\n+var loadButtonLongPressed = [];\n+var FxModeTimers = [];\n+var FxModeLongPressed = [];\n+\n+// A variable to store previous value of some connectControls\n+var previousValue = [];\n+\n+// Trax mode\n+// 1 for playlist mode\n+// 2 for track mode\n+// 3 for preview mode\n+var traxMode = 2;\n+\n+// Effects mode\n+// 1 for single effect mode (1 effect controlled in each EffectUnit)\n+// 2 for multi-effect mode (3 effects controlled in each EffectUnit)\n+// TODO(sblaisot): Define how to change mode from controller\n+var FxMode = 1; // Single effect mode by default\n+\n+var ON = 0x7F,\n+    OFF = 0x00,\n+    RED = 0x7F,\n+    BLUE = 0x55,\n+    VIOLET = 0x2A,\n+    SHIFT = 0x40,\n+    DOWN = 0x7F,\n+    UP = 0x00;\n+\n+// Initialise and shutdown stuff.\n+// ========================================================\n+ReloopBeatmix24.TurnLEDsOff = function() {\n+    // Turn all LEDS off\n+    var i, j;\n+    for (i = 0x91; i <= 0x94; i++) { // 4 decks\n+\n+        // Pads\n+        for (j = 0x00; j <= 0x0F; j++) {\n+            midi.sendShortMsg(i, j, OFF);\n+            midi.sendShortMsg(i, j + SHIFT, OFF);\n+        }\n+        for (j = 0x10; j <= 0x1F; j++) {\n+            midi.sendShortMsg(i, j, OFF);\n+        }\n+\n+        // Play/cue/cup/sync/pitch bend\n+        for (j = 0x20; j <= 0x25; j++) {\n+            midi.sendShortMsg(i, j, OFF);\n+            midi.sendShortMsg(i, j + SHIFT, OFF);\n+        }\n+\n+        // Jog Wheel leds\n+        ReloopBeatmix24.AllJogLEDsToggle(i, OFF);\n+\n+        // Load + Cue\n+        midi.sendShortMsg(i, 0x50, OFF);\n+        midi.sendShortMsg(i, 0x52, OFF);\n+        midi.sendShortMsg(i, 0x72, OFF);\n+    }\n+};\n+\n+ReloopBeatmix24.connectControls = function(disconnect) {\n+\n+    // Channels controls\n+    for (var i = 1; i <= 4; i++) {\n+        engine.connectControl(\"[Channel\" + i + \"]\", \"track_samples\",\n+            \"ReloopBeatmix24.deckloaded\", disconnect);\n+        engine.connectControl(\"[Channel\" + i + \"]\", \"play\",\n+            \"ReloopBeatmix24.startJogLedSpinnie\", disconnect);\n+        engine.connectControl(\"[Channel\" + i + \"]\", \"loop_end_position\",\n+            \"ReloopBeatmix24.loopDefined\", disconnect);\n+        engine.softTakeover(\"[Channel\" + i + \"]\", \"rate\", disconnect ?\n+            false : true);\n+        engine.setValue(\"[EffectRack1_EffectUnit1]\", \"group_[Channel\" + i +\n+            \"]_enable\", 0);\n+        engine.setValue(\"[EffectRack1_EffectUnit2]\", \"group_[Channel\" + i +\n+            \"]_enable\", 0);\n+    }\n+\n+    // Samplers controls\n+    for (i = 1; i <= 8; i++) {\n+        engine.connectControl(\"[Sampler\" + i + \"]\", \"track_samples\",\n+            \"ReloopBeatmix24.deckloaded\", disconnect);\n+        engine.connectControl(\"[Sampler\" + i + \"]\", \"play\",\n+            \"ReloopBeatmix24.SamplerPlay\", disconnect);\n+    }\n+\n+    // Effects reset\n+    engine.setValue(\"[EffectRack1_EffectUnit1]\", \"group_[Master]_enable\", 0);\n+    engine.setValue(\"[EffectRack1_EffectUnit2]\", \"group_[Master]_enable\", 0);\n+};\n+\n+ReloopBeatmix24.init = function(id, debug) {\n+    ReloopBeatmix24.id = id;\n+    ReloopBeatmix24.TurnLEDsOff(); // Turn off all LEDs\n+    ReloopBeatmix24.connectControls(false);\n+\n+    for (var i = 1; i <= 4; i++) {\n+        engine.trigger(\"[Channel\" + i + \"]\", \"loop_end_position\");\n+    }\n+\n+    print(\"Reloop Beatmix: \" + id + \" initialized.\");\n+};\n+\n+ReloopBeatmix24.shutdown = function() {\n+    ReloopBeatmix24.TurnLEDsOff(); // Turn off all LEDs\n+    ReloopBeatmix24.connectControls(true);\n+    print(\"Reloop Beatmix: \" + ReloopBeatmix24.id + \" shut down.\");\n+};\n+\n+// Button functions.\n+// ========================================================\n+ReloopBeatmix24.GetNextRange = function(OV) {\n+    var len = RateRangeArray.length;\n+    var pos = RateRangeArray.indexOf(OV);\n+    // If OV is not found in the array, pos == -1 and (pos+1) == 0,\n+    // so this function will return the first element\n+    return RateRangeArray[(pos + 1) % len];\n+};\n+\n+ReloopBeatmix24.Range = function(channel, control, value, status, group) {\n+    if (value === DOWN) {\n+        var oldvalue = engine.getValue(group, \"rateRange\");\n+        engine.setValue(group, \"rateRange\", ReloopBeatmix24.GetNextRange(\n+            oldvalue));\n+        engine.softTakeoverIgnoreNextValue(group, \"rate\");\n+    }\n+};\n+\n+ReloopBeatmix24.MasterSync = function(channel, control, value, status, group) {\n+    if (value === DOWN) {\n+        engine.setValue(group, \"sync_enabled\",\n+            engine.getValue(group, \"sync_enabled\") ? 0 : 1);\n+    }\n+};\n+\n+ReloopBeatmix24.LoopSet = function(channel, control, value, status, group) {\n+    if (value === DOWN) {\n+        engine.setValue(group, \"loop_in\", 1);\n+    } else {\n+        engine.setValue(group, \"loop_out\", 1);\n+    }\n+};\n+\n+ReloopBeatmix24.PitchSlider = function(channel, control, value, status, group) {\n+    engine.setValue(group, \"rate\", -script.pitch(control, value, status));\n+};\n+\n+// Trax navigation functions\n+// ========================================================\n+ReloopBeatmix24.traxSelect = function(value, step) {\n+    switch (traxMode) {\n+        case 1: // Playlist mode\n+            var i, j;\n+            for (i = 0; i < Math.abs(value); i++) {\n+                for (j = 0; j < step; j++) {\n+                    if (value < 0) {\n+                        engine.setValue(\"[Playlist]\", \"SelectPrevPlaylist\",\n+                            true);\n+                    } else {\n+                        engine.setValue(\"[Playlist]\", \"SelectNextPlaylist\",\n+                            true);\n+                    }\n+                }\n+            }\n+            break;\n+        case 2: // Track mode\n+            engine.setValue(\"[Playlist]\", \"SelectTrackKnob\", value * step);\n+            break;\n+        case 3: // Preview mode\n+            engine.setValue(\"[PreviewDeck1]\", \"playposition\", Math.max(0,\n+                Math.min(1, engine.getValue(\"[PreviewDeck1]\",\n+                    \"playposition\") + 0.02 * value * step)));\n+            break;\n+    }\n+};\n+\n+ReloopBeatmix24.TraxTurn = function(channel, control, value, status, group) {\n+    ReloopBeatmix24.traxSelect(value - 0x40, 1);\n+};\n+\n+ReloopBeatmix24.ShiftTraxTurn = function(channel, control, value, status, group) {\n+    ReloopBeatmix24.traxSelect(value - 0x40, 10);\n+};\n+\n+ReloopBeatmix24.TraxPush = function(channel, control, value, status, group) {\n+    switch (traxMode) {\n+        case 1: // Playlist mode\n+            engine.setValue(\"[Playlist]\", \"ToggleSelectedSidebarItem\",\n+                value);\n+            break;\n+        case 2: // Track mode\n+            engine.setValue(\"[PreviewDeck1]\", \"LoadSelectedTrackAndPlay\",\n+                value);\n+            traxMode = 3;\n+            break;\n+        case 3: // Preview mode\n+            if (value == DOWN) {\n+                engine.setValue(\"[PreviewDeck1]\", \"play\",\n+                    engine.getValue(\"[PreviewDeck1]\", \"play\") ? 0 : 1);\n+            }\n+            break;\n+    }\n+};\n+\n+ReloopBeatmix24.ShiftTraxPush = function(channel, control, value, status, group) {\n+    ReloopBeatmix24.TraxPush(channel, control, value, status, group);\n+};\n+\n+ReloopBeatmix24.BackButton = function(channel, control, value, status, group) {\n+    if (value === DOWN) {\n+        switch (traxMode) {\n+            case 1: // Playlist mode\n+                traxMode = 2; // Switch to track mode\n+                break;\n+            case 2: // Track mode\n+                traxMode = 1; // Switch to playlist mode\n+                break;\n+            case 3: // Preview mode\n+                traxMode = 2; // Switch to track mode\n+                break;\n+        }\n+    }\n+};\n+\n+ReloopBeatmix24.LoadButtonEject = function(group) {\n+    loadButtonLongPressed[group] = true;\n+    engine.setValue(group, \"eject\", 1);\n+    delete loadButtonTimers[group];\n+};\n+\n+ReloopBeatmix24.LoadButton = function(channel, control, value, status, group) {\n+    if (value === DOWN) {\n+        loadButtonLongPressed[group] = false;\n+        loadButtonTimers[group] = engine.beginTimer(1000,\n+            \"ReloopBeatmix24.LoadButtonEject(\\\"\" + group + \"\\\")\", true);\n+    } else { // UP\n+        if (!loadButtonLongPressed[group]) {\n+            engine.stopTimer(loadButtonTimers[group]);\n+            delete loadButtonTimers[group];\n+            engine.setValue(group, \"LoadSelectedTrack\", 1);\n+        } else {\n+            // Nothing to do, action already done in timer callback function\n+            loadButtonLongPressed[group] = false;\n+        }\n+    }\n+};\n+\n+// Sampler functions\n+// ========================================================\n+ReloopBeatmix24.SamplerPad = function(channel, control, value, status, group) {\n+    if (value === DOWN) {\n+        if (engine.getValue(group, \"track_samples\")) { //Sampler loaded (playing or not)\n+            engine.setValue(group, \"cue_gotoandplay\", 1);\n+        } else {\n+            engine.setValue(group, \"LoadSelectedTrack\", 1);\n+        }\n+    }\n+};\n+\n+ReloopBeatmix24.ShiftSamplerPad = function(channel, control, value, status, group) {\n+    if (value === DOWN) {\n+        if (engine.getValue(group, \"track_samples\")) { //Sampler loaded (playing or not)\n+            if (engine.getValue(group, \"play\")) { // Sampler is playing\n+                engine.setValue(group, \"cue_gotoandstop\", 1);\n+            } else {\n+                engine.setValue(group, \"eject\", 1);\n+            }\n+        } else {\n+            engine.setValue(group, \"LoadSelectedTrack\", 1);\n+        }\n+    }\n+};\n+\n+ReloopBeatmix24.SamplerVol = function(channel, control, value, status, group) {\n+    for (var i = 1; i <= engine.getValue(\"[Master]\", \"num_samplers\"); i++) {\n+        engine.setValue(\"[Sampler\" + i + \"]\", \"volume\", value / 127.0);\n+    }\n+};\n+\n+// Jog Wheel functions\n+// ========================================================\n+\n+ReloopBeatmix24.WheelTouch = function(channel, control, value, status, group) {\n+    var deck = parseInt(group.substr(8, 1), 10);\n+    if (value === DOWN) {\n+        var alpha = 1.0 / 8;\n+        var beta = alpha / 32;\n+        engine.scratchEnable(deck, 1600, 33 + 1 / 3, alpha, beta);\n+    } else {\n+        engine.scratchDisable(deck);\n+    }\n+};\n+\n+ReloopBeatmix24.WheelTurn = function(channel, control, value, status, group) {\n+    var newValue = value - 64;\n+    var deck = parseInt(group.substr(8, 1), 10);\n+\n+    // In either case, register the movement\n+    if (engine.isScratching(deck)) {\n+        engine.scratchTick(deck, newValue); // Scratch!\n+    } else {\n+        engine.setValue(group, 'jog', newValue); // Pitch bend\n+    }\n+};\n+\n+// Led Feedback functions\n+// ========================================================\n+ReloopBeatmix24.AllJogLEDsToggle = function(deck, state, step) {\n+    var step = typeof step !== 'undefined' ? step : 1; // default value\n+    for (var j = 0x30; j <= 0x3F; j += step) {\n+        midi.sendShortMsg(deck, j, state);\n+    }\n+};\n+\n+ReloopBeatmix24.deckloaded = function(value, group, control) {","path":"res/controllers/Reloop-Beatmix-2-4-scripts.js","position":365,"original_position":365,"commit_id":"6918da66734ce68f947c7e91c3d1781b4bb8ad57","original_commit_id":"6918da66734ce68f947c7e91c3d1781b4bb8ad57","user":{"login":"Be-ing","id":9455094,"avatar_url":"https://avatars.githubusercontent.com/u/9455094?v=3","gravatar_id":"","url":"https://api.github.com/users/Be-ing","html_url":"https://github.com/Be-ing","followers_url":"https://api.github.com/users/Be-ing/followers","following_url":"https://api.github.com/users/Be-ing/following{/other_user}","gists_url":"https://api.github.com/users/Be-ing/gists{/gist_id}","starred_url":"https://api.github.com/users/Be-ing/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Be-ing/subscriptions","organizations_url":"https://api.github.com/users/Be-ing/orgs","repos_url":"https://api.github.com/users/Be-ing/repos","events_url":"https://api.github.com/users/Be-ing/events{/privacy}","received_events_url":"https://api.github.com/users/Be-ing/received_events","type":"User","site_admin":false},"body":"Use camelCase (\"deckLoaded\") for consistency","created_at":"2016-07-31T18:55:18Z","updated_at":"2016-07-31T18:55:18Z","html_url":"https://github.com/mixxxdj/mixxx/pull/987#discussion_r72908868","pull_request_url":"https://api.github.com/repos/mixxxdj/mixxx/pulls/987","_links":{"self":{"href":"https://api.github.com/repos/mixxxdj/mixxx/pulls/comments/72908868"},"html":{"href":"https://github.com/mixxxdj/mixxx/pull/987#discussion_r72908868"},"pull_request":{"href":"https://api.github.com/repos/mixxxdj/mixxx/pulls/987"}}},"pull_request":{"url":"https://api.github.com/repos/mixxxdj/mixxx/pulls/987","id":79269210,"html_url":"https://github.com/mixxxdj/mixxx/pull/987","diff_url":"https://github.com/mixxxdj/mixxx/pull/987.diff","patch_url":"https://github.com/mixxxdj/mixxx/pull/987.patch","issue_url":"https://api.github.com/repos/mixxxdj/mixxx/issues/987","number":987,"state":"open","locked":false,"title":"(Controllers) Add Reloop Beatmix 2/4 mapping","user":{"login":"sblaisot","id":2768193,"avatar_url":"https://avatars.githubusercontent.com/u/2768193?v=3","gravatar_id":"","url":"https://api.github.com/users/sblaisot","html_url":"https://github.com/sblaisot","followers_url":"https://api.github.com/users/sblaisot/followers","following_url":"https://api.github.com/users/sblaisot/following{/other_user}","gists_url":"https://api.github.com/users/sblaisot/gists{/gist_id}","starred_url":"https://api.github.com/users/sblaisot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sblaisot/subscriptions","organizations_url":"https://api.github.com/users/sblaisot/orgs","repos_url":"https://api.github.com/users/sblaisot/repos","events_url":"https://api.github.com/users/sblaisot/events{/privacy}","received_events_url":"https://api.github.com/users/sblaisot/received_events","type":"User","site_admin":false},"body":"This PR adds mapping for Reloop Beatmix 2 and Reloop Beatmix 4 controllers (these are the same except the first is 2-channel when the second is 4-channel, but they share the same midi map).\r\n\r\nForum: http://mixxx.org/forums/viewtopic.php?f=7&t=8428\r\nWiki: http://mixxx.org/wiki/doku.php/reloop_beatmix_2 and http://mixxx.org/wiki/doku.php/reloop_beatmix_4","created_at":"2016-07-28T21:10:47Z","updated_at":"2016-07-31T18:55:18Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a2eedc05fe587511888e8be7b7eae2b7f67622c8","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/mixxxdj/mixxx/pulls/987/commits","review_comments_url":"https://api.github.com/repos/mixxxdj/mixxx/pulls/987/comments","review_comment_url":"https://api.github.com/repos/mixxxdj/mixxx/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mixxxdj/mixxx/issues/987/comments","statuses_url":"https://api.github.com/repos/mixxxdj/mixxx/statuses/6918da66734ce68f947c7e91c3d1781b4bb8ad57","head":{"label":"sblaisot:Reloop_Beatmix_4","ref":"Reloop_Beatmix_4","sha":"6918da66734ce68f947c7e91c3d1781b4bb8ad57","user":{"login":"sblaisot","id":2768193,"avatar_url":"https://avatars.githubusercontent.com/u/2768193?v=3","gravatar_id":"","url":"https://api.github.com/users/sblaisot","html_url":"https://github.com/sblaisot","followers_url":"https://api.github.com/users/sblaisot/followers","following_url":"https://api.github.com/users/sblaisot/following{/other_user}","gists_url":"https://api.github.com/users/sblaisot/gists{/gist_id}","starred_url":"https://api.github.com/users/sblaisot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sblaisot/subscriptions","organizations_url":"https://api.github.com/users/sblaisot/orgs","repos_url":"https://api.github.com/users/sblaisot/repos","events_url":"https://api.github.com/users/sblaisot/events{/privacy}","received_events_url":"https://api.github.com/users/sblaisot/received_events","type":"User","site_admin":false},"repo":{"id":35908152,"name":"mixxx","full_name":"sblaisot/mixxx","owner":{"login":"sblaisot","id":2768193,"avatar_url":"https://avatars.githubusercontent.com/u/2768193?v=3","gravatar_id":"","url":"https://api.github.com/users/sblaisot","html_url":"https://github.com/sblaisot","followers_url":"https://api.github.com/users/sblaisot/followers","following_url":"https://api.github.com/users/sblaisot/following{/other_user}","gists_url":"https://api.github.com/users/sblaisot/gists{/gist_id}","starred_url":"https://api.github.com/users/sblaisot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sblaisot/subscriptions","organizations_url":"https://api.github.com/users/sblaisot/orgs","repos_url":"https://api.github.com/users/sblaisot/repos","events_url":"https://api.github.com/users/sblaisot/events{/privacy}","received_events_url":"https://api.github.com/users/sblaisot/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/sblaisot/mixxx","description":"Mixxx is Free DJ software that gives you everything you need to perform live mixes.","fork":true,"url":"https://api.github.com/repos/sblaisot/mixxx","forks_url":"https://api.github.com/repos/sblaisot/mixxx/forks","keys_url":"https://api.github.com/repos/sblaisot/mixxx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sblaisot/mixxx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sblaisot/mixxx/teams","hooks_url":"https://api.github.com/repos/sblaisot/mixxx/hooks","issue_events_url":"https://api.github.com/repos/sblaisot/mixxx/issues/events{/number}","events_url":"https://api.github.com/repos/sblaisot/mixxx/events","assignees_url":"https://api.github.com/repos/sblaisot/mixxx/assignees{/user}","branches_url":"https://api.github.com/repos/sblaisot/mixxx/branches{/branch}","tags_url":"https://api.github.com/repos/sblaisot/mixxx/tags","blobs_url":"https://api.github.com/repos/sblaisot/mixxx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sblaisot/mixxx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sblaisot/mixxx/git/refs{/sha}","trees_url":"https://api.github.com/repos/sblaisot/mixxx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sblaisot/mixxx/statuses/{sha}","languages_url":"https://api.github.com/repos/sblaisot/mixxx/languages","stargazers_url":"https://api.github.com/repos/sblaisot/mixxx/stargazers","contributors_url":"https://api.github.com/repos/sblaisot/mixxx/contributors","subscribers_url":"https://api.github.com/repos/sblaisot/mixxx/subscribers","subscription_url":"https://api.github.com/repos/sblaisot/mixxx/subscription","commits_url":"https://api.github.com/repos/sblaisot/mixxx/commits{/sha}","git_commits_url":"https://api.github.com/repos/sblaisot/mixxx/git/commits{/sha}","comments_url":"https://api.github.com/repos/sblaisot/mixxx/comments{/number}","issue_comment_url":"https://api.github.com/repos/sblaisot/mixxx/issues/comments{/number}","contents_url":"https://api.github.com/repos/sblaisot/mixxx/contents/{+path}","compare_url":"https://api.github.com/repos/sblaisot/mixxx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sblaisot/mixxx/merges","archive_url":"https://api.github.com/repos/sblaisot/mixxx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sblaisot/mixxx/downloads","issues_url":"https://api.github.com/repos/sblaisot/mixxx/issues{/number}","pulls_url":"https://api.github.com/repos/sblaisot/mixxx/pulls{/number}","milestones_url":"https://api.github.com/repos/sblaisot/mixxx/milestones{/number}","notifications_url":"https://api.github.com/repos/sblaisot/mixxx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sblaisot/mixxx/labels{/name}","releases_url":"https://api.github.com/repos/sblaisot/mixxx/releases{/id}","deployments_url":"https://api.github.com/repos/sblaisot/mixxx/deployments","created_at":"2015-05-19T20:57:48Z","updated_at":"2016-07-17T18:42:04Z","pushed_at":"2016-07-31T16:21:18Z","git_url":"git://github.com/sblaisot/mixxx.git","ssh_url":"git@github.com:sblaisot/mixxx.git","clone_url":"https://github.com/sblaisot/mixxx.git","svn_url":"https://github.com/sblaisot/mixxx","homepage":"http://mixxx.org","size":258673,"stargazers_count":0,"watchers_count":0,"language":"TypeScript","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"mixxxdj:master","ref":"master","sha":"d8af11dcc178033a9dd5e6947f2ff91086e88d97","user":{"login":"mixxxdj","id":1743769,"avatar_url":"https://avatars.githubusercontent.com/u/1743769?v=3","gravatar_id":"","url":"https://api.github.com/users/mixxxdj","html_url":"https://github.com/mixxxdj","followers_url":"https://api.github.com/users/mixxxdj/followers","following_url":"https://api.github.com/users/mixxxdj/following{/other_user}","gists_url":"https://api.github.com/users/mixxxdj/gists{/gist_id}","starred_url":"https://api.github.com/users/mixxxdj/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mixxxdj/subscriptions","organizations_url":"https://api.github.com/users/mixxxdj/orgs","repos_url":"https://api.github.com/users/mixxxdj/repos","events_url":"https://api.github.com/users/mixxxdj/events{/privacy}","received_events_url":"https://api.github.com/users/mixxxdj/received_events","type":"Organization","site_admin":false},"repo":{"id":10126031,"name":"mixxx","full_name":"mixxxdj/mixxx","owner":{"login":"mixxxdj","id":1743769,"avatar_url":"https://avatars.githubusercontent.com/u/1743769?v=3","gravatar_id":"","url":"https://api.github.com/users/mixxxdj","html_url":"https://github.com/mixxxdj","followers_url":"https://api.github.com/users/mixxxdj/followers","following_url":"https://api.github.com/users/mixxxdj/following{/other_user}","gists_url":"https://api.github.com/users/mixxxdj/gists{/gist_id}","starred_url":"https://api.github.com/users/mixxxdj/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mixxxdj/subscriptions","organizations_url":"https://api.github.com/users/mixxxdj/orgs","repos_url":"https://api.github.com/users/mixxxdj/repos","events_url":"https://api.github.com/users/mixxxdj/events{/privacy}","received_events_url":"https://api.github.com/users/mixxxdj/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mixxxdj/mixxx","description":"Mixxx is Free DJ software that gives you everything you need to perform live mixes.","fork":false,"url":"https://api.github.com/repos/mixxxdj/mixxx","forks_url":"https://api.github.com/repos/mixxxdj/mixxx/forks","keys_url":"https://api.github.com/repos/mixxxdj/mixxx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mixxxdj/mixxx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mixxxdj/mixxx/teams","hooks_url":"https://api.github.com/repos/mixxxdj/mixxx/hooks","issue_events_url":"https://api.github.com/repos/mixxxdj/mixxx/issues/events{/number}","events_url":"https://api.github.com/repos/mixxxdj/mixxx/events","assignees_url":"https://api.github.com/repos/mixxxdj/mixxx/assignees{/user}","branches_url":"https://api.github.com/repos/mixxxdj/mixxx/branches{/branch}","tags_url":"https://api.github.com/repos/mixxxdj/mixxx/tags","blobs_url":"https://api.github.com/repos/mixxxdj/mixxx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mixxxdj/mixxx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mixxxdj/mixxx/git/refs{/sha}","trees_url":"https://api.github.com/repos/mixxxdj/mixxx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mixxxdj/mixxx/statuses/{sha}","languages_url":"https://api.github.com/repos/mixxxdj/mixxx/languages","stargazers_url":"https://api.github.com/repos/mixxxdj/mixxx/stargazers","contributors_url":"https://api.github.com/repos/mixxxdj/mixxx/contributors","subscribers_url":"https://api.github.com/repos/mixxxdj/mixxx/subscribers","subscription_url":"https://api.github.com/repos/mixxxdj/mixxx/subscription","commits_url":"https://api.github.com/repos/mixxxdj/mixxx/commits{/sha}","git_commits_url":"https://api.github.com/repos/mixxxdj/mixxx/git/commits{/sha}","comments_url":"https://api.github.com/repos/mixxxdj/mixxx/comments{/number}","issue_comment_url":"https://api.github.com/repos/mixxxdj/mixxx/issues/comments{/number}","contents_url":"https://api.github.com/repos/mixxxdj/mixxx/contents/{+path}","compare_url":"https://api.github.com/repos/mixxxdj/mixxx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mixxxdj/mixxx/merges","archive_url":"https://api.github.com/repos/mixxxdj/mixxx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mixxxdj/mixxx/downloads","issues_url":"https://api.github.com/repos/mixxxdj/mixxx/issues{/number}","pulls_url":"https://api.github.com/repos/mixxxdj/mixxx/pulls{/number}","milestones_url":"https://api.github.com/repos/mixxxdj/mixxx/milestones{/number}","notifications_url":"https://api.github.com/repos/mixxxdj/mixxx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mixxxdj/mixxx/labels{/name}","releases_url":"https://api.github.com/repos/mixxxdj/mixxx/releases{/id}","deployments_url":"https://api.github.com/repos/mixxxdj/mixxx/deployments","created_at":"2013-05-17T15:14:38Z","updated_at":"2016-07-31T11:12:22Z","pushed_at":"2016-07-31T17:30:33Z","git_url":"git://github.com/mixxxdj/mixxx.git","ssh_url":"git@github.com:mixxxdj/mixxx.git","clone_url":"https://github.com/mixxxdj/mixxx.git","svn_url":"https://github.com/mixxxdj/mixxx","homepage":"http://mixxx.org","size":276234,"stargazers_count":561,"watchers_count":561,"language":"TypeScript","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":339,"mirror_url":null,"open_issues_count":67,"forks":339,"open_issues":67,"watchers":561,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mixxxdj/mixxx/pulls/987"},"html":{"href":"https://github.com/mixxxdj/mixxx/pull/987"},"issue":{"href":"https://api.github.com/repos/mixxxdj/mixxx/issues/987"},"comments":{"href":"https://api.github.com/repos/mixxxdj/mixxx/issues/987/comments"},"review_comments":{"href":"https://api.github.com/repos/mixxxdj/mixxx/pulls/987/comments"},"review_comment":{"href":"https://api.github.com/repos/mixxxdj/mixxx/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mixxxdj/mixxx/pulls/987/commits"},"statuses":{"href":"https://api.github.com/repos/mixxxdj/mixxx/statuses/6918da66734ce68f947c7e91c3d1781b4bb8ad57"}}}}
{"actor":{"display_login":"Be-ing"}}