Function PlayNote%(nVoice%,nNote%,nTempo%,nDuration%,nMode%,nDot%)
  Static fbaseFreq(12)
  Static fMode!(3)

  '
  ' Initialize arrays first time through
  '
  If fbaseFreq(0) < 1 Then
    fbaseFreq(0) = 65.41
    fbaseFreq(1) = 69.3
    fbaseFreq(2) = 73.42
    fbaseFreq(3) = 77.78
    fbaseFreq(4) = 82.41
    fbaseFreq(5) = 87.31
    fbaseFreq(6) = 92.5
    fbaseFreq(7) = 98#
    fbaseFreq(8) = 103.83
    fbaseFreq(9) = 110#
    fbaseFreq(10) = 116.54
    fbaseFreq(11) = 123.47

    fMode(S_STACCATO) = .75
    fMode(S_NORMAL) = .875
    fMode(S_LEGATO) = 1#
  End If

  '
  ' Check input values for validity
  '
  If nTempo% < 32 Or nTempo% > 255 Then
    PlayNote% = S_SERDTP
    Exit Function
  End If

  If nNote% < 0 Or nNote% > 84 Then
    PlayNote% = S_SERBDNT
    Exit Function
  End If

  If nDuration% < 0 Or nDuration% > 255 Then
    PlayNote% = S_SERDLN
    Exit Function
  End If

  If nMode% < 0 Or nMode% > 2 Then
    PlayNote% = S_SERDMD
    Exit Function
  End If

  '
  ' Calcualte note duration parameters
  '
  If nDot% Then dt# = (3# ^ nDot%) / (2# ^ nDot%) Else dt# = 1#
  nTicks% = 80000 / nTempo% / nDuration% * fMode(nMode%) * dt#

  '
  ' Calculate frequency and play note
  '
  If nNote% = 0 Then
    lFreq& = &H7F000000
  Else
    lFreq& = fbaseFreq(nNote% Mod 12) * (2^(nNote%\12))*65535
  End If

  status% = SetVoiceSound(nVoice%, lFreq&, nTicks%)

  If status% <> 0 Then
     PlayNote% = status%
     Exit Function
  End If

  '
  ' If not legato, then play a rest to fill out note length
  '
  If nMode% <> S_LEGATO Then
     nTicks% = 80000/nTempo%/nDuration%*(1#-fMode(nMode%))*dt#
     PlayNote% = SetVoiceSound(nVoice%, &H7F000000, nTicks%)
  End If
End Function
