By default StandardFirmata initializes all digital pins to output. Digital pin changes are reported on each iteration of the main loop in StandardFirmata. Pin changes are reported only if reporting is enabled for the port that pin belongs to. So to read a digital pin, you need to perform the following steps:
In firmata port #s start from 0 and pins are allocated to ports in order, so D0-D7 = port 0, D8-15 = port 1, etc.
Regarding which Firmata/midi commands to send and receive, refer to the documentation here: https://github.com/firmata/protocol/blob/master/protocol.md. Specifically see set pin mode (0xF4), report digital port (0xDN where N is the port number) and digital I/O message (0x9N where N is the port number).
sendDigitalPort(byte portNumber, int portData); //send an 8-bit port in a single digital message
session = new ArduinoSession(connection);
session.SetDigitalPinMode(2, PinMode.InputPullup);
session.SetDigitalReportMode(0, true);
session.DigitalStateReceived += Session_OnDigitalStateReceived;
...
private void Session_OnDigitalStateReceived(object sender, FirmataEventArgs<DigitalPortState> eventArgs)
{
var isSet = eventArgs.Value.IsSet(2);
Console.WriteLine($"Message is for port {eventArgs.Value.Port}. Pin2 value= {isSet}");
session.SetDigitalPin(10, isSet);
}