Thema: Virtual Piano

Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#322

AW: Virtual Piano

  Alt 6. Dez 2013, 00:03
Zitat:
Du vergleichst oft auf True/False
Hab ich mittlerweile alles korrigiert

Zitat:
Wenn ich beim Klavier von einer Taste auf die nächste rutsche höre ich wohl einen Ton und das ist auch bei jedem
anderen Keyboard so.
(Wär doch zumindest ein nettes Feature. Wenn ich auf deinem Piano Violine spielen will geht das nicht anders)
Grüsse
Na ja lieber später als nie..

Habe das Feature nun addiert bzw.. wer sich noch dafür interessiert kann es nachträglich einfügen.
Delphi-Quellcode:
//uMain..
//.. globale Variablen
  currentNote: Integer;
  note: Integer;
  KeyHandle: HWND;
Delphi-Quellcode:
{$REGION 'WM_MOUSEMOVE'}
  WM_MOUSEMOVE:
  begin
    // Über Tastatur spielen ausgestellt?
    if not (CheckUseKey.GetCheckButtonStatus(CheckUseKey.Handle)) then
    begin
      // Kein Preset am spielen?
      if not PresetValue then
      begin
        case LoWord(wP) of
          // Noten bei gedrückter linker Maustaste spielen
          ID_KEY_ARRAY_FIRST..ID_KEY_ARRAY_LAST:
          begin
            if not (GetSystemMetrics(SM_SWAPBUTTON) <> 0) then
            begin
              // nicht umgeschaltet dann Linke Maustaste
              if (GetAsyncKeyState(VK_LBUTTON) and 32768 <> 0) then
              begin
                GetCursorPos(p);
                KeyHandle := WindowFromPoint(p);
                note := MAKELONG(GetDlgCtrlID(KeyHandle), 0) - ID_KEY_ARRAY_FIRST;

                if (note >= 0) and (note < 128) and (note <> CurrentNote) then
                begin
                  lastChordInDrag := integer(TChord(Chord));
                  StopNote(CurrentNote, lastChordInDrag);
                  CurrentNote := note;
                  StartNote(CurrentNote, lastChordInDrag);
                end;
              end;
            end;
          end;
        end;
      end;
    end;
  end;
{$ENDREGION}
{$REGION 'WM_LBUTTONDOWN'}
    WM_LBUTTONDOWN:
    begin
      if not (CheckUseKey.GetCheckButtonStatus(CheckUseKey.Handle)) then
      begin
        if not PresetValue then
        begin
          case LoWord(wP) of
            // Note mit der Maus spielen
            ID_KEY_ARRAY_FIRST..ID_KEY_ARRAY_LAST:
            begin
              // Keyboard eingeschaltet?
              if OnState then
              begin
                lastChordInDrag := integer(TChord(Chord));
                StartNote(((wp - ID_KEY_ARRAY_FIRST)), lastChordInDrag);
                currentNote := wp - ID_KEY_ARRAY_FIRST;
              end;
            end;
          end;
        end;
      end
      else
        SetFocus(WinHandle);

      // Instrumenten Bank Speichern/Weiterschalten
      case LoWord(wP) of
        ID_BANK_FIRST..ID_BANK_LAST:
        begin
          if GetKeyState(VK_SHIFT) and 32768 <> 0 then
          begin
            Banks[wP - (ID_BANK_FIRST - 1)].Value := InstIndex;
            tmpStr := Split(InstArrayList[InstIndex], ',');
            SKAERO_SetCTLText(SKAERO_GetMainItem(WinHandle, ID_INSTRUMENTLABEL),
              WideString(tmpStr[0]));

            SetController(32, 0, Channel);
            SetInstrument(Banks[wP - (ID_BANK_FIRST - 1)].Value, Channel);
            SKAERO_SetToolTipText(SKAERO_GetMainItem(WinHandle, wP),
              PWideChar(tmpStr[0]));
          end
          else
          begin
            if Banks[wP - (ID_BANK_FIRST - 1)].Value > -1 then
            begin
              tmpStr := Split(InstArrayList[Banks[wP - (ID_BANK_FIRST - 1)].Value], ',');
              SKAERO_SetCTLText(SKAERO_GetMainItem(WinHandle, ID_INSTRUMENTLABEL),
              WideString(tmpStr[0]));

              MidiTracker.CurrentInst[MidiTracker.CurrentTrack] := Banks[wP - (ID_BANK_FIRST - 1)].Value;
              Channel := MidiTracker.CurrentTrack;
              MidiTracker.ChangeInstrument(MidiTracker.CurrentInst[MidiTracker.CurrentTrack]);
            end;
          end;
        end;
      end;
    end;
{$ENDREGION}
{$REGION 'WM_LBUTTONUP'}
    WM_LBUTTONUP:
    begin
      if not (CheckUseKey.GetCheckButtonStatus(CheckUseKey.Handle) = True) then
      begin
        case LoWord(wP) of
          // zuletzt gespielte Note mit der Maus stoppen
          ID_KEY_ARRAY_FIRST..ID_KEY_ARRAY_LAST:
          begin
            if OnState then
            begin
              lastChordInDrag := integer(TChord(Chord));
              StopNote(CurrentNote, lastChordInDrag);
              SKAERO_SetZorder(SKAERO_GetMainItem(WinHandle, wP+1), HWND_TOP);
            end;
          end;
        end;
      end else
      begin
        Result := SendMessage(WinHandle, WM_COMMAND, wP, lP);
        exit;
      end;
    end;
{$ENDREGION}
gruss

Geändert von EWeiss (18. Dez 2013 um 08:56 Uhr)
  Mit Zitat antworten Zitat