Skip to content

Commit 1683d26

Browse files
committed
add developer mode / random parameter
1 parent 5f9682e commit 1683d26

File tree

9 files changed

+307
-5
lines changed

9 files changed

+307
-5
lines changed

plugins/string-machine/Artwork.cpp

Lines changed: 70 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6133,17 +6133,83 @@ static const unsigned char temp_toggle_button_6[] = {
61336133
252, 254, 51, 253, 202, 154, 0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130,};
61346134
const char* Artwork::toggle_buttonData = (const char*)temp_toggle_button_6;
61356135

6136-
static const unsigned char temp_value_display_7[] = {
6136+
static const unsigned char temp_trigger_button_7[] = {
6137+
137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 35, 0,
6138+
0, 0, 30, 8, 6, 0, 0, 0, 166, 61, 167, 42, 0, 0, 4, 232, 73, 68, 65, 84, 120,
6139+
94, 189, 150, 107, 80, 84, 5, 24, 134, 207, 15, 155, 154, 178, 169, 169, 169, 169, 177, 177, 105,
6140+
50, 45, 171, 233, 98, 169, 101, 186, 26, 40, 224, 178, 203, 117, 97, 151, 189, 178, 11, 236, 46,
6141+
136, 43, 11, 162, 8, 177, 67, 153, 23, 76, 205, 11, 134, 98, 42, 106, 162, 40, 138, 160, 128,
6142+
120, 13, 66, 201, 187, 173, 162, 150, 163, 232, 104, 58, 106, 90, 186, 150, 213, 56, 79, 231, 156,
6143+
93, 26, 116, 152, 254, 117, 126, 60, 115, 206, 191, 247, 155, 243, 189, 243, 61, 71, 208, 233, 116,
6144+
189, 68, 86, 56, 28, 14, 191, 207, 151, 135, 207, 231, 17, 25, 223, 141, 236, 16, 227, 186, 145,
6145+
213, 141, 76, 124, 197, 18, 238, 32, 159, 72, 184, 130, 20, 57, 131, 20, 74, 100, 4, 153, 146,
6146+
30, 164, 64, 100, 178, 29, 135, 77, 239, 151, 242, 165, 57, 4, 233, 165, 166, 102, 101, 53, 84,
6147+
6, 248, 179, 20, 238, 206, 132, 223, 167, 195, 157, 105, 112, 123, 42, 220, 250, 12, 126, 45, 129,
6148+
27, 62, 248, 165, 24, 174, 21, 193, 213, 66, 184, 82, 0, 151, 39, 195, 165, 124, 184, 56, 17,
6149+
46, 228, 194, 121, 47, 156, 155, 0, 103, 61, 112, 38, 27, 126, 204, 130, 211, 153, 112, 210, 5,
6150+
29, 78, 56, 158, 14, 254, 52, 56, 102, 135, 163, 169, 112, 216, 10, 135, 44, 129, 85, 51, 180,
6151+
213, 210, 28, 130, 195, 97, 247, 115, 175, 34, 160, 80, 48, 28, 48, 193, 126, 35, 247, 218, 13,
6152+
252, 189, 55, 153, 191, 218, 146, 184, 222, 164, 14, 152, 245, 177, 126, 65, 90, 139, 146, 193, 119,
6153+
91, 19, 249, 163, 37, 129, 59, 123, 226, 8, 236, 142, 229, 214, 78, 45, 191, 237, 208, 224, 182,
6154+
68, 34, 72, 59, 86, 58, 248, 102, 179, 154, 27, 219, 198, 114, 189, 49, 146, 107, 13, 17, 92,
6155+
221, 58, 134, 12, 83, 132, 56, 140, 88, 46, 165, 131, 175, 212, 135, 115, 185, 46, 140, 75, 181,
6156+
163, 184, 184, 105, 36, 23, 106, 70, 144, 150, 50, 90, 28, 70, 108, 181, 210, 193, 231, 55, 12,
6157+
231, 92, 245, 48, 206, 174, 251, 144, 51, 85, 67, 249, 105, 205, 16, 236, 250, 48, 113, 152, 201,
6158+
14, 197, 131, 79, 175, 126, 159, 147, 43, 7, 209, 81, 249, 46, 199, 151, 191, 141, 127, 217, 91,
6159+
216, 146, 70, 137, 195, 228, 167, 42, 30, 124, 108, 233, 155, 28, 173, 120, 131, 195, 139, 7, 114,
6160+
168, 252, 53, 14, 44, 26, 128, 85, 55, 18, 161, 56, 207, 170, 120, 240, 254, 178, 254, 180, 47,
6161+
232, 199, 190, 249, 47, 211, 246, 229, 75, 180, 206, 121, 17, 115, 188, 10, 161, 200, 107, 86, 60,
6162+
184, 101, 118, 95, 246, 204, 122, 129, 221, 165, 125, 216, 57, 227, 121, 118, 76, 127, 14, 99, 172,
6163+
56, 204, 20, 143, 65, 241, 224, 230, 207, 159, 101, 219, 212, 103, 104, 252, 244, 105, 26, 74, 158,
6164+
98, 139, 239, 73, 146, 162, 197, 97, 82, 77, 137, 126, 49, 56, 160, 100, 112, 125, 241, 19, 108,
6165+
46, 122, 156, 77, 83, 30, 99, 99, 193, 163, 204, 75, 21, 2, 241, 49, 26, 191, 236, 166, 217,
6166+
222, 161, 213, 237, 11, 7, 4, 148, 8, 222, 48, 233, 17, 214, 231, 63, 204, 186, 188, 135, 88,
6167+
155, 219, 139, 89, 70, 33, 16, 53, 248, 213, 160, 155, 186, 172, 109, 208, 105, 252, 54, 157, 74,
6168+
110, 181, 37, 81, 37, 99, 78, 8, 33, 150, 203, 20, 194, 24, 23, 66, 220, 113, 74, 23, 49,
6169+
42, 12, 18, 90, 21, 250, 46, 52, 42, 146, 67, 72, 43, 144, 81, 171, 208, 117, 49, 86, 69,
6170+
92, 132, 138, 88, 173, 230, 62, 107, 203, 195, 56, 211, 44, 157, 30, 167, 142, 241, 25, 33, 210,
6171+
19, 201, 150, 73, 32, 59, 45, 129, 113, 105, 241, 50, 89, 14, 137, 56, 178, 236, 113, 100, 202,
6172+
196, 226, 78, 149, 136, 193, 109, 139, 193, 37, 163, 197, 101, 213, 226, 180, 106, 100, 50, 44, 18,
6173+
209, 100, 152, 163, 73, 55, 171, 101, 156, 22, 53, 217, 118, 53, 46, 123, 98, 231, 125, 191, 16,
6174+
149, 11, 188, 29, 205, 21, 58, 26, 202, 98, 57, 180, 54, 133, 35, 235, 140, 28, 22, 159, 7,
6175+
215, 232, 57, 240, 77, 50, 223, 175, 210, 177, 175, 50, 129, 189, 43, 226, 249, 110, 89, 44, 173,
6176+
95, 199, 240, 109, 133, 134, 61, 75, 162, 217, 85, 62, 150, 157, 95, 69, 177, 189, 44, 130, 230,
6177+
133, 99, 104, 154, 31, 78, 227, 188, 48, 182, 206, 29, 69, 253, 108, 21, 117, 95, 140, 160, 182,
6178+
244, 35, 54, 205, 28, 70, 205, 244, 15, 216, 48, 109, 40, 213, 83, 7, 83, 95, 250, 30, 77,
6179+
165, 3, 229, 94, 214, 206, 85, 119, 200, 107, 202, 112, 152, 59, 183, 150, 197, 176, 111, 101, 162,
6180+
40, 200, 2, 69, 127, 33, 110, 110, 215, 242, 115, 93, 184, 124, 104, 157, 182, 248, 78, 65, 250,
6181+
204, 213, 51, 195, 225, 148, 247, 127, 13, 254, 175, 43, 127, 187, 205, 73, 81, 142, 17, 65, 218,
6182+
113, 179, 248, 137, 149, 10, 238, 233, 202, 223, 216, 155, 75, 161, 215, 138, 32, 149, 75, 218, 177,
6183+
82, 193, 61, 93, 249, 203, 45, 121, 20, 228, 216, 16, 210, 76, 106, 185, 92, 74, 5, 247, 116,
6184+
229, 59, 183, 103, 51, 201, 99, 65, 112, 164, 68, 81, 85, 50, 72, 177, 224, 158, 174, 252, 169,
6185+
250, 116, 38, 102, 155, 68, 29, 232, 35, 88, 94, 240, 186, 98, 193, 61, 93, 249, 163, 235, 205,
6186+
228, 101, 137, 5, 182, 38, 141, 166, 220, 219, 79, 177, 224, 158, 244, 210, 46, 222, 49, 175, 219,
6187+
128, 96, 75, 14, 99, 73, 78, 31, 197, 130, 123, 242, 90, 107, 165, 145, 9, 238, 20, 177, 192,
6188+
134, 143, 89, 50, 174, 55, 167, 86, 15, 81, 36, 248, 65, 161, 54, 205, 120, 133, 93, 85, 249,
6189+
120, 92, 226, 154, 28, 38, 109, 103, 109, 97, 111, 218, 23, 246, 255, 223, 131, 31, 52, 249, 230,
6190+
146, 190, 52, 46, 181, 211, 176, 204, 131, 49, 89, 188, 192, 146, 19, 22, 77, 124, 167, 67, 10,
6191+
61, 81, 21, 197, 137, 154, 20, 78, 212, 218, 241, 111, 180, 241, 67, 141, 85, 46, 215, 145, 106,
6192+
147, 236, 172, 131, 85, 6, 246, 139, 174, 146, 118, 44, 233, 163, 77, 114, 213, 242, 56, 90, 36,
6193+
87, 45, 213, 178, 91, 114, 213, 98, 53, 59, 36, 87, 45, 138, 100, 155, 228, 170, 5, 163, 105,
6194+
16, 239, 216, 22, 201, 85, 115, 70, 178, 89, 114, 213, 172, 225, 212, 206, 137, 164, 174, 34, 147,
6195+
218, 114, 55, 249, 233, 218, 160, 155, 186, 172, 157, 106, 212, 116, 230, 186, 226, 201, 205, 212, 147,
6196+
155, 149, 34, 227, 205, 52, 4, 17, 203, 149, 227, 214, 203, 76, 112, 37, 7, 113, 38, 227, 113,
6197+
38, 5, 201, 72, 10, 153, 94, 23, 50, 125, 98, 200, 244, 65, 130, 166, 143, 239, 102, 122, 17,
6198+
71, 2, 153, 105, 73, 24, 116, 113, 255, 90, 251, 31, 210, 44, 20, 237, 15, 185, 233, 237, 0,
6199+
0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130,};
6200+
const char* Artwork::trigger_buttonData = (const char*)temp_trigger_button_7;
6201+
6202+
static const unsigned char temp_value_display_8[] = {
61376203
137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 40, 0,
61386204
0, 0, 12, 4, 3, 0, 0, 0, 226, 237, 226, 126, 0, 0, 0, 15, 80, 76, 84, 69, 0,
61396205
0, 0, 13, 13, 13, 75, 75, 75, 30, 30, 30, 76, 76, 76, 141, 27, 81, 132, 0, 0, 0,
61406206
3, 116, 82, 78, 83, 43, 197, 249, 188, 130, 4, 108, 0, 0, 0, 32, 73, 68, 65, 84, 8,
61416207
215, 99, 96, 52, 198, 0, 2, 12, 66, 46, 24, 64, 145, 193, 4, 83, 208, 121, 48, 10, 98,
61426208
117, 60, 54, 111, 2, 0, 35, 137, 59, 61, 45, 6, 232, 71, 0, 0, 0, 0, 73, 69, 78,
61436209
68, 174, 66, 96, 130,};
6144-
const char* Artwork::value_displayData = (const char*)temp_value_display_7;
6210+
const char* Artwork::value_displayData = (const char*)temp_value_display_8;
61456211

6146-
static const unsigned char temp_vu_8[] = {
6212+
static const unsigned char temp_vu_9[] = {
61476213
137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 95, 0,
61486214
0, 1, 85, 8, 6, 0, 0, 0, 137, 160, 51, 39, 0, 0, 13, 58, 73, 68, 65, 84, 120,
61496215
218, 237, 221, 75, 108, 27, 121, 29, 7, 240, 121, 250, 25, 59, 177, 221, 216, 73, 234, 56, 206,
@@ -6308,5 +6374,5 @@ static const unsigned char temp_vu_8[] = {
63086374
227, 5, 171, 119, 242, 228, 73, 240, 2, 120, 1, 188, 0, 94, 0, 47, 96, 169, 9, 94, 0,
63096375
47, 128, 23, 192, 11, 224, 5, 28, 243, 193, 11, 224, 5, 240, 2, 120, 161, 219, 188, 240, 127,
63106376
33, 101, 243, 172, 191, 83, 145, 23, 0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130,};
6311-
const char* Artwork::vuData = (const char*)temp_vu_8;
6377+
const char* Artwork::vuData = (const char*)temp_vu_9;
63126378

plugins/string-machine/Artwork.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ namespace Artwork
2323
extern const char* toggle_buttonData;
2424
const unsigned int toggle_buttonDataSize = 837;
2525

26+
extern const char* trigger_buttonData;
27+
const unsigned int trigger_buttonDataSize = 1313;
28+
2629
extern const char* value_displayData;
2730
const unsigned int value_displayDataSize = 131;
2831

plugins/string-machine/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ FILES_UI = \
3939
sources/ui/components/KnobSkin.cpp \
4040
sources/ui/components/SkinSlider.cpp \
4141
sources/ui/components/SkinToggleButton.cpp \
42+
sources/ui/components/SkinTriggerButton.cpp \
4243
sources/ui/components/SkinIndicator.cpp \
4344
sources/ui/components/PlotView.cpp \
4445
sources/ui/FontEngine.cpp \

plugins/string-machine/StringMachineUI.cpp

Lines changed: 117 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "Window.hpp"
66
#include "ui/components/SkinSlider.hpp"
77
#include "ui/components/SkinToggleButton.hpp"
8+
#include "ui/components/SkinTriggerButton.hpp"
89
#include "ui/components/SkinIndicator.hpp"
910
#include "ui/components/PlotView.hpp"
1011
#include "ui/FontEngine.h"
@@ -19,9 +20,11 @@ StringMachineUI::StringMachineUI()
1920
fSkinKnob(Artwork::knobData, Artwork::knobDataSize, 31),
2021
fSkinSlider(Artwork::sliderData, Artwork::sliderDataSize, 31),
2122
fSkinToggleButton(Artwork::toggle_buttonData, Artwork::toggle_buttonDataSize, 2),
23+
fSkinTriggerButton(Artwork::trigger_buttonData, Artwork::trigger_buttonDataSize, 2),
2224
fSkinLed(Artwork::ledData, Artwork::ledDataSize, 2),
2325
fSkinVu(Artwork::vuData, Artwork::vuDataSize, 31),
24-
fSkinValueDisplay(Artwork::value_displayData, Artwork::value_displayDataSize, 1)
26+
fSkinValueDisplay(Artwork::value_displayData, Artwork::value_displayDataSize, 1),
27+
fRandomGenerator(std::random_device{}())
2528
{
2629
for (unsigned p = 0; p < Parameter_Count; ++p)
2730
InitParameter(p, fParameters[p]);
@@ -251,6 +254,26 @@ void StringMachineUI::onDisplay()
251254

252255
fe.drawInBox(cr, label->text, font, bounds, label->align);
253256
}
257+
258+
if (fDeveloperMode) {
259+
RectF rect(5.5, 5.5, 100.0, 15.0);
260+
261+
cairo_rounded_rectangle(cr, rect, 5.0);
262+
cairo_set_source_rgba8(cr, ColorRGBA8{0xff, 0x7e, 0x00, 0xff});
263+
cairo_fill_preserve(cr);
264+
cairo_set_source_rgba8(cr, ColorRGBA8{0x00, 0x00, 0x00, 0xff});
265+
cairo_stroke(cr);
266+
267+
Font font;
268+
font.size = 9.0;
269+
font.color = ColorRGBA8{0xff, 0xff, 0xff, 0xff};
270+
fe.drawInBox(cr, "Developer mode", font, rect.off_by({0, 1}), FontEngine::AlignCenter);
271+
272+
SkinTriggerButton &randButton = *fRandomizeButton;
273+
font.size = 9.0;
274+
font.color = ColorRGBA8{0x00, 0x00, 0x00, 0xff};
275+
fe.drawInBox(cr, "Random", font, Rect(randButton.getAbsoluteX(), randButton.getAbsoluteY(), randButton.getWidth(), randButton.getHeight()).off_by({-8, 2}), FontEngine::AlignLeft);
276+
}
254277
}
255278

256279
void StringMachineUI::parameterChanged(uint32_t index, float value)
@@ -302,6 +325,28 @@ void StringMachineUI::uiIdle()
302325
}
303326
}
304327

328+
bool StringMachineUI::onKeyboard(const KeyboardEvent &event)
329+
{
330+
if (event.press && event.mod == 0) {
331+
fKeyHistory[fKeyHistoryIndex++] = KeyPress{event.key, false};
332+
fKeyHistoryIndex %= KeyHistorySize;
333+
checkForDeveloperCode();
334+
}
335+
336+
return UI::onKeyboard(event);
337+
}
338+
339+
bool StringMachineUI::onSpecial(const SpecialEvent &event)
340+
{
341+
if (event.press && event.mod == 0) {
342+
fKeyHistory[fKeyHistoryIndex++] = KeyPress{event.key, true};
343+
fKeyHistoryIndex %= KeyHistorySize;
344+
checkForDeveloperCode();
345+
}
346+
347+
return UI::onSpecial(event);
348+
}
349+
305350
void StringMachineUI::updateParameterValue(uint32_t index, float value)
306351
{
307352
DISTRHO_SAFE_ASSERT_RETURN(index < Parameter_Count,);
@@ -433,6 +478,52 @@ void StringMachineUI::computeAdsrPlot(float *data, unsigned size)
433478
data[i] *= 0.9f;
434479
}
435480

481+
void StringMachineUI::checkForDeveloperCode()
482+
{
483+
const KeyPress sequence[] = {
484+
{kKeyUp, true},
485+
{kKeyUp, true},
486+
{kKeyDown, true},
487+
{kKeyDown, true},
488+
{kKeyLeft, true},
489+
{kKeyRight, true},
490+
{kKeyLeft, true},
491+
{kKeyRight, true},
492+
{'\r', false},
493+
};
494+
unsigned sequenceSize = sizeof(sequence) / sizeof(sequence[0]);
495+
496+
if (KeyHistorySize < sequenceSize)
497+
return;
498+
499+
bool sequencesEqual = true;
500+
unsigned historyIndex = (fKeyHistoryIndex + KeyHistorySize - sequenceSize) % KeyHistorySize;
501+
for (unsigned i = 0; i < sequenceSize && sequencesEqual; ++i)
502+
{
503+
sequencesEqual = sequence[i] == fKeyHistory[historyIndex];
504+
historyIndex = (historyIndex + 1) % KeyHistorySize;
505+
}
506+
507+
508+
if (sequencesEqual)
509+
enableDeveloperMode();
510+
}
511+
512+
void StringMachineUI::enableDeveloperMode()
513+
{
514+
if (fDeveloperMode)
515+
return;
516+
517+
fDeveloperMode = true;
518+
519+
SkinTriggerButton *randButton = new SkinTriggerButton(fSkinTriggerButton, this);
520+
fRandomizeButton.reset(randButton);
521+
randButton->setAbsolutePos(165, 6);
522+
randButton->TriggerCallback = [this]() { randomizeParameters(); };
523+
524+
repaint();
525+
}
526+
436527
double StringMachineUI::convertNormalizedToParameter(unsigned index, double value)
437528
{
438529
DISTRHO_SAFE_ASSERT_RETURN(index < Parameter_Count, 0.0)
@@ -468,6 +559,31 @@ double StringMachineUI::convertNormalizedFromParameter(unsigned index, double va
468559
return value;
469560
}
470561

562+
void StringMachineUI::randomizeParameters()
563+
{
564+
std::minstd_rand &rand = fRandomGenerator;
565+
566+
for (unsigned p = 0; p < Parameter_Count; ++p) {
567+
if (!isRandomizableParameter(p))
568+
continue;
569+
570+
double value = std::uniform_real_distribution<double>{0.0, 1.0}(rand);
571+
value = convertNormalizedToParameter(p, value);
572+
setParameterValue(p, value);
573+
parameterChanged(p, value);
574+
}
575+
}
576+
577+
bool StringMachineUI::isRandomizableParameter(unsigned index)
578+
{
579+
switch (index) {
580+
case pIdMasterGain:
581+
return false;
582+
default:
583+
return true;
584+
}
585+
}
586+
471587
std::string StringMachineUI::formatDisplayValue(double value)
472588
{
473589
char buf[64];

plugins/string-machine/StringMachineUI.hpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44
#include "ui/components/KnobSkin.hpp"
55
#include "ui/Geometry.h"
66
#include "dsp/ADSREnvelope.h"
7+
#include <random>
78
#include <string>
89
#include <memory>
910

1011
class SkinSlider;
1112
class SkinToggleButton;
13+
class SkinTriggerButton;
1214
class SkinIndicator;
1315
class PlotView;
1416
class FontEngine;
@@ -19,10 +21,14 @@ class StringMachineUI : public UI {
1921
StringMachineUI();
2022
~StringMachineUI();
2123

24+
protected:
2225
void onDisplay() override;
2326
void parameterChanged(uint32_t index, float value) override;
2427
void uiIdle() override;
2528

29+
bool onKeyboard(const KeyboardEvent &event) override;
30+
bool onSpecial(const SpecialEvent &event) override;
31+
2632
private:
2733
void updateParameterValue(uint32_t index, float value);
2834

@@ -32,9 +38,15 @@ class StringMachineUI : public UI {
3238

3339
void computeAdsrPlot(float *data, unsigned size);
3440

41+
void checkForDeveloperCode();
42+
void enableDeveloperMode();
43+
3544
double convertNormalizedToParameter(unsigned index, double value);
3645
double convertNormalizedFromParameter(unsigned index, double value);
3746

47+
void randomizeParameters();
48+
static bool isRandomizableParameter(unsigned index);
49+
3850
static std::string formatDisplayValue(double value);
3951

4052
private:
@@ -45,6 +57,7 @@ class StringMachineUI : public UI {
4557
KnobSkin fSkinKnob;
4658
KnobSkin fSkinSlider;
4759
KnobSkin fSkinToggleButton;
60+
KnobSkin fSkinTriggerButton;
4861
KnobSkin fSkinLed;
4962
KnobSkin fSkinVu;
5063
KnobSkin fSkinValueDisplay;
@@ -58,4 +71,22 @@ class StringMachineUI : public UI {
5871
std::unique_ptr<PlotView> fAdsrView;
5972

6073
Parameter fParameters[Parameter_Count];
74+
75+
struct KeyPress {
76+
uint32_t key;
77+
bool special;
78+
79+
bool operator==(const KeyPress &other) const
80+
{ return key == other.key && special == other.special; }
81+
bool operator!=(const KeyPress &other) const
82+
{ return !operator==(other); }
83+
};
84+
85+
enum { KeyHistorySize = 16 };
86+
KeyPress fKeyHistory[KeyHistorySize] = {};
87+
unsigned fKeyHistoryIndex = 0;
88+
89+
bool fDeveloperMode = false;
90+
std::unique_ptr<SkinTriggerButton> fRandomizeButton;
91+
std::minstd_rand fRandomGenerator;
6192
};
1.28 KB
Loading

resources/ui/trigger-button.knob

11.9 KB
Binary file not shown.

0 commit comments

Comments
 (0)