Помогите с Microsoft Visual Studio [Решено]
Цитата: Имир от 16.10.2024, 03:55Здравствуйте! Пытаюсь собрать midi-визуалайзер в Microsoft Visual Studio. Ничего у меня не получается... Помогите, пожалуйста! Буду очень признателен!
[spoiler title="Код"]# include <Siv3D.hpp>struct Note
{
uint32 ch;
uint32 noteNumber;
int32 startMillisec;
int32 lengthMillisec;double alpha;
bool barPassed;
bool onBar;
};void Main()
{
Window::Resize(1280, 720);Midi::Open(Dialog::GetOpenMidi().value());
const auto score = Midi::GetScore();
Array<Note> noteRects;
uint32 minPitch = 127, maxPitch = 0;for (auto ch : step(static_cast<uint32>(score.size())))
{
for (const auto& note : score[ch])
{
noteRects.push_back({ ch, note.noteNumber, note.startMillisec, note.lengthMillisec, 1.0, false, false });
minPitch = Min(minPitch, note.noteNumber);
maxPitch = Max(maxPitch, note.noteNumber);
}
}while (System::Update())
{
const double scale = 0.2;
const int32 offset = 160;
const int32 offsetMillisec = static_cast<int32>(offset / scale);
const RectF line(offset - 1, 0, 6, Window::Height());
const double blockHeight = static_cast<double>(Window::Height()) / (maxPitch - minPitch + 1);if (!Midi::IsPlaying())
{
for (auto& note : noteRects)
{
note.alpha = 1.0;
note.barPassed = false;
note.onBar = false;
}
}if (Input::MouseL.clicked)
{
Midi::Play();
}const double pos = (Midi::GetPosSec() * 1000 - 100)* scale;
const int32 bar = static_cast<int32>(Midi::GetPosSec() * 1000 - 100);
const int32 left = bar - offsetMillisec;
const int32 right = static_cast<int32>(left + Window::Width() / scale);Array<size_t> visibleNoteIndices;
size_t index = 0;for (auto& note : noteRects)
{
if (right < note.startMillisec || (note.startMillisec + note.lengthMillisec) < left)
{
++index;
continue;
}note.onBar = note.startMillisec <= bar && bar <= (note.startMillisec + note.lengthMillisec);
note.barPassed = note.startMillisec <= bar;if (note.barPassed)
{
note.alpha *= note.onBar ? 0.98 : 0.85;
}visibleNoteIndices.push_back(index++);
}Graphics2D::SetBlendState(BlendState::Default);
for (auto& i : visibleNoteIndices)
{
const auto& note = noteRects[i];if (!note.barPassed)
{
const RectF r(note.startMillisec * scale + offset - pos, (maxPitch - note.noteNumber) * blockHeight, note.lengthMillisec * scale, blockHeight);
RoundRect(r, 4).draw(ColorF(0.2, 0.25, 0.3));
}
}Graphics2D::SetBlendState(BlendState::Additive);
for (auto& i : visibleNoteIndices)
{
const auto& note = noteRects[i];if (note.barPassed)
{
const RectF r(note.startMillisec * scale + offset - pos, (maxPitch - note.noteNumber) * blockHeight, note.lengthMillisec * scale, blockHeight);
RoundRect(r, 5).drawShadow({ 0, 0 }, 12 + note.alpha * 8, 2 + note.alpha * 8, HSV(30 + note.ch * 100, 0.5, 1).toColorF(note.alpha*0.4));
}
}for (auto& i : visibleNoteIndices)
{
const auto& note = noteRects[i];if (note.barPassed)
{
const RectF r(note.startMillisec * scale + offset - pos, (maxPitch - note.noteNumber) * blockHeight, note.lengthMillisec * scale, blockHeight);
RoundRect(r, 4).draw(HSV(30 + note.ch * 100, 1, 1).toColorF(note.alpha));
}
}line.draw(Alpha(20));
}
}[/spoiler]
Здравствуйте! Пытаюсь собрать midi-визуалайзер в Microsoft Visual Studio. Ничего у меня не получается... Помогите, пожалуйста! Буду очень признателен!
struct Note
{
uint32 ch;
uint32 noteNumber;
int32 startMillisec;
int32 lengthMillisec;
double alpha;
bool barPassed;
bool onBar;
};
void Main()
{
Window::Resize(1280, 720);
Midi::Open(Dialog::GetOpenMidi().value());
const auto score = Midi::GetScore();
Array<Note> noteRects;
uint32 minPitch = 127, maxPitch = 0;
for (auto ch : step(static_cast<uint32>(score.size())))
{
for (const auto& note : score[ch])
{
noteRects.push_back({ ch, note.noteNumber, note.startMillisec, note.lengthMillisec, 1.0, false, false });
minPitch = Min(minPitch, note.noteNumber);
maxPitch = Max(maxPitch, note.noteNumber);
}
}
while (System::Update())
{
const double scale = 0.2;
const int32 offset = 160;
const int32 offsetMillisec = static_cast<int32>(offset / scale);
const RectF line(offset - 1, 0, 6, Window::Height());
const double blockHeight = static_cast<double>(Window::Height()) / (maxPitch - minPitch + 1);
if (!Midi::IsPlaying())
{
for (auto& note : noteRects)
{
note.alpha = 1.0;
note.barPassed = false;
note.onBar = false;
}
}
if (Input::MouseL.clicked)
{
Midi::Play();
}
const double pos = (Midi::GetPosSec() * 1000 - 100)* scale;
const int32 bar = static_cast<int32>(Midi::GetPosSec() * 1000 - 100);
const int32 left = bar - offsetMillisec;
const int32 right = static_cast<int32>(left + Window::Width() / scale);
Array<size_t> visibleNoteIndices;
size_t index = 0;
for (auto& note : noteRects)
{
if (right < note.startMillisec || (note.startMillisec + note.lengthMillisec) < left)
{
++index;
continue;
}
note.onBar = note.startMillisec <= bar && bar <= (note.startMillisec + note.lengthMillisec);
note.barPassed = note.startMillisec <= bar;
if (note.barPassed)
{
note.alpha *= note.onBar ? 0.98 : 0.85;
}
visibleNoteIndices.push_back(index++);
}
Graphics2D::SetBlendState(BlendState::Default);
for (auto& i : visibleNoteIndices)
{
const auto& note = noteRects[i];
if (!note.barPassed)
{
const RectF r(note.startMillisec * scale + offset - pos, (maxPitch - note.noteNumber) * blockHeight, note.lengthMillisec * scale, blockHeight);
RoundRect(r, 4).draw(ColorF(0.2, 0.25, 0.3));
}
}
Graphics2D::SetBlendState(BlendState::Additive);
for (auto& i : visibleNoteIndices)
{
const auto& note = noteRects[i];
if (note.barPassed)
{
const RectF r(note.startMillisec * scale + offset - pos, (maxPitch - note.noteNumber) * blockHeight, note.lengthMillisec * scale, blockHeight);
RoundRect(r, 5).drawShadow({ 0, 0 }, 12 + note.alpha * 8, 2 + note.alpha * 8, HSV(30 + note.ch * 100, 0.5, 1).toColorF(note.alpha*0.4));
}
}
for (auto& i : visibleNoteIndices)
{
const auto& note = noteRects[i];
if (note.barPassed)
{
const RectF r(note.startMillisec * scale + offset - pos, (maxPitch - note.noteNumber) * blockHeight, note.lengthMillisec * scale, blockHeight);
RoundRect(r, 4).draw(HSV(30 + note.ch * 100, 1, 1).toColorF(note.alpha));
}
}
line.draw(Alpha(20));
}
}
Цитата: Имир от 16.10.2024, 16:56[spoiler title="Код с github"]
# include <Siv3D.hpp> struct Note { uint32 ch; uint32 noteNumber; int32 startMillisec; int32 lengthMillisec; double alpha; bool barPassed; bool onBar; }; void Main() { Window::Resize(1280, 720); Midi::Open(Dialog::GetOpenMidi().value()); const auto score = Midi::GetScore(); Array<Note> noteRects; uint32 minPitch = 127, maxPitch = 0; for (auto ch : step(static_cast<uint32>(score.size()))) { for (const auto& note : score[ch]) { noteRects.push_back({ ch, note.noteNumber, note.startMillisec, note.lengthMillisec, 1.0, false, false }); minPitch = Min(minPitch, note.noteNumber); maxPitch = Max(maxPitch, note.noteNumber); } } while (System::Update()) { const double scale = 0.2; const int32 offset = 160; const int32 offsetMillisec = static_cast<int32>(offset / scale); const RectF line(offset - 1, 0, 6, Window::Height()); const double blockHeight = static_cast<double>(Window::Height()) / (maxPitch - minPitch + 1); if (!Midi::IsPlaying()) { for (auto& note : noteRects) { note.alpha = 1.0; note.barPassed = false; note.onBar = false; } } if (Input::MouseL.clicked) { Midi::Play(); } const double pos = (Midi::GetPosSec() * 1000 - 100)* scale; const int32 bar = static_cast<int32>(Midi::GetPosSec() * 1000 - 100); const int32 left = bar - offsetMillisec; const int32 right = static_cast<int32>(left + Window::Width() / scale); Array<size_t> visibleNoteIndices; size_t index = 0; for (auto& note : noteRects) { if (right < note.startMillisec || (note.startMillisec + note.lengthMillisec) < left) { ++index; continue; } note.onBar = note.startMillisec <= bar && bar <= (note.startMillisec + note.lengthMillisec); note.barPassed = note.startMillisec <= bar; if (note.barPassed) { note.alpha *= note.onBar ? 0.98 : 0.85; } visibleNoteIndices.push_back(index++); } Graphics2D::SetBlendState(BlendState::Default); for (auto& i : visibleNoteIndices) { const auto& note = noteRects[i]; if (!note.barPassed) { const RectF r(note.startMillisec * scale + offset - pos, (maxPitch - note.noteNumber) * blockHeight, note.lengthMillisec * scale, blockHeight); RoundRect(r, 4).draw(ColorF(0.2, 0.25, 0.3)); } } Graphics2D::SetBlendState(BlendState::Additive); for (auto& i : visibleNoteIndices) { const auto& note = noteRects[i]; if (note.barPassed) { const RectF r(note.startMillisec * scale + offset - pos, (maxPitch - note.noteNumber) * blockHeight, note.lengthMillisec * scale, blockHeight); RoundRect(r, 5).drawShadow({ 0, 0 }, 12 + note.alpha * 8, 2 + note.alpha * 8, HSV(30 + note.ch * 100, 0.5, 1).toColorF(note.alpha*0.4)); } } for (auto& i : visibleNoteIndices) { const auto& note = noteRects[i]; if (note.barPassed) { const RectF r(note.startMillisec * scale + offset - pos, (maxPitch - note.noteNumber) * blockHeight, note.lengthMillisec * scale, blockHeight); RoundRect(r, 4).draw(HSV(30 + note.ch * 100, 1, 1).toColorF(note.alpha)); } } line.draw(Alpha(20)); } }
[/spoiler]
# include <Siv3D.hpp>
struct Note
{
uint32 ch;
uint32 noteNumber;
int32 startMillisec;
int32 lengthMillisec;
double alpha;
bool barPassed;
bool onBar;
};
void Main()
{
Window::Resize(1280, 720);
Midi::Open(Dialog::GetOpenMidi().value());
const auto score = Midi::GetScore();
Array<Note> noteRects;
uint32 minPitch = 127, maxPitch = 0;
for (auto ch : step(static_cast<uint32>(score.size())))
{
for (const auto& note : score[ch])
{
noteRects.push_back({ ch, note.noteNumber, note.startMillisec, note.lengthMillisec, 1.0, false, false });
minPitch = Min(minPitch, note.noteNumber);
maxPitch = Max(maxPitch, note.noteNumber);
}
}
while (System::Update())
{
const double scale = 0.2;
const int32 offset = 160;
const int32 offsetMillisec = static_cast<int32>(offset / scale);
const RectF line(offset - 1, 0, 6, Window::Height());
const double blockHeight = static_cast<double>(Window::Height()) / (maxPitch - minPitch + 1);
if (!Midi::IsPlaying())
{
for (auto& note : noteRects)
{
note.alpha = 1.0;
note.barPassed = false;
note.onBar = false;
}
}
if (Input::MouseL.clicked)
{
Midi::Play();
}
const double pos = (Midi::GetPosSec() * 1000 - 100)* scale;
const int32 bar = static_cast<int32>(Midi::GetPosSec() * 1000 - 100);
const int32 left = bar - offsetMillisec;
const int32 right = static_cast<int32>(left + Window::Width() / scale);
Array<size_t> visibleNoteIndices;
size_t index = 0;
for (auto& note : noteRects)
{
if (right < note.startMillisec || (note.startMillisec + note.lengthMillisec) < left)
{
++index;
continue;
}
note.onBar = note.startMillisec <= bar && bar <= (note.startMillisec + note.lengthMillisec);
note.barPassed = note.startMillisec <= bar;
if (note.barPassed)
{
note.alpha *= note.onBar ? 0.98 : 0.85;
}
visibleNoteIndices.push_back(index++);
}
Graphics2D::SetBlendState(BlendState::Default);
for (auto& i : visibleNoteIndices)
{
const auto& note = noteRects[i];
if (!note.barPassed)
{
const RectF r(note.startMillisec * scale + offset - pos, (maxPitch - note.noteNumber) * blockHeight, note.lengthMillisec * scale, blockHeight);
RoundRect(r, 4).draw(ColorF(0.2, 0.25, 0.3));
}
}
Graphics2D::SetBlendState(BlendState::Additive);
for (auto& i : visibleNoteIndices)
{
const auto& note = noteRects[i];
if (note.barPassed)
{
const RectF r(note.startMillisec * scale + offset - pos, (maxPitch - note.noteNumber) * blockHeight, note.lengthMillisec * scale, blockHeight);
RoundRect(r, 5).drawShadow({ 0, 0 }, 12 + note.alpha * 8, 2 + note.alpha * 8, HSV(30 + note.ch * 100, 0.5, 1).toColorF(note.alpha*0.4));
}
}
for (auto& i : visibleNoteIndices)
{
const auto& note = noteRects[i];
if (note.barPassed)
{
const RectF r(note.startMillisec * scale + offset - pos, (maxPitch - note.noteNumber) * blockHeight, note.lengthMillisec * scale, blockHeight);
RoundRect(r, 4).draw(HSV(30 + note.ch * 100, 1, 1).toColorF(note.alpha));
}
}
line.draw(Alpha(20));
}
}
Цитата: Имир от 29.10.2024, 10:42Вопрос решён. Оказалось, для успешной сборки нужен был старый Microsoft Visual Studio 2015 и Siv3D 2016.
Вопрос решён. Оказалось, для успешной сборки нужен был старый Microsoft Visual Studio 2015 и Siv3D 2016.
