├── .gitattributes
├── .gitignore
├── .vs
└── launchpad-dot-net
│ └── v14
│ └── .suo
├── README.md
├── launchpad-dot-net.sln
└── launchpad-dot-net
├── Interface.cs
├── Properties
└── AssemblyInfo.cs
├── bin
└── Debug
│ ├── Midi.dll
│ ├── launchpad-dot-net.dll
│ └── launchpad-dot-net.pdb
├── launchpad-dot-net.csproj
└── obj
└── Debug
├── DesignTimeResolveAssemblyReferencesInput.cache
├── launchpad-dot-net.csproj.FileListAbsolute.txt
├── launchpad-dot-net.csprojResolveAssemblyReference.cache
├── launchpad-dot-net.dll
└── launchpad-dot-net.pdb
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
4 | # Custom for Visual Studio
5 | *.cs diff=csharp
6 |
7 | # Standard to msysgit
8 | *.doc diff=astextplain
9 | *.DOC diff=astextplain
10 | *.docx diff=astextplain
11 | *.DOCX diff=astextplain
12 | *.dot diff=astextplain
13 | *.DOT diff=astextplain
14 | *.pdf diff=astextplain
15 | *.PDF diff=astextplain
16 | *.rtf diff=astextplain
17 | *.RTF diff=astextplain
18 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Windows image file caches
2 | Thumbs.db
3 | ehthumbs.db
4 |
5 | # Folder config file
6 | Desktop.ini
7 |
8 | # Recycle Bin used on file shares
9 | $RECYCLE.BIN/
10 |
11 | # Windows Installer files
12 | *.cab
13 | *.msi
14 | *.msm
15 | *.msp
16 |
17 | # Windows shortcuts
18 | *.lnk
19 |
20 | # =========================
21 | # Operating System Files
22 | # =========================
23 |
24 | # OSX
25 | # =========================
26 |
27 | .DS_Store
28 | .AppleDouble
29 | .LSOverride
30 |
31 | # Thumbnails
32 | ._*
33 |
34 | # Files that might appear in the root of a volume
35 | .DocumentRevisions-V100
36 | .fseventsd
37 | .Spotlight-V100
38 | .TemporaryItems
39 | .Trashes
40 | .VolumeIcon.icns
41 |
42 | # Directories potentially created on remote AFP share
43 | .AppleDB
44 | .AppleDesktop
45 | Network Trash Folder
46 | Temporary Items
47 | .apdisk
48 |
--------------------------------------------------------------------------------
/.vs/launchpad-dot-net/v14/.suo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iUltimateLP/launchpad-dot-net/4f56c2edc0b4b2263b46ca130c9868870ad4c999/.vs/launchpad-dot-net/v14/.suo
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Launchpad.NET
2 | *The easy way to create applications for the NOVATION Launchpad*
3 |
4 | **Welcome to LAUNCHPAD.NET**
5 | This is a simple C# library which allows you to interact with the NOVATION LAUNCHPAD.
6 | You can view the GitHub Wiki over here, in order to learn how the functions work together.
7 | This is only possible because of **jstnryan** and his https://github.com/jstnryan/midi-dot-net
8 |
9 | **Features**
10 | This comes with a few features right now, but I will extend this in the future!
11 | + Automatic MIDI Device sorting (you only see Launchpads, not other MIDI devices
12 | + Easy LED state setting (set LEDs only giving coordinates and velocity)
13 | + LED rect filling (with start and end coordinates)
14 | + Easy handling of Launchpads with a own class for Launchpad
15 | + Easy connecting / disconnecting
16 |
17 | **Bugs?**
18 | No problem, thats why GitHub is here. :joy:
19 |
--------------------------------------------------------------------------------
/launchpad-dot-net.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Express 14 for Windows Desktop
4 | VisualStudioVersion = 14.0.23107.0
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "launchpad-dot-net", "launchpad-dot-net\launchpad-dot-net.csproj", "{2784C4AF-3B96-471B-91B0-1A11C342D375}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Release|Any CPU = Release|Any CPU
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {2784C4AF-3B96-471B-91B0-1A11C342D375}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15 | {2784C4AF-3B96-471B-91B0-1A11C342D375}.Debug|Any CPU.Build.0 = Debug|Any CPU
16 | {2784C4AF-3B96-471B-91B0-1A11C342D375}.Release|Any CPU.ActiveCfg = Release|Any CPU
17 | {2784C4AF-3B96-471B-91B0-1A11C342D375}.Release|Any CPU.Build.0 = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | EndGlobal
23 |
--------------------------------------------------------------------------------
/launchpad-dot-net/Interface.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 | using Midi;
7 |
8 | namespace LaunchpadNET
9 | {
10 | public class Interface
11 | {
12 | private Pitch[,] notes = new Pitch[8, 8] {
13 | { Pitch.A5, Pitch.ASharp5, Pitch.B5, Pitch.C6, Pitch.CSharp6, Pitch.D6, Pitch.DSharp6, Pitch.E6 },
14 | { Pitch.B4, Pitch.C5, Pitch.CSharp5, Pitch.D5, Pitch.DSharp5, Pitch.E5, Pitch.F5, Pitch.FSharp5 },
15 | { Pitch.CSharp4, Pitch.D4, Pitch.DSharp4, Pitch.E4, Pitch.F4, Pitch.FSharp4, Pitch.G4, Pitch.GSharp4 },
16 | { Pitch.DSharp3, Pitch.E3, Pitch.F3, Pitch.FSharp3, Pitch.G3, Pitch.GSharp3, Pitch.A3, Pitch.ASharp3 },
17 | { Pitch.F2, Pitch.FSharp2, Pitch.G2, Pitch.GSharp2, Pitch.A2, Pitch.ASharp2, Pitch.B2, Pitch.C3 },
18 | { Pitch.G1, Pitch.GSharp1, Pitch.A1, Pitch.ASharp1, Pitch.B1, Pitch.C2, Pitch.CSharp2, Pitch.D2 },
19 | { Pitch.A0, Pitch.ASharp0, Pitch.B0, Pitch.C1, Pitch.CSharp1, Pitch.D1, Pitch.DSharp1, Pitch.E1 },
20 | { Pitch.BNeg1, Pitch.C0, Pitch.CSharp0, Pitch.D0, Pitch.DSharp0, Pitch.E0, Pitch.F0, Pitch.FSharp0 }
21 | };
22 |
23 | private Pitch[] rightLEDnotes = new Pitch[] {
24 | Pitch.F6, Pitch.G5, Pitch.A4, Pitch.B3, Pitch.CSharp3, Pitch.DSharp2, Pitch.F1, Pitch.G0
25 | };
26 |
27 | public InputDevice targetInput;
28 | public OutputDevice targetOutput;
29 |
30 | public delegate void LaunchpadKeyEventHandler(object source, LaunchpadKeyEventArgs e);
31 |
32 | public delegate void LaunchpadCCKeyEventHandler(object source, LaunchpadCCKeyEventArgs e);
33 |
34 | ///
35 | /// Event Handler when a Launchpad Key is pressed.
36 | ///
37 | public event LaunchpadKeyEventHandler OnLaunchpadKeyPressed;
38 | public event LaunchpadCCKeyEventHandler OnLaunchpadCCKeyPressed;
39 |
40 | public class LaunchpadCCKeyEventArgs : EventArgs
41 | {
42 | private int val;
43 | public LaunchpadCCKeyEventArgs(int _val)
44 | {
45 | val = _val;
46 | }
47 | public int GetVal()
48 | {
49 | return val;
50 | }
51 | }
52 |
53 | ///
54 | /// EventArgs for pressed Launchpad Key
55 | ///
56 | public class LaunchpadKeyEventArgs : EventArgs
57 | {
58 | private int x;
59 | private int y;
60 | public LaunchpadKeyEventArgs(int _pX, int _pY)
61 | {
62 | x = _pX;
63 | y = _pY;
64 | }
65 | public int GetX()
66 | {
67 | return x;
68 | }
69 | public int GetY()
70 | {
71 | return y;
72 | }
73 | }
74 |
75 | ///
76 | /// Creates a text scroll.
77 | ///
78 | ///
79 | ///
80 | ///
81 | ///
82 | public void createTextScroll(string text, int speed, bool looping, int velo)
83 | {
84 | byte[] sysexHeader = { 240, 00, 32, 41, 2, 4 };
85 | byte[] sysexStop = { 247 };
86 | byte operation = 20;
87 |
88 | byte _velocity = (byte)velo;
89 | byte _speed = (byte)speed;
90 | byte _loop = Convert.ToByte(looping);
91 | byte[] _text = { };
92 |
93 | byte[] finalArgs = { operation, _velocity, _loop, _speed };
94 |
95 | List charList = new List();
96 | foreach(char c in text)
97 | {
98 | int unicode = c;
99 | if (unicode < 128)
100 | charList.Add(Convert.ToByte(unicode));
101 | }
102 | _text = charList.ToArray();
103 |
104 | byte[] finalBytes = sysexHeader.Concat(finalArgs.Concat(_text.Concat(sysexStop))).ToArray();
105 |
106 | targetOutput.SendSysEx(finalBytes);
107 | }
108 |
109 | public void stopLoopingTextScroll()
110 | {
111 | byte[] stop = { 240, 0, 32, 41, 2, 24, 20, 247 };
112 | targetOutput.SendSysEx(stop);
113 | }
114 |
115 | private void sysExAnswer(SysExMessage m)
116 | {
117 | byte[] msg = m.Data;
118 | byte[] stopBytes = { 240, 0, 32, 41, 2, 24, 21, 247 };
119 | }
120 |
121 | private void midiPress(Midi.NoteOnMessage msg)
122 | {
123 | if (OnLaunchpadKeyPressed != null && !rightLEDnotes.Contains(msg.Pitch))
124 | {
125 | OnLaunchpadKeyPressed(this, new LaunchpadKeyEventArgs(midiNoteToLed(msg.Pitch)[0], midiNoteToLed(msg.Pitch)[1]));
126 | }
127 | else if (OnLaunchpadKeyPressed != null && rightLEDnotes.Contains(msg.Pitch))
128 | {
129 | OnLaunchpadCCKeyPressed(this, new LaunchpadCCKeyEventArgs(midiNoteToSideLED(msg.Pitch)));
130 | }
131 | }
132 |
133 | public int midiNoteToSideLED(Pitch p)
134 | {
135 | for (int y = 0; y <= 7; y++)
136 | {
137 | if (rightLEDnotes[y] == p)
138 | {
139 | return y;
140 | }
141 | }
142 | return 0;
143 | }
144 |
145 | ///
146 | /// Returns the LED coordinates of a MIdi note
147 | ///
148 | /// The Midi Note.
149 | /// The X,Y coordinates.
150 | public int[] midiNoteToLed(Pitch p)
151 | {
152 | for (int x = 0; x <= 7; x++)
153 | {
154 | for (int y = 0; y <= 7; y++)
155 | {
156 | if (notes[x,y] == p)
157 | {
158 | int[] r1 = { x, y };
159 | return r1;
160 | }
161 | }
162 | }
163 | int[] r2 = { 0, 0 };
164 | return r2;
165 | }
166 |
167 | ///
168 | /// Returns the equilavent Midi Note to X and Y coordinates.
169 | ///
170 | /// The X coordinate of the LED
171 | /// The Y coordinate of the LED
172 | /// The midi note
173 | public Pitch ledToMidiNote(int x, int y)
174 | {
175 | return notes[x, y];
176 | }
177 |
178 | public void clearAllLEDs()
179 | {
180 | for (int x = 0; x < 8; x++)
181 | {
182 | for (int y = 0; y < 8; y++)
183 | {
184 | setLED(x, y, 0);
185 | }
186 | }
187 |
188 | for (int ry = 0; ry < 8; ry++)
189 | {
190 | setSideLED(ry, 0);
191 | }
192 |
193 | for (int tx = 1; tx < 9; tx++)
194 | {
195 | setTopLEDs(tx, 0);
196 | }
197 | }
198 |
199 | ///
200 | /// Fills Top Row LEDs.
201 | ///
202 | ///
203 | ///
204 | ///
205 | public void fillTopLEDs(int startX, int endX, int velo)
206 | {
207 | for (int x = 1; x < 9; x++)
208 | {
209 | if (x >= startX && x <= endX)
210 | {
211 | setTopLEDs(x, velo);
212 | }
213 | }
214 | }
215 |
216 | ///
217 | /// Fills a region of Side LEDs.
218 | ///
219 | ///
220 | ///
221 | ///
222 | public void fillSideLEDs(int startY, int endY, int velo)
223 | {
224 | for (int y = 0; y < rightLEDnotes.Length; y++)
225 | {
226 | if (y >= startY && y <= endY)
227 | {
228 | setSideLED(y, velo);
229 | }
230 | }
231 | }
232 |
233 | ///
234 | /// Creates a rectangular mesh of LEDs.
235 | ///
236 | /// Start X coordinate
237 | /// Start Y coordinate
238 | /// End X coordinate
239 | /// End Y coordinate
240 | /// Painting velocity
241 | public void fillLEDs(int startX, int startY, int endX, int endY, int velo)
242 | {
243 | for (int x = 0; x < notes.Length; x++)
244 | {
245 | for (int y = 0; y < notes.Length; y++)
246 | {
247 | if (x >= startX && y >= startY && x <= endX && y <= endY)
248 | setLED(x, y, velo);
249 | }
250 | }
251 | }
252 |
253 | ///
254 | /// Sets a Top LED of the launchpad
255 | ///
256 | ///
257 | ///
258 | public void setTopLEDs(int x, int velo)
259 | {
260 | byte[] data = { 240, 0, 32, 41, 2, 24, 10, Convert.ToByte(103+x), Convert.ToByte(velo), 247 };
261 | targetOutput.SendSysEx(data);
262 | }
263 |
264 | ///
265 | /// Sets a Side LED of the Launchpad.
266 | ///
267 | /// The height of the right Side LED.
268 | /// Velocity index.
269 | public void setSideLED(int y, int velo)
270 | {
271 | targetOutput.SendNoteOn(Channel.Channel1, rightLEDnotes[y], velo);
272 | }
273 |
274 | ///
275 | /// Sets a LED of the Launchpad.
276 | ///
277 | /// The X coordinate.
278 | /// The Y coordinate.
279 | /// The velocity.
280 | public void setLED(int x, int y, int velo)
281 | {
282 | try
283 | {
284 | targetOutput.SendNoteOn(Channel.Channel1, notes[x, y], velo);
285 | }
286 | catch (Midi.DeviceException)
287 | {
288 | Console.WriteLine("<< LAUNCHPAD.NET >> Midi.DeviceException");
289 | throw;
290 | }
291 | }
292 |
293 | ///
294 | /// Returns all connected and installed Launchpads.
295 | ///
296 | /// Returns LaunchpadDevice array.
297 | public LaunchpadDevice[] getConnectedLaunchpads()
298 | {
299 | List tempDevices = new List();
300 |
301 | foreach (InputDevice id in Midi.InputDevice.InstalledDevices)
302 | {
303 | foreach (OutputDevice od in Midi.OutputDevice.InstalledDevices)
304 | {
305 | if (id.Name == od.Name)
306 | {
307 | if (id.Name.ToLower().Contains("launchpad"))
308 | {
309 | tempDevices.Add(new LaunchpadDevice(id.Name));
310 | }
311 | }
312 | }
313 | }
314 |
315 | return tempDevices.ToArray();
316 | }
317 |
318 | ///
319 | /// Function to connect with a LaunchpadDevice
320 | ///
321 | /// The Launchpad to connect to.
322 | /// Returns bool if connection was successful.
323 | public bool connect(LaunchpadDevice device)
324 | {
325 | foreach(InputDevice id in Midi.InputDevice.InstalledDevices)
326 | {
327 | if (id.Name.ToLower() == device._midiName.ToLower())
328 | {
329 | targetInput = id;
330 | id.Open();
331 | targetInput.NoteOn += new InputDevice.NoteOnHandler(midiPress);
332 | targetInput.StartReceiving(null);
333 | }
334 | }
335 | foreach (OutputDevice od in Midi.OutputDevice.InstalledDevices)
336 | {
337 | if (od.Name.ToLower() == device._midiName.ToLower())
338 | {
339 | targetOutput = od;
340 | od.Open();
341 | }
342 | }
343 |
344 | return true; // targetInput.IsOpen && targetOutput.IsOpen;
345 | }
346 |
347 | ///
348 | /// Disconnects a given LaunchpadDevice
349 | ///
350 | /// The Launchpad to disconnect.
351 | /// Returns bool if disconnection was successful.
352 | public bool disconnect(LaunchpadDevice device)
353 | {
354 | if (targetInput.IsOpen && targetOutput.IsOpen)
355 | {
356 | targetInput.StopReceiving();
357 | targetInput.Close();
358 | targetOutput.Close();
359 | }
360 | return !targetInput.IsOpen && !targetOutput.IsOpen;
361 | }
362 |
363 | public class LaunchpadDevice
364 | {
365 | public string _midiName;
366 | //public int _midiDeviceId;
367 |
368 | public LaunchpadDevice(string name)
369 | {
370 | _midiName = name;
371 | }
372 | }
373 | }
374 | }
375 |
--------------------------------------------------------------------------------
/launchpad-dot-net/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // Allgemeine Informationen über eine Assembly werden über die folgenden
6 | // Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
7 | // die einer Assembly zugeordnet sind.
8 | [assembly: AssemblyTitle("launchpad-dot-net")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("launchpad-dot-net")]
13 | [assembly: AssemblyCopyright("Copyright © 2015")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar
18 | // für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von
19 | // COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen.
20 | [assembly: ComVisible(false)]
21 |
22 | // Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
23 | [assembly: Guid("2784c4af-3b96-471b-91b0-1a11c342d375")]
24 |
25 | // Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
26 | //
27 | // Hauptversion
28 | // Nebenversion
29 | // Buildnummer
30 | // Revision
31 | //
32 | // Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
33 | // übernehmen, indem Sie "*" eingeben:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/launchpad-dot-net/bin/Debug/Midi.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iUltimateLP/launchpad-dot-net/4f56c2edc0b4b2263b46ca130c9868870ad4c999/launchpad-dot-net/bin/Debug/Midi.dll
--------------------------------------------------------------------------------
/launchpad-dot-net/bin/Debug/launchpad-dot-net.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iUltimateLP/launchpad-dot-net/4f56c2edc0b4b2263b46ca130c9868870ad4c999/launchpad-dot-net/bin/Debug/launchpad-dot-net.dll
--------------------------------------------------------------------------------
/launchpad-dot-net/bin/Debug/launchpad-dot-net.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iUltimateLP/launchpad-dot-net/4f56c2edc0b4b2263b46ca130c9868870ad4c999/launchpad-dot-net/bin/Debug/launchpad-dot-net.pdb
--------------------------------------------------------------------------------
/launchpad-dot-net/launchpad-dot-net.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {2784C4AF-3B96-471B-91B0-1A11C342D375}
8 | Library
9 | Properties
10 | launchpad_dot_net
11 | launchpad-dot-net
12 | v4.5
13 | 512
14 |
15 |
16 | true
17 | full
18 | false
19 | bin\Debug\
20 | DEBUG;TRACE
21 | prompt
22 | 4
23 |
24 |
25 | pdbonly
26 | true
27 | bin\Release\
28 | TRACE
29 | prompt
30 | 4
31 |
32 |
33 |
34 | False
35 | bin\Debug\Midi.dll
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
58 |
--------------------------------------------------------------------------------
/launchpad-dot-net/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iUltimateLP/launchpad-dot-net/4f56c2edc0b4b2263b46ca130c9868870ad4c999/launchpad-dot-net/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
--------------------------------------------------------------------------------
/launchpad-dot-net/obj/Debug/launchpad-dot-net.csproj.FileListAbsolute.txt:
--------------------------------------------------------------------------------
1 | c:\users\johnny\documents\visual studio 2015\Projects\launchpad-dot-net\launchpad-dot-net\bin\Debug\launchpad-dot-net.dll
2 | c:\users\johnny\documents\visual studio 2015\Projects\launchpad-dot-net\launchpad-dot-net\bin\Debug\launchpad-dot-net.pdb
3 | c:\users\johnny\documents\visual studio 2015\Projects\launchpad-dot-net\launchpad-dot-net\obj\Debug\launchpad-dot-net.csprojResolveAssemblyReference.cache
4 | c:\users\johnny\documents\visual studio 2015\Projects\launchpad-dot-net\launchpad-dot-net\obj\Debug\launchpad-dot-net.dll
5 | c:\users\johnny\documents\visual studio 2015\Projects\launchpad-dot-net\launchpad-dot-net\obj\Debug\launchpad-dot-net.pdb
6 |
--------------------------------------------------------------------------------
/launchpad-dot-net/obj/Debug/launchpad-dot-net.csprojResolveAssemblyReference.cache:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iUltimateLP/launchpad-dot-net/4f56c2edc0b4b2263b46ca130c9868870ad4c999/launchpad-dot-net/obj/Debug/launchpad-dot-net.csprojResolveAssemblyReference.cache
--------------------------------------------------------------------------------
/launchpad-dot-net/obj/Debug/launchpad-dot-net.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iUltimateLP/launchpad-dot-net/4f56c2edc0b4b2263b46ca130c9868870ad4c999/launchpad-dot-net/obj/Debug/launchpad-dot-net.dll
--------------------------------------------------------------------------------
/launchpad-dot-net/obj/Debug/launchpad-dot-net.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iUltimateLP/launchpad-dot-net/4f56c2edc0b4b2263b46ca130c9868870ad4c999/launchpad-dot-net/obj/Debug/launchpad-dot-net.pdb
--------------------------------------------------------------------------------