-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathDisplayKeyVolumeEnvelope.cpp
66 lines (56 loc) · 2.08 KB
/
DisplayKeyVolumeEnvelope.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/*
MINI VIRTUAL ANALOG SYNTHESIZER
Copyright 2014 Kenneth D. Miller III
Per-Key Volume Envelope Display
*/
#include "StdAfx.h"
#include "DisplayKeyVolumeEnvelope.h"
#include "DisplaySpectrumAnalyzer.h"
#include "Math.h"
#include "Console.h"
#include "Keys.h"
#include "Voice.h"
#include "Amplifier.h"
static COORD const key_pos = { 12, SPECTRUM_HEIGHT };
static COORD const voice_pos = { WINDOW_WIDTH - 7 - VOICES, WINDOW_HEIGHT - 1 };
// attribute associated with each envelope state
static WORD const env_attrib[EnvelopeState::COUNT] =
{
FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED, // EnvelopeState::OFF
BACKGROUND_GREEN | BACKGROUND_INTENSITY, // EnvelopeState::ATTACK,
BACKGROUND_RED | BACKGROUND_INTENSITY, // EnvelopeState::DECAY,
BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED, // EnvelopeState::SUSTAIN,
BACKGROUND_INTENSITY, // EnvelopeState::RELEASE,
};
void DisplayKeyVolumeEnvelope::Init(HANDLE hOut)
{
// show the note keys
DWORD written;
WriteConsoleOutputCharacterW(hOut, LPCWSTR(keys), KEYS, key_pos, &written);
FillConsoleOutputAttribute(hOut, env_attrib[EnvelopeState::OFF], KEYS, key_pos, &written);
// voice indicators
CHAR voice[VOICES];
memset(voice, 7, VOICES);
WriteConsoleOutputCharacter(hOut, voice, VOICES, voice_pos, &written);
}
void DisplayKeyVolumeEnvelope::Update(HANDLE hOut)
{
WORD note_env_attrib[SPECTRUM_WIDTH];
WORD voice_env_attrib[VOICES];
memset(note_env_attrib, env_attrib[EnvelopeState::OFF], sizeof(note_env_attrib));
for (int v = 0; v < VOICES; ++v)
{
EnvelopeState::State const state = amp_env_state[v].state;
WORD const attrib = env_attrib[state];
if (state != EnvelopeState::OFF)
{
int const x = key_pos.X - keyboard_octave * 12 + voice_note[v];
if (x >= 0 && x < SPECTRUM_WIDTH)
note_env_attrib[x] = attrib;
}
voice_env_attrib[v] = attrib;
}
DWORD written;
WriteConsoleOutputAttribute(hOut, note_env_attrib, SPECTRUM_WIDTH, { 0, key_pos.Y }, &written);
WriteConsoleOutputAttribute(hOut, voice_env_attrib, VOICES, voice_pos, &written);
}