Repository: stufreen/web-drum-sequencer Branch: master Commit: 84446c7aa128 Files: 199 Total size: 381.2 KB Directory structure: gitextract_4_fwl4lt/ ├── .circleci/ │ └── config.yml ├── .eslintignore ├── .eslintrc ├── .gitignore ├── .prettierrc ├── CNAME ├── README.md ├── __mocks__/ │ ├── fileMock.js │ └── styleMock.js ├── babel.config.js ├── index.html ├── manifest.json ├── package.json ├── public/ │ ├── assets/ │ │ └── icons/ │ │ └── browserconfig.xml │ └── sw.js ├── src/ │ ├── __mocks__/ │ │ └── samples.config.js │ ├── assets/ │ │ └── js/ │ │ ├── webaudio-controls.js │ │ └── webcomponents-lite.js │ ├── common/ │ │ ├── channels/ │ │ │ ├── channels.actions.js │ │ │ ├── channels.constants.js │ │ │ ├── channels.reducer.js │ │ │ ├── channels.reducer.test.js │ │ │ ├── channels.selectors.js │ │ │ └── index.js │ │ ├── index.js │ │ ├── master/ │ │ │ ├── index.js │ │ │ ├── master.actions.js │ │ │ ├── master.constants.js │ │ │ ├── master.reducer.js │ │ │ ├── master.reducer.test.js │ │ │ └── master.selectors.js │ │ ├── notes/ │ │ │ ├── index.js │ │ │ ├── notes.actions.js │ │ │ ├── notes.constants.js │ │ │ ├── notes.reducer.js │ │ │ ├── notes.reducer.test.js │ │ │ └── notes.selectors.js │ │ ├── playbackSession/ │ │ │ ├── index.js │ │ │ ├── playbackSession.actions.js │ │ │ ├── playbackSession.constants.js │ │ │ ├── playbackSession.reducer.js │ │ │ ├── playbackSession.reducer.test.js │ │ │ └── playbackSession.selectors.js │ │ ├── presets/ │ │ │ ├── index.js │ │ │ ├── presets.actions.js │ │ │ ├── presets.constants.js │ │ │ ├── presets.reducer.js │ │ │ ├── presets.reducer.test.js │ │ │ └── presets.selectors.js │ │ ├── tempo/ │ │ │ ├── index.js │ │ │ ├── tempo.actions.js │ │ │ ├── tempo.constants.js │ │ │ ├── tempo.reducer.js │ │ │ ├── tempo.reducer.test.js │ │ │ └── tempo.selectors.js │ │ ├── userSamples/ │ │ │ ├── index.js │ │ │ ├── userSamples.actions.js │ │ │ ├── userSamples.constants.js │ │ │ ├── userSamples.reducer.js │ │ │ └── userSamples.selectors.js │ │ └── window/ │ │ ├── index.js │ │ ├── window.actions.js │ │ ├── window.constants.js │ │ ├── window.reducer.js │ │ ├── window.reducer.test.js │ │ └── window.selectors.js │ ├── components/ │ │ ├── AddChannelButton/ │ │ │ ├── AddChannelButton.component.jsx │ │ │ ├── AddChannelButton.container.js │ │ │ └── index.js │ │ ├── App.jsx │ │ ├── BPMInput/ │ │ │ ├── BPMInput.component.jsx │ │ │ ├── BPMInput.container.js │ │ │ ├── BPMInput.selectors.js │ │ │ └── index.js │ │ ├── Branding.jsx │ │ ├── Channel/ │ │ │ ├── Channel.component.jsx │ │ │ ├── Channel.container.js │ │ │ ├── Channel.selectors.js │ │ │ ├── HitButton.component.jsx │ │ │ ├── RemoveButton.component.jsx │ │ │ └── index.js │ │ ├── ChannelControls/ │ │ │ ├── ChannelControls.component.jsx │ │ │ ├── ChannelControls.container.js │ │ │ ├── ChannelControls.selectors.js │ │ │ └── index.js │ │ ├── ChannelHeader/ │ │ │ ├── ChannelHeader.component.jsx │ │ │ ├── ChannelHeaderLabel.component.jsx │ │ │ └── index.js │ │ ├── ChannelList/ │ │ │ ├── ChannelList.component.jsx │ │ │ ├── ChannelList.container.js │ │ │ ├── ChannelList.selectors.js │ │ │ └── index.js │ │ ├── FancyButton.component.jsx │ │ ├── FlashMessage/ │ │ │ ├── FlashMessage.component.jsx │ │ │ ├── FlashMessage.container.js │ │ │ ├── FlashMessage.selectors.js │ │ │ └── index.js │ │ ├── GithubLink.component.jsx │ │ ├── InfoKnob.component.jsx │ │ ├── InstallButton.jsx │ │ ├── Knob.component.jsx │ │ ├── LabelBox.jsx │ │ ├── Logo.component.jsx │ │ ├── Marker/ │ │ │ ├── Marker.component.jsx │ │ │ ├── Marker.container.js │ │ │ ├── Marker.selectors.js │ │ │ └── index.js │ │ ├── MasterControls/ │ │ │ ├── MasterControls.component.jsx │ │ │ └── index.js │ │ ├── Modal.component.jsx │ │ ├── MuteSolo/ │ │ │ ├── MuteSolo.component.jsx │ │ │ ├── MuteSolo.container.js │ │ │ └── index.js │ │ ├── PatternSelector/ │ │ │ ├── PatternSelector.component.jsx │ │ │ ├── PatternSelector.container.js │ │ │ ├── PatternSelector.selectors.js │ │ │ └── index.js │ │ ├── PlayButton/ │ │ │ ├── PlayButton.component.jsx │ │ │ ├── PlayButton.container.js │ │ │ ├── PlayButton.selectors.js │ │ │ └── index.js │ │ ├── PresetDeleted.component.jsx │ │ ├── PresetSaved.component.jsx │ │ ├── PresetSelector/ │ │ │ ├── PresetSelector.component.jsx │ │ │ ├── PresetSelector.container.js │ │ │ ├── PresetSelector.selectors.js │ │ │ └── index.js │ │ ├── SampleLoadError.component.jsx │ │ ├── SampleSelect/ │ │ │ ├── SampleSelect.component.jsx │ │ │ ├── SampleSelect.container.js │ │ │ ├── SampleSelect.selectors.js │ │ │ └── index.js │ │ ├── SavePresetModal/ │ │ │ ├── SavePresetModal.component.jsx │ │ │ ├── SavePresetModal.container.js │ │ │ ├── SavePresetModal.selectors.js │ │ │ └── index.js │ │ ├── SwingControl/ │ │ │ ├── SwingControl.component.jsx │ │ │ ├── SwingControl.container.js │ │ │ ├── SwingControl.selectors.js │ │ │ └── index.js │ │ ├── Toggles/ │ │ │ ├── Toggle.component.jsx │ │ │ ├── ToggleGroup.component.jsx │ │ │ ├── Toggles.component.jsx │ │ │ ├── Toggles.container.js │ │ │ ├── Toggles.selectors.js │ │ │ └── index.js │ │ ├── VolumeMeter.component.jsx │ │ ├── design-system/ │ │ │ ├── Box.js │ │ │ ├── Button.js │ │ │ ├── ControlLabel.js │ │ │ ├── Form.js │ │ │ ├── Heading.js │ │ │ ├── HoverButton.js │ │ │ ├── HoverLink.js │ │ │ ├── Image.js │ │ │ ├── Label.js │ │ │ ├── Line.js │ │ │ ├── Text.js │ │ │ ├── TextInput.js │ │ │ └── index.js │ │ ├── index.js │ │ └── timedCallback.hoc.jsx │ ├── index.html │ ├── index.jsx │ ├── presets/ │ │ ├── 707.js │ │ ├── 808.js │ │ ├── __mocks__/ │ │ │ └── index.js │ │ ├── ace.js │ │ ├── empty.js │ │ ├── hip-hop.js │ │ ├── index.js │ │ └── ldrum.js │ ├── reducer.js │ ├── samples.config.js │ ├── services/ │ │ ├── __mocks__/ │ │ │ ├── audioContext.js │ │ │ ├── audioRouter.js │ │ │ └── featureChecks.js │ │ ├── animations.js │ │ ├── audioAnalyzer.js │ │ ├── audioContext.js │ │ ├── audioContext.test.js │ │ ├── audioEngine.config.js │ │ ├── audioLoop.js │ │ ├── audioRouter.js │ │ ├── audioScheduler.js │ │ ├── audioScheduler.test.js │ │ ├── database.js │ │ ├── featureChecks.js │ │ ├── fileUtils.js │ │ ├── pwaInstall.js │ │ ├── reverb.js │ │ ├── sampleStore.js │ │ ├── swing.js │ │ ├── unmute.js │ │ └── uuid.js │ ├── store.js │ └── styles/ │ ├── globalStyles.js │ └── theme.js └── vite.config.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .circleci/config.yml ================================================ # Javascript Node CircleCI 2.0 configuration file # # Check https://circleci.com/docs/2.0/language-javascript/ for more details # version: 2 jobs: build: docker: # specify the version you desire here - image: cimg/node:16.13.2 # Specify service dependencies here if necessary # CircleCI maintains a library of pre-built images # documented at https://circleci.com/docs/2.0/circleci-images/ # - image: circleci/mongo:3.4.4 working_directory: ~/repo steps: - checkout # Download and cache dependencies - restore_cache: keys: - v1-dependencies-{{ checksum "package.json" }} # fallback to using the latest cache if no exact match is found - v1-dependencies- - run: npm install - run: npm run build - persist_to_workspace: root: ~/repo paths: - dist - save_cache: paths: - node_modules key: v1-dependencies-{{ checksum "package.json" }} test: docker: - image: cimg/node:16.13.2 working_directory: ~/repo steps: - checkout # Download and cache dependencies - restore_cache: keys: - v1-dependencies-{{ checksum "package.json" }} # fallback to using the latest cache if no exact match is found - v1-dependencies- - run: npm install - run: name: Test command: npm run test - run: name: Lint command: npm run lint # run tests! #- run: yarn test deploy: docker: - image: circleci/python:2.7-jessie working_directory: ~/repo steps: - attach_workspace: # Must be absolute path or relative path from working_directory at: ~/repo - run: name: Install awscli command: sudo pip install awscli - run: name: Deploy to S3 command: aws s3 sync --acl public-read ~/repo/dist s3://wds-1.com/ --delete workflows: version: 2 build-deploy: jobs: - build - test: requires: - build - deploy: requires: - test filters: branches: only: master ================================================ FILE: .eslintignore ================================================ src/assets/**/*.js ================================================ FILE: .eslintrc ================================================ { "extends": ["eslint:recommended", "plugin:react/recommended"], "env": { "browser": true, "jest": true, "es6": true }, "rules": { "import/prefer-default-export": 0, "global-require": 0, "jsx-a11y/label-has-for": [0], "jsx-a11y/label-has-associated-control": [0], "default-param-last": 0, "implicit-arrow-linebreak": 0 }, "parser": "@babel/eslint-parser" } ================================================ FILE: .gitignore ================================================ node_modules .vscode .DS_Store dist/* ================================================ FILE: .prettierrc ================================================ { "trailingComma": "all", "singleQuote": true } ================================================ FILE: CNAME ================================================ wds-1.com ================================================ FILE: README.md ================================================ # Web Drum Sequencer A browser-based drum machine and sequencer built with the Web Audio API, React, and Redux. ## Demo https://wds-1.com ## Features * Swap drum samples * Choose drum samples from file * Pattern selector to save up to 8 patterns per drum kit * BPM and swing control * Sample hit buttons * Gain and pan * Reverb * Mute and solo * Pitch shift * Preset system for saving and loading drum kits * Works offline with service worker and caching * Installable as PWA * Drag to reorder channels ## Circle CI status [](https://circleci.com/gh/stufreen/web-drum-sequencer) ## Installation To run a local development server: ``` npm install npm run start ``` To build a production version: `npm run build` ## Tests ``` npm run test ``` ## Thank You * [React-Select](https://github.com/JedWatson/react-select) * [Webaudio-Controls](https://github.com/g200kg/webaudio-controls) * Chris Wilson's article [here](https://www.html5rocks.com/en/tutorials/audio/scheduling/) * [Voxengo impluse response](https://www.voxengo.com/impulses/) * [Jost* typeface](https://github.com/indestructible-type/Jost) * [Draggable](https://shopify.github.io/draggable/) ================================================ FILE: __mocks__/fileMock.js ================================================ module.exports = 'test-file-stub'; ================================================ FILE: __mocks__/styleMock.js ================================================ module.exports = {}; ================================================ FILE: babel.config.js ================================================ const presets = [ [ "@babel/env", { targets: "> 0.25%, not dead", useBuiltIns: "usage", }, ], "@babel/preset-react", ]; module.exports = { presets }; ================================================ FILE: index.html ================================================