profile
viewpoint
If you are wondering where the data of this site comes from, please visit https://api.github.com/users/cgibbard/events. GitMemory does not store any data, but only uses NGINX to cache data for a period of time. The idea behind GitMemory is simply to give users a better reading experience.

reflex-frp/reflex 938

Interactive programs without callbacks or side-effects. Functional Reactive Programming (FRP) uses composable events and time-varying values to describe interactive systems as pure functions. Just like other pure functional code, functional reactive code is easier to get right on the first try, maintain, and reuse.

reflex-frp/reflex-dom 319

Web applications without callbacks or side-effects. Reflex-DOM brings the power of functional reactive programming (FRP) to the web. Build HTML and other Document Object Model (DOM) data with a pure functional interface.

obsidiansystems/vessel 15

Functor-parametric containers

cgibbard/dependent-map 0

Dependently-typed finite maps (partial dependent products)

cgibbard/dependent-sum 0

Dependent sums and supporting typeclasses for comparing and displaying them

Pull request review commentvsicurella/TerpstraSysEx.2014

Rework isomorphic mass assign.

 juce::Colour MappingLogicBase::indexToColour(int inx) const 
 void MappingLogicBase::indexToTerpstraKey(int inx, TerpstraKey& keyData) const
 {
+    keyData.keyType = LumatoneKeyType::noteOnNoteOff;

I was getting a bunch of disabled keys without this, but I'm not sure whether this is the correct place to set it (I didn't yet look into what else calls this method.)

cgibbard

comment created time in 13 days

PullRequestReviewEvent

Pull request review commentvsicurella/TerpstraSysEx.2014

Rework isomorphic mass assign.

   </MAINGROUP>
   <EXPORTFORMATS>
     <LINUX_MAKE targetFolder="Builds/Linux" smallIcon="fwSyLL" bigIcon="yjLw0u"
-                linuxExtraPkgConfig="libssh2" extraDefs="HAVE_ARPA_INET_H=1 HAVE_UNISTD_H=1 HAVE_POLL_H=1 SERVERHOST1=&quot;192.168.6.2&quot; SERVERHOST2=&quot;192.168.7.2&quot;">
+                linuxExtraPkgConfig="libssh2" extraDefs="HAVE_ARPA_INET_H=1 HAVE_UNISTD_H=1 HAVE_POLL_H=1 SERVERHOST1=&quot;192.168.6.2&quot; SERVERHOST2=&quot;192.168.7.2&quot; JUCE_MODAL_LOOPS_PERMITTED=1">

Oh, I also toggled on this build flag, because it seems to be required to use the file chooser with the latest versions of JUCE.

cgibbard

comment created time in 13 days

PullRequestReviewEvent

issue commenthsstraub/TerpstraSysEx.2014

Build instructions

It worked! Also, I had the motivation to rework the isomorphic mass assign feature today: see https://github.com/vsicurella/TerpstraSysEx.2014/pull/1

hsstraub

comment created time in 13 days

PR opened vsicurella/TerpstraSysEx.2014

Rework isomorphic mass assign.

It should always assign all keys now, and handles out-of-range values by wrapping. I was getting tired of manually editing the channels and subtracting 1 or 2 from them mod 16 in a separate program.

Another change I think should happen, but I haven't done yet, is that I always open the colour assignment and rotate it one notch, since the default assignment is very Lydian-focused in a way which is kind of confusing. So, a better default would just be to start the white keys a fifth/generator down from 0.

+58 -234

0 comment

5 changed files

pr created time in 13 days

push eventcgibbard/TerpstraSysEx.2014

Cale Gibbard

commit sha fadfae8f21f1e69ea6e639526c95bf8e226c4c64

Rework isomorphic mass assign. It should always assign all keys now, and handles out-of-range values by wrapping.

view details

push time in 13 days

fork cgibbard/TerpstraSysEx.2014

Parametrization tool for the Lumatone keyboard (AKA Terpstra keyboard, second generation)

fork in 13 days

issue commenthsstraub/TerpstraSysEx.2014

Build instructions

Ah, thanks! I'll give it a shot!

hsstraub

comment created time in 13 days

issue commenthsstraub/TerpstraSysEx.2014

Build instructions

I was able to get the latest version compiling on Linux, after setting the paths in Projucer to the location to a JUCE 6.1.0 modules directory, and adding JUCE_MODAL_LOOPS_PERMITTED=1 to the linuxExtraPkgConfig, but while the thing runs and mostly works, it's kind of broken when it comes to actually interacting with my Lumatone (firmware 1.2). I can put it in Live mode and the key definitions get updated, but the LED colours don't change for some reason. Importing from Lumatone also doesn't work, just gives me a blank layout, though it does appear to set the curves.

I'll look into figuring out what it's actually sending, but if you have any ideas for what might be going wrong, that would be quite helpful. I can use the Windows version of the Lumatone setup tool under Wine, and the functionality works, but the UI is a bit sluggish, and it would be nice to have a Linux build working again. (The previous version before the 1.2 firmware update worked fine.)

hsstraub

comment created time in 16 days

pull request commentsurge-synthesizer/surge

WIP: Basic support for octave-per-channel mode

Yeah, and then under the Tuning menu, make sure it's set to "Apply Tuning at MIDI Input" and "Use MIDI Channel for Octave Shift"

cgibbard

comment created time in 17 days

pull request commentsurge-synthesizer/surge

WIP: Basic support for octave-per-channel mode

Also, it does work as you describe. I have a Lumatone and have layouts set up for PianoTeq as well ;)

cgibbard

comment created time in 17 days

issue commentreflex-frp/reflex-platform

How to setup development environment to hack reflex and reflex-dom (without using haskell-language-server)

  1. Whoa! What change to the ecosystem are you contemplating that involves hacking on all of those packages at the same time?! I would recommend focusing in on one thing at a time, and working your way through, you'll have a better time with rebuilds. If you're not actually hacking on any one of them, it's better not to hack-on the package, and just allow nix to get it and the things that depend on it from its cache.
  2. If I go to the documentation for reflex-dom-core and find mainWidget (which could probably use a comment along with the rest of the stuff in Reflex.Dom.Main), its type is documented as:
mainWidget :: (forall x. Widget x ()) -> JSM () 

where, clicking on Widget tells us that it's defined as:

type Widget x = ImmediateDomBuilderT DomTimeline (DomCoreWidget x)
type DomCoreWidget x = PostBuildT DomTimeline (WithJSContextSingleton x (PerformEventT DomTimeline DomHost)) 

Generally, you are not supposed to care which specific monad this is, but you may end up caring that it is instances of the various classes that these monad transformers individually contribute. DomBuilder, PostBuild, and then all of the stuff provided by PerformEventT... note that despite the name, it is not a monad transformer, and ends up providing a lot of basic instances.

The reason is that we do quite a lot of switching that monad out in order to provide different functionality. If you're compiling to Javascript and running the program in a web browser, that's going to look different from the monad that is used to provide a static HTML render of the initial state of the page during hydration.

Obelisk does a somewhat better job of conveying this, its Frontend record type that you fill out when defining your app looks like:

data Frontend route = Frontend
  { _frontend_head :: !(forall js t m. ObeliskWidget js t route m => RoutedT t route m ())
  , _frontend_body :: !(forall js t m. ObeliskWidget js t route m => RoutedT t route m ())
  }

It's just higher rank, so you don't get to know precisely what m is, but what's this ObeliskWidget js t route m constraint? Well, it's a comprehensive list of the things you might care will be provided when you go to write a widget:

type ObeliskWidget js t route m =
  ( DomBuilder t m
  , MonadFix m
  , MonadHold t m
  , MonadSample t (Performable m)
  , MonadReflexCreateTrigger t m
  , PostBuild t m
  , PerformEvent t m
  , TriggerEvent t m
  , HasDocument m
  , MonadRef m
  , Ref m ~ Ref IO
  , MonadRef (Performable m)
  , Ref (Performable m) ~ Ref IO
  , MonadFix (Performable m)
  , PrimMonad m
  , Prerender js t m
  , PrebuildAgnostic t route m
  , PrebuildAgnostic t route (Client m)
  , HasConfigs m
  , HasCookies m
  , MonadIO (Performable m)
  )

If that looks daunting... well, it is slightly daunting to try to think about all of it at once, but each of those is a fairly sensible bit of functionality.

For example, DomBuilder is the thing that defines the primitives that let us add and control DOM nodes. You'll notice that all the widgets that put stuff in the DOM are constrained by it.

MonadHold is a class for monads that can create new Behaviors based on Events, by remembering (or holding on to) the previous values the Event fired with.

It's probably not the most natural way forward to enumerate all this, but rather perhaps to start with some widget that you're interested in, and working backward from that to which operations are involved in its definition.

srghma

comment created time in 21 days

pull request commentghc-proposals/ghc-proposals

Lambda expressions with guards and multiple clauses (was: `\ of`, -XMultiWayLambda)

People from outside the community have the (incorrect) impression that language extensions mean that Haskell is in fact several incompatible languages.

When the truth of the matter is that it's one, increasingly complicated language.

JakobBruenker

comment created time in a month

create barnchcgibbard/midifilter.lv2

branch : freqdelay

created branch time in a month

issue commentobsidiansystems/obelisk

Is Nix a requirement?

Obelisk is mostly an easy to use wrapper around a bunch of Nix scripts, so it's hard to imagine what this would mean. You can use all the underlying Haskell libraries, like reflex and reflex-dom on their own, though Obelisk is a very convenient way to get started.

Note that you don't need to use NixOS to install the Nix package manager and use its build system.

chespinoza

comment created time in a month

push eventcgibbard/surge

Cale Gibbard

commit sha 880b4b55f540bba9fbb616aaf5dc1d8fb374109a

Fix a bug in mapChannelToOctave mode where channel 3 was being sent to scene B when scene A was active

view details

push time in a month

push eventcgibbard/surge

Matthias von Faber

commit sha 2baa445f1087088b9115b9b77535a61a18c7f2cd

Windows/MSVC: Specify UTF-8 encoding (fixes build on CJK systems) Surge and 3rd-party sources are de facto UTF-8. However, MSVC defaults to the build machine's codepage, which is never UTF-8, unless the user opted into the Beta. Nobody does, because it breaks some apps. On CJK systems, the encoding mismatch caused warning C4819 in various places, breaking the build: Chinese: JUCE, Surge Japanese: JUCE Korean: JUCE, MTS-ESP, Surge, stmlib This change sets source and execution charset to UTF-8, fixing the build and avoiding possible runtime surprises due to encoding of literals. It also enables charset validation, i.e. MSVC will now warn on invalid UTF-8. This happens with VST2, which has ISO-8859-1 copyright (c) symbols in its headers. So we also silence C4828, but only when VST2 is present.

view details

Paul

commit sha 7a977aea5aaf3e2e36f6e5c340b4fd5560d2ed57

Accessibility Hierarchy Complete (#4807) With this chage all the acc components have a name and are in a reasonable navigation hierarcy, even though some still don't allow editing via access Addresses #4616

view details

Matthias von Faber

commit sha 825f089b947236f677630558d3c088965a0e3068

*NIX: Fix install-resources-local with Ninja generator For some reason this target was not being generated in Ninja builds. Workaround: Expand $HOME at configuration time

view details

Matthias von Faber

commit sha eb477226d264784eaf45ac304247a2b80cc99603

PatchSelector: Draw patch name as UTF-8 juce::Graphics::drawText() takes a juce::String. Implicit conversion from char* assumes the data is ASCII, while the one from std::string assumes it's UTF-8. So use the latter to preserve the encoding.

view details

Paul

commit sha 049dd115a2b6f3371d8851336acf3c0a15e8d377

Accessible Improvements to Slider, MultiSwitch, more (#4811) 1; MultiSwitch is actually a radio group in acc view now 2: Slider, MultiSwitch, and more show natural values for the value 3: Start on EffectChooser but needs more work 4: FX and OSC menus get controls 5: number field, wave shaper, etc Addresses #4616

view details

Paul

commit sha 11b00cdb43a94a722f61efbb75237cd5a7438d47

Fix a minuor acc bug (#4812) I was over-populating the artificial accesibility radio buttons in the multiswitcht

view details

cgibbard

commit sha 05e954a1dfba689cbb5379dca815e2558ec5e2c4

Basic support for channel-per-octave mode, while modulation is applied at MIDI input, and with no special treatment for scene masking yet. (#4805) Implement a 12 key shift per midi channel Closes https://github.com/surge-synthesizer/surge/issues/4151

view details

Cale Gibbard

commit sha cca2974e2f1b1bdd0a45d6bd378c67ae362a7fe2

Fix a bug in mapChannelToOctave mode where channel 3 was being sent to scene B when scene A was active

view details

push time in a month

push eventcgibbard/surge

Cale Gibbard

commit sha 5d41a02e7d039041306c8dd2ac8c6a514c7a950f

Fix a bug in mapChannelToOctave mode where channel 3 was being sent to scene B when scene A was active

view details

push time in a month

push eventcgibbard/surge

Cale Gibbard

commit sha a17d8b2331680d1c484375e58285a6bf068d01fb

Basic support for channel-per-octave mode, while modulation is applied at MIDI input, and with no special treatment for scene masking yet.

view details

push time in a month

push eventcgibbard/surge

push time in a month

push eventcgibbard/surge

Cale Gibbard

commit sha dbac16a348265314211179c5a226e18a60d68eee

Try adding /arch:SSE2 flag on Windows to see if that has any effect on the test result.

view details

push time in a month

pull request commentsurge-synthesizer/surge

WIP: Basic support for channel-per-octave mode

Followed along with the instructions and force pushed. At first I thought I was going to be wholesale moving the field from SurgeStorage to the DAWExtraStateStorage, but then steps 2 and 3 wouldn't have made sense, so hopefully I got the interpretation right. Feels a little strange to have the state in two places now, but seems to roughly work at least.

Also, we still have the kind of odd Windows-only numerical issue it seems. I wonder if there's something different about how the floating point code is compiled on Windows. If this has something to do with the second scene not producing audio, shouldn't it also fail the same way on Linux and Mac?

I wonder what would be involved in making this work with tuning after modulation mode. It feels like if we don't fix its behaviour, we should at least disable that mode in the GUI when this is turned on. Presently, this has some effect on tuning after modulation, but whatever it's doing doesn't seem correct.

Perhaps we ought to visually represent the Chan Split mode being disabled as well, when this is turned on, but I'm not sure if the future plans for MIDI modes will render it a bit moot.

cgibbard

comment created time in a month

push eventcgibbard/surge

Cale Gibbard

commit sha 0f5023955560d46acd98b1ce235f0f2b59a8f13f

Basic support for channel-per-octave mode, while modulation is applied at MIDI input, and with no special treatment for scene masking yet.

view details

push time in a month

pull request commentsurge-synthesizer/surge

WIP: Basic support for channel-per-octave mode

Ah, that makes sense, and agrees with what would probably be convenient for me, since this sort of expresses how my keyboard/DAW is communicating with Surge more than it expresses something about a particular patch. I'd rather not have to toggle it every time I loaded a new patch anyway. I'll give it a shot at some point today.

cgibbard

comment created time in a month

pull request commentsurge-synthesizer/surge

WIP: Basic support for channel-per-octave mode

Nice, got some kind of numerical floating point issue with the tests only on Windows... I could try to restrict the range on that one a bit further I suppose, but it seems a bit suspicious.

cgibbard

comment created time in a month

push eventcgibbard/surge

Cale Gibbard

commit sha 509da72377476299a685826008c598682c48728b

Basic support for channel-per-octave mode, while modulation is applied at MIDI input, and with no special treatment for scene masking yet.

view details

push time in a month

PR opened surge-synthesizer/surge

WIP: Basic support for channel-per-octave mode

See "Use MIDI Channel for Octave Shift" on the Tuning menu.

Only works correctly so far when tuning is applied at MIDI input, and has no special treatment for scene masking yet.

+107 -5

0 comment

7 changed files

pr created time in a month